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