CSP-S 2020
日期计算以
预处理出
几个简化代码的技巧:
对于格里高利历,以
(为什么要
判断历法:
(
公元前xxx年视为
记得开 long long
#include<bits/stdc++.h> #define N 146097 //格里高利历400年的天数 #define int long using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } int Q,n,year,month,day; int d[N],m[N],y[N]; int md(int y,int m){ //格里高利历y年m月的天数 if(m==2) return y%4?28:(y%100?29:(y%400?28:29)); return (m==4||m==6||m==9||m==11)?30:31; } void pre(){ m[0]=d[0]=1; for(int i=1;i<N;++i){ d[i]=d[i-1]+1,m[i]=m[i-1];y[i]=y[i-1]; if(d[i]>md(y[i],m[i])) ++m[i],d[i]; if(m[i]>12) m[i]=1,++y[i]; } }//y[i],m[i],d[i]分别表示从0年1月1日经过i天的年月日 signed main(){ pre(); Q=read(); while(Q--){ n=read(); if(n>){ //格里高利历 }else{ year=n/1461*4-4712; //1461是儒略历4年的天数 n%=1461; } if(year+y[n]) printf("%d %d %lld\n",d[n],m[n],year+y[n]); else printf("%d %d %lld BC\n",d[n],m[n],1-year-y[n]); } return 0; }
考虑每一位,要么这一位被动物覆盖,要么这位不被动物覆盖,且这一位不需要饲料
。设符合的位的个数为 __int128
,也可以特判过
if(k-cnt==64){ if(n) cout<<ull(-n)<<endl; else cout<<"18446744073709551616"<<endl; }
当然你不需要背下 unsigned long long
)-1 再加上
#include<bits/stdc++.h> #define N 1000005 #define int __int128 using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } int n,m,c,k,cnt; int a[N],p[N],q[N]; int b[N],flag[N]; void write(int x){ if(x>9) write(x/10); putchar(x%10+'0'); } signed main(){ n=read(),m=read(),c=read(),cnt=k=read(); for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<=m;++i) p[i]=read(),q[i]=read(),b[p[i]]++; for(int i=1;i<=n;++i){ int x=a[i]; int pos=0; while(x){ if(x&1) flag[pos]=1; x>>=1,pos++; } } for(int i=0;i<=k;++i) if(!flag[i]&&b[i]) cnt--; int ans=1; for(int i=1;i<=cnt;++i) ans*=2; write(ans-n); return 0; }
先开一个数组
又看到题目中保证
不妨设剩下来
注意要特判
此外 unsigned long long
变量代替,这样就做到了时间
非自己代码:
#include <bits/stdc++.h> using namespace std; #define ull unsigned long long #define gc getchar() inline ull rd(){ ull x=0; char s=gc; while(!isdigit(s))s=gc; while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc; return x; } ull n,m,c,k,ans,lim,hv; int main(){ n=rd(),m=rd(),c=rd(),k=rd(); for(int i=1;i<=n;i++)hv|=rd(); // 统计每个位是否有 1 for(int i=1;i<=m;i++)lim|=1ull<<rd(),rd(); // 统计有限制的位 for(int i=0;i<k;i++)ans+=!((lim>>i)&1)||((hv>>i)&1); // 如果当前位有 1, 或者没有限制,那么都可以选 if(ans==64&&!n)puts("18446744073709551616"); else cout<<(ans==64?-n:(1ull<<ans)-n)<<endl; return 0; }
本文作者:Aurora-JC
本文链接:https://www.cnblogs.com/jiangchen4122/p/17464586.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步