Rank1696。
Cytus II好评。
因为下晚自习了所以D没调出来身败名裂。
A
签到题。
#include<bits/stdc++.h> using namespace std; unordered_set<int>S; int min(int a,int b){return a<b? a:b;} int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;} int main() { for(int T=read();T;--T) { S.clear(); int n=read(),s=read(),k=read(); for(int i=1;i<=k;++i) S.insert(read()); int up=1e9,dw=1e9; for(int p=s;p<=n;++p) if(!S.count(p)) {up=p-s;break;} for(int p=s;p;--p) if(!S.count(p)) {dw=s-p;break;} printf("%d\n",min(up,dw)); } }
B
简单结论题
#include<bits/stdc++.h> using namespace std; using db=double; int main() { int n;cin>>n;db ans=0; for(int i=1;i<=n;++i) ans+=1.0/i; printf("%.10lf",ans); }
C
模拟题。
记录有多少对满足纵坐标之差\(=1\)且横坐标之差的绝对值\(\le1\)。
#include<bits/stdc++.h> using namespace std; const int N=200007; int a[2][N]; int read(){int x=0,c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=x*10+c-48,c=getchar();return x;} int main() { int n=read(),q=read(); for(int i=1,r,c,sum=0;i<=q;++i) { r=read()-1,c=read(); if(!a[r][c]) { a[r][c]=1; if(a[!r][c])++sum; if(a[!r][c-1])++sum; if(a[!r][c+1])++sum; } else { a[r][c]=0; if(a[!r][c])--sum; if(a[!r][c-1])--sum; if(a[!r][c+1])--sum; } puts(sum?"No":"Yes"); } }
D
简单结论题。
显然先走到某个点,然后往某个方向走一段区间最优。
(因为爆long long了所有当场没过)
#include<bits/stdc++.h> using namespace std; using ll=long long; vector<pair<ll,ll>>p; ll labs(ll x){return x<0? -x:x;} ll dis(ll x,ll y,ll X,ll Y){return labs(x-X)+labs(y-Y);} int main() { ll x0,y0,ax,ay,bx,by,xs,ys,t; cin>>x0>>y0>>ax>>ay>>bx>>by>>xs>>ys>>t; while(x0<=5e16&&y0<=5e16) p.emplace_back(x0,y0),x0=x0*ax+bx,y0=y0*ay+by; int ans=0; for(int i=0;i<(int)p.size();++i) for(int j=0;j<(int)p.size();++j) if(dis(xs,ys,p[i].first,p[i].second)+dis(p[i].first,p[i].second,p[j].first,p[j].second)<=t) ans=max(ans,abs(i-j)+1); cout<<ans; }
来源:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12219230.html