本文主要是介绍codeforces round 416 div2补题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一题,水题
A. Vladik and Courtes
#include<bits/stdc++.h>
using namespace std;
int main()
{long long a,b;cin>>a>>b;long long t1=0,t2=0;for(int i=1;;i++){t1=t1+2*i-1;t2=t2+2*i;if(t1>a){cout<<"Vladik"<<endl;break;}if(t2>b){cout<<"Valera"<<endl;break;}
}
}
第二题,我想复杂了想到区间求第k大还写了主席树==其实就是暴力的题
B. Vladik and Complicated Book
#include<bits/stdc++.h> using namespace std; const int maxn=1e4+10; int rt[20*maxn]; int sum[20*maxn],ls[20*maxn],rs[20*maxn]; int a[maxn],b[maxn]; int cnt; void build(int& node,int l,int r) { node=++cnt; sum[node]=0; if(l==r) return ; int mid=(l+r)>>1; build(ls[node],l,mid); build(rs[node],mid+1,r); } void update(int& now,int pre,int l,int r,int p) { now=++cnt; ls[now]=ls[pre]; rs[now]=rs[pre]; sum[now]=sum[pre]+1; if(l==r) return ; int mid=(l+r)>>1; if(p>mid) update(rs[now],rs[pre],mid+1,r,p); else update(ls[now],ls[pre],l,mid,p); } int query(int pre,int now,int l,int r,int k) { if(l==r) return b[l]; int mid=(l+r)>>1; int c=sum[ls[now]]-sum[ls[pre]]; if(k<=c) return query(ls[pre],ls[now],l,mid,k); else return query(rs[pre],rs[now],mid+1,r,k-c); } int main() { int t,n,m,ql,qr,k; cnt=0; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",a+i); b[i]=a[i]; } sort(b+1,b+1+n); int len=unique(b+1,b+1+n)-(b+1); build(rt[0],1,len); for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+len,a[i])-b; for(int i=1;i<=n;i++) update(rt[i],rt[i-1],1,len,a[i]); for(int i=1;i<=m;i++) { scanf("%d %d %d",&ql,&qr,&k); if(k>qr||k<ql){cout<<"Yes"<<endl;continue;}int tmp=query(rt[ql-1],rt[qr],1,len,k-ql+1);if(tmp==a[k])cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
c.比赛时写到这题就gg了想不出来。
C. Vladik and Memorable Trip
#include<bits/stdc++.h> using namespace std; int a[5100],cnt[5100]; int t[5100][5100]; int dp[5100]; bool vis[5100]; int ans; int main() {int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];cnt[a[i]]++;}memset(t,-1,sizeof(t));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));ans=0;int sum=0;for(int j=i;j<=n;j++){if(!vis[a[j]]){vis[a[j]]=1;ans=ans^a[j];sum+=cnt[a[j]];}if(sum==j-i+1){t[i][j]=ans;}}} for(int i=n;i>=1;i--){ dp[i]=dp[i+1];for(int j=i;j<=n;j++){if(t[i][j]!=-1)dp[i]=max(dp[i],dp[j+1]+t[i][j]); }}cout<<dp[1]<<endl; }
这篇关于codeforces round 416 div2补题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!