€$P被Ak 題解
阿新 • • 發佈:2020-11-14
T1:獳畧日
老子他媽直接拿熊刀tong死出題人
導致被Ak的罪魁禍首
考場三個多小時的消耗
考後發現考場寫的又臭又長就重構了一份
直接分三個階段考慮
公元前,\(1600\) 前和 \(1600\) 後
三個階段分別預處理
詢問時直接判斷+二分
前兩個階段預處理每一年的日期
後一個階段 \(400\) 一迴圈,處理 \(400\) 年的每一年
注意特殊處理 \(1582\) 年
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; const int maxn=1e6+5; int year1[maxn],year2[maxn],year3[maxn],sum1[maxn],sum2[maxn],sum3[maxn],inq[maxn],inqq[maxn],inqqq[maxn]; int m1[13]={0,31,59,90,120,151,181,212,243,273,304,334,365}; int m2[13]={0,31,60,91,121,152,182,213,244,274,305,335,366}; int m3[13]={0,31,59,90,120,151,181,212,243,273,294,324,355}; #define mid ((l+r)>>1) int Binary(int l,int r,int x){ while(l<=r){ if(x<=sum1[mid])l=mid+1; else r=mid-1; } return l-1; } int main(){ freopen("julian.in","r",stdin); freopen("julian.out","w",stdout); for(int i=4713;i>=1;i--)year1[i]=365+(i%4==1),sum1[i]=year1[i]+sum1[i+1],inq[i]=(i%4==1); for(int i=1;i<=1600;i++)year2[i]=365+(i%4==0),inqq[i]=(i%4==0); for(int i=1;i<=400;i++){ year3[i]=365+(i%4==0); if(i%100==0&&i!=400)year3[i]--; sum3[i]=sum3[i-1]+year3[i]; inqqq[i]=(year3[i]==366); } year2[1582]=355; for(int i=1;i<=1600;i++)sum2[i]=year2[i]+sum2[i-1]; int T;cin>>T; ll x; while(T--){ cin>>x; int ans1=0,ans2=1,ans3=1,xx,id; bool isfour=0,is17=0; if(x<=1721423){ ans1=Binary(0,4713,x);is17=1; x-=sum1[ans1+1];isfour=inq[ans1]; }else if(x<=2305813){ x-=1721424; ans1=upper_bound(sum2+1,sum2+1601,x)-sum2-1; x-=sum2[ans1];ans1++;isfour=inqq[ans1]; }else{ x-=2305814; ans1=1600; ans1+=x/146097*400;x%=146097; id=upper_bound(sum3+1,sum3+401,x)-sum3-1; x-=sum3[id];ans1+=id+1;isfour=inqqq[id+1]; } if(ans1==1582&&!is17){ ans2=upper_bound(m3+1,m3+13,x)-m3-1; x-=m3[ans2];ans2++; if((ans2==10&&x>=4))x+=10; ans3+=x; }else if(isfour){ ans2=upper_bound(m2+1,m2+13,x)-m2-1; x-=m2[ans2];ans2++; ans3+=x; }else{ ans2=upper_bound(m1+1,m1+13,x)-m1-1; //cout<<x<<" - > "; x-=m1[ans2];ans2++; //cout<<x<<endl; ans3+=x; } if(ans2==13){ if(is17)ans1--,ans2=1; else ans1++,ans2=1; } if(is17)cout<<ans3<<" "<<ans2<<" "<<ans1<<" BC"<<endl; else cout<<ans3<<" "<<ans2<<" "<<ans1<<endl; } }
T2:動粅薗
傻逼閱讀理解題,可以考場沒時間了,題都沒看懂
考場一眼ull,但是看不懂題
由於保證了每一個 \(q_i\) 都不同
那直接看每一位是否有限制,沒限制直接加到答案,有限制看是否已經滿足
#include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #define ull unsigned long long using namespace std; const int maxn=1e6+5,INF=0x3f3f3f3f; int n,m,k,c,a[maxn],ans,b[maxn],d[maxn]; ull maxs,maxk; inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar(); return s*w; } signed main(){ freopen("zoo.in","r",stdin); freopen("zoo.out","w",stdout); n=read(),m=read(),c=read(),k=read(); if(m==0&&k==64)return puts("18446744073709551616"),0; ull x; for(int i=1;i<=n;i++){ scanf("%llu",&x);maxs|=x; } for(int i=1,xx,y;i<=m;i++){ xx=read(),y=read(); d[xx]=1; if(maxs&(1ull<<xx))b[xx]=1; } for(int i=0;i<k;i++){ if(!d[i])ans++; else if(b[i])ans++; } if(ans==64)cout<<0ull-n; else cout<<1ull*(1ull<<ans)-n; }