今日得分:0+7+10(慘)
T1
題目大意:給你一個平面直角坐標系,初始位置在(0,0),該點權值為1,每次順時針找到第一個整點,該位置的權值為上一個點的權值+1,多組詢問,每次詢問在第一象限內的一個矩陣中所有整點位置的權值之和對2^63取模,坐標<=1e18,q<=1e6,
題解:

對于"-|",容易發現每一個"-|"的和是(2i+1)^3+(2i+1)^2+(i+1)(考慮每一個平方項i^2都是i個數的平均值,只需考慮最下面一行即可),對于"|",我們可以先求出最底下一行的和,再通過減去一個等引數列得到答案,最底下一行的和可以通過剛才的式子得到,也可以觀察發現兩個數的差分是一個等引數列,直接推式子即可,對于"-"同理,
(發現一個奇妙的事情:對于只有第1項為1其余項為0的數列,它n次前綴和得到的陣列的第i項為C(n+i-2,n-1),這個性質很好,)
AC代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
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,
題解:

T3
題目大意:



題解:



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279671.html
標籤:其他
上一篇:堆疊和佇列以及認識優先級佇列與雙端佇列(C++STL)
下一篇:普通大三的游戲開發實習
