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;
} 


猜你喜欢

转载自blog.csdn.net/silence401/article/details/72793737