codeforces round 416 div2补题
生活随笔
收集整理的這篇文章主要介紹了
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补题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树形动态规划
- 下一篇: S-T平面图中利用最短路求最小割(BZO