€$P被Ak 题解

Posted 614685877--aakennes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了€$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;
}

以上是关于€$P被Ak 题解的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 518E Arthur and Questions(贪心 + 思维)题解

牛客 | 一起来做题~欢乐赛2 (AK 题解)

Codeforces Global Round 1 (A-E题解)

省选水题集Day1一起来AK水题吧! 题目(更新到A)

第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)

第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)