zoukankan      html  css  js  c++  java
  • €$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;
    }
    
    
  • 相关阅读:
    NPOI导出excel表格应用
    通过用户密码获取共享文件
    sql之left join、right join、inner join的区别
    C#日志编写
    C#预编译指令
    匿名类型(C# 编程指南)
    反射
    SQL通用查询
    Lambda 表达式(C# 编程指南)
    自定义用户控件编写——(文件夹目录选择)
  • 原文地址:https://www.cnblogs.com/614685877--aakennes/p/13973071.html
Copyright © 2011-2022 走看看