http://codeforces.com/contest/811
A题
我就是个SB,A题人物写反了- -之后自信提交WA
#include <bits/stdc++.h>
#define maxs 2020202
#define mme(i,j) memset(i,j,sizeof(i))
using namespace std;
int main(){
int n,m,s;
while(~scanf("%d%d",&n,&m))
{
s=1;
while(1){
if(n<s)
{
printf("Vladik\n");
break;
}
else{
n-=s;
s++;
}
if(m<s)
{
printf("Valera\n");
break;
}
else{
m-=s;
s++;
}
}
}
return 0;
}
B题,傻逼题,判断l~r之间有几个比a[x]小的,之后 l+那个数==x即可
#include <bits/stdc++.h>
#define mme(i,j) memset(i,j,sizeof(i))
#define maxs 20202
using namespace std;
int a[maxs],b[maxs];
map<int,int>mp;
int main()
{
int n,q;
int l,r,x;
scanf("%d%d",&n,&q);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
while(q--)
{
scanf("%d%d%d",&l,&r,&x);
if(l==r)
{
printf("Yes\n");
continue;
}
else{
int val =a[x],t=0;
for(int i=l;i<=r;i++)
{
if(a[i]<val)
t++;
}
if(t+l == x)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
c题,dp题;
sqval[i][j]=表达了i~j区间内的异或和
dp[i]表示i为结尾的最大值,dp[i]=max(dp[i],dp[j]+sqval[J+1][i]);
看是i大,还是j~i的异或和大,之后输出ans
#include <bits/stdc++.h>
#define mme(i,j) memset(i,j,sizeof(i))
#define maxs 20220
using namespace std;
long long a[maxs];
long long n,c;
long long cs=0;
long long dp[maxs];
long long s[maxs],sqval[5005][5005];
bool vis[maxs];
map<int,int>mp;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);mp[a[i]]++;
s[i] = mp[a[i]];
}
for(int i=1;i<=n;i++){
int cnt=0,sum=0;
mme(vis,0);
for(int j=i;j<=n;j++){
if( vis[ a[j] ]==0 ){
if( s[ j ] == 1 ){
cnt++;
vis[ a[j] ]=1;
}
else break;
}
if( s[ j ] == mp[a[j]]){
cnt--;
sum^=a[j];
}
if(cnt==0){
sqval[i][j]=sum;
}
}
}
mme(dp,0);
long long res=0;
for(int i=1;i<=n;i++){
dp[i]=max(dp[i],dp[i-1]);
for(int j=0;j<=i;j++){
dp[i]=max(dp[i],dp[j]+sqval[j+1][i]);
}
res = max(res,dp[i]);
}
printf("%lld\n",res);
return 0;
}