1. 程式人生 > 實用技巧 >€$P被Ak 題解

€$P被Ak 題解

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;
}