Codeforces Round #614 (Div. 2)
作者:互联网
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;
}
标签:std,int,namespace,Codeforces,long,614,using,Div,include 来源: https://www.cnblogs.com/cjoierShiina-Mashiro/p/12219230.html