标签:string bool upper 限制 def -- ios har 二分
老子他妈直接拿熊刀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;
}
}
傻逼阅读理解题,可以考场没时间了,题都没看懂
考场一眼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;
}
标签:string bool upper 限制 def -- ios har 二分
原文地址:https://www.cnblogs.com/614685877--aakennes/p/13973071.html