您的位置:首页 > 其它

codeforces round 416 div2补题

2017-05-28 17:03 302 查看
第一题,水题

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: