DAY 7

今日得分:0+7+10(惨)

T1

题目大意:给你一个平面直角坐标系,初始位置在(0,0),该点权值为1,每次顺时针找到第一个整点,该位置的权值为上一个点的权值+1,多组询问,每次询问在第一象限内的一个矩阵中所有整点位置的权值之和对2^63取模。坐标<=1e18,q<=1e6。

题解:

DAY 7_第1张图片

对于"-|",容易发现每一个"-|"的和是(2i+1)^3+(2i+1)^2+(i+1)(考虑每一个平方项i^2都是i个数的平均值,只需考虑最下面一行即可)。对于"|",我们可以先求出最底下一行的和,再通过减去一个等差数列得到答案,最底下一行的和可以通过刚才的式子得到,也可以观察发现两个数的差分是一个等差数列,直接推式子即可。对于"-"同理。

(发现一个奇妙的事情:对于只有第1项为1其余项为0的数列,它n次前缀和得到的数组的第i项为C(n+i-2,n-1),这个性质很好。)

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline long long re_ad()
{
	long long x=0;char ch=getchar();
	while(ch>'9'||ch<'0'){ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+(ch^48),ch=getchar();}
	return x;
}
int q;
const unsigned long long inf=1ull<<63;
inline unsigned long long get1(register unsigned long long n){
    if(n&1) return (n+1)/2*n;
    return n/2*(n+1);
}
inline unsigned long long get2(register unsigned long long n){
    if(n==-1) return 0;
    register long long a=n,b=n+1,c=n*2+1;
    if(!(a&1)) a>>=1;
    else if(!(b&1)) b>>=1;
    else c>>=1;
    if(!(a%3)) a/=3;
    else if(!(b%3)) b/=3;
    else c/=3;
    return a*b*c;
}
inline unsigned long long get3(register unsigned long long n){
    if(n==-1) return 0;
    register unsigned long long x=get1(n);
    return x*x;
}
inline unsigned long long get4(register unsigned long long n){
    if(n==-1) return 0;
    register long long a=n,b=n+1,c=n+2;
    if(!(a&1)) a>>=1;
    else if(!(b&1)) b>>=1;
    else c>>=1;
    if(!(a%3)) a/=3;
    else if(!(b%3)) b/=3;
    else c/=3;
    return a*b*c;
}
inline unsigned long long G(unsigned long long x)
{
	return x*2+get1(x-1)+get4(x-1)*8;
}
inline unsigned long long F(unsigned long long x)
{
	return x-get1(x-1)+get4(x-1)*8;
}
inline unsigned long long getans(long long x,long long y)
{
	if(x<0||y<0) return 0;
    register long long g=min(x-1,y);
    register unsigned long long ans=0,an=0;
    if(g>=0)
	{
    ans+=8*get3(g);
    ans+=16*get2(g);
    ans+=11*get1(g);
	ans+=3*(g+1);
    }
    if(x>g+1)
    {
    an=G(x)-G(g+1);an=an*(y+1);an-=(x-g-1)*get1(y);
    ans+=an;
	}
	if(y>g)
	{
	an=F(y+1)-F(g+1);an=an*(x+1);an+=(y-g)*get1(x);
	ans+=an;
	}
	return ans;
}
int main()
{
	freopen("qiu.in","r",stdin);
	freopen("qiu.out","w",stdout);
	q=re_ad();
	register long long x,y,xx,yy;
	register unsigned long long ans;
	while(q--)
	{
	x=re_ad();xx=re_ad();y=re_ad();yy=re_ad();
	ans=getans(xx,yy)+getans(x-1,y-1)-getans(xx,y-1)-getans(x-1,yy);
	if(ans>=inf)ans^=inf;
	printf("%llu\n",ans);
	}
}

T2

题目大意:给你n个数对,两个数对能匹配当且仅当ai<=aj,且会产生bj-bi的贡献,每个数对只能被匹配一次。对于每个1<=k<=n/2,求出匹配次数不超过k的最大贡献。n<=1e5,a,b<=1e9。

题解:

DAY 7_第2张图片

T3

题目大意:

DAY 7_第3张图片

DAY 7_第4张图片

DAY 7_第5张图片

题解:

DAY 7_第6张图片

DAY 7_第7张图片

DAY 7_第8张图片

 

你可能感兴趣的:(集训2)