A. Chip Game
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
void solve()
{
int n=read(),m=read();
if((n&1&&m&1)||(n%2==0&&m%2==0))printf("Tonya\n");
else printf("Burenka\n");
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
B. Mathematical Circus
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
void solve()
{
int n=read(),k=read();
if(k==0||k%4==0)
{
printf("NO\n");
return;
}
printf("YES\n");
if(k&1)
{
for(int i=1;i<=n;i+=2)
printf("%d %d\n",i,i+1);
return;
}
for(int i=3;i<=n;i+=4)
printf("%d %d\n",i,i+1);
for(int i=2;i<=n;i+=4)
printf("%d %d\n",i,i-1);
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
C. Fighting Tournament
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=1e5+10;
int a[N],f[N],id[N];
void solve()
{
int n=read(),m=read();
stack<int>s;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)id[i]=1e9;
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)
{
if(!s.empty())while(!s.empty()&&a[s.top()]<=a[i])s.pop();
if(!s.empty())f[i]=s.top();
s.push(i);
}
while(!s.empty())s.pop();
for(int i=n;i>=1;i--)
{
if(!s.empty())while(!s.empty()&&a[s.top()]<=a[i])s.pop();
if(!s.empty())id[i]=s.top();
s.push(i);
}
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
if(y<=x-2||f[x]!=0)
{
printf("0\n");
continue;
}
if(id[x]==1e9||y<=id[x]-2)
{
if(x==1||x==2)printf("%d\n",y);
else printf("%d\n",y-x+2);
continue;
}
if(x>1)
{
printf("%d\n",id[x]-x);
continue;
}
if(x==1)
{
printf("%d\n",id[x]-x-1);
continue;
}
}
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
D1/2. Burenka and Traditions (easy/hard version)
n^2 dp(只能过D1):
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=2e5+10;
int f[5010][9010];
int a[N];
void solve()
{
int mx=9000;
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)
for(int j=0;j<=mx;j++)f[i][j]=1e9;
f[1][a[1]]=0;
if(a[1])f[1][0]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<=mx;j++)
{
int x=j^a[i];
if(x>mx)continue;
f[i][x]=min(f[i][x],f[i-1][j]+1);
}
int t=0;
if(a[i]!=0)t=1;
f[i][0]=min(f[i][0],f[i-1][0]+t);
f[i][a[i]]=min(f[i][a[i]],f[i-1][0]);
}
printf("%d\n",f[n][0]);
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
/*
10
27 27 | 34 32 2 |31 23 56 52 4
dp[j+1] <-- min(dp[i-1+1,min aj+1,^ai =0 dp j + i - j -1)
*/
异或性质的前缀和贪心 (d1 d2都能过):
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=1e5+10;
int a[N];
ll sum[N];
map<ll,bool>mp;
void solve()
{
mp.clear();
memset(sum,0,sizeof(sum));
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=n;i>=1;i--)sum[i]=sum[i+1]^a[i];
mp[sum[1]]=1;
int ans=n;
for(int i=1;i<=n;i++)
{
if(!a[i])
{
ans--;
mp.clear();
continue;
}
if(!mp[sum[i+1]])mp[sum[i]]=1;
else
{
ans--;
mp.clear();
}
}
printf("%d\n",ans);
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
E. Fibonacci Strings
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<math.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}
return x*f;
}
const int N=110;
ll a[N];
ll f[N],s[N];
void solve()
{
priority_queue<ll>q;
int n=read();
ll sum=0;
for(int i=1;i<=n;i++)a[i]=read(),sum+=a[i];
int id=lower_bound(s+0,s+50,sum)-s;
//cout<<id<<" ";
if(s[id]!=sum)
{
printf("NO\n");
return;
}
for(int i=1;i<=n;i++)q.push(a[i]);
while(!q.empty())
{
ll x=q.top();q.pop();
if(f[id]>x)
{
printf("NO\n");
return;
}
x-=f[id];
if(x!=0)
{
if(q.size()==0||q.top()<x)
{
printf("NO\n");
return;
}
q.push(x);
}
id--;
}
printf("YES\n");
}
int main()
{
f[1]=1,f[2]=1;
s[1]=1,s[2]=2;
for(int i=3;i<=50;i++)f[i]=f[i-1]+f[i-2],s[i]=s[i-1]+f[i];
int T=read();
while(T--)solve();
return 0;
}
/*
3
3 1 3
1 1 2 3
1 12 3 babbccc
*/