A. Traveling Salesman Problem
#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=998244353;
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();
int x=0,xx=0,y=0,yy=0;
for(int i=1;i<=n;i++)
{
int a=read(),b=read();
if(a==0)
{
if(b>0)y=max(y,b);
else yy=min(yy,b);
}
else
{
if(a>0)x=max(x,a);
else xx=min(xx,a);
}
}
printf("%lld\n",(ll)2*(y+x-xx-yy));
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
B. Optimal Reduction
#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=998244353;
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];
void solve()
{
int n=read();
for(int i=1;i<=n;i++)a[i]=read();
bool ans1=0,ans2=0;
int id;
for(int i=1;i<n;i++)
{
if(a[i]>a[i+1])
{
if(ans1==0)id=i;
ans1=1;
}
}
if(ans1==0)
{
printf("YES\n");
return;
}
for(int i=id;i<n;i++)
if(a[i]<a[i+1])ans2=1;
if(ans2==0)
{
printf("YES\n");
return;
}
printf("NO\n");
}
int main()
{
int T=read();
while(T--)solve();
return 0;
}
C. Build Permutation
#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=998244353;
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;
ll fuck[510];
ll ans[N];
bool v[N];
void solve()
{
memset(v,0,sizeof(v));
int n=read();
int id;
for(int i=1;i<500;i++)
{
ll x=2*n;
if(fuck[i]<x&&fuck[i+1]>x)id=i;
}
for(int i=n;i>=1;i--)
{
while(1)
{
ll x=fuck[id]-i+1;
if(x<0||x>=n||v[x])
{
id--;
continue;
}
ans[i]=x;
v[x]=1;
break;
}
}
for(int i=1;i<=n;i++)printf("%lld ",ans[i]);
printf("\n");
}
int main()
{
for(int i=1;i<=500;i++)fuck[i]=i*i;
int T=read();
while(T--)solve();
return 0;
}
D. Tournament Countdown
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<math.h>
#define ll long long
using namespace std;
const int mod=998244353;
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 fuck[20];
int a[N];
void ask(int x,int y){cout<<"? "<<x<<" "<<y<<endl;}
void ans(int x){cout<<"! "<<x<<endl;}
int qqq(int a,int b,int c,int d)
{
ask(a,c);
int p=read();
if(p==0)
{
ask(b,d);
int q=read();
if(q==1)return b;
else return d;
}
if(p==1)
{
ask(a,d);
int q=read();
if(q==1)return a;
else return d;
}
if(p==2)
{
ask(b,c);
int q=read();
if(q==1)return b;
else return c;
}
}
void solve()
{
vector<int>v;
int n=read();
for(int i=1;i<=fuck[n];i++)v.push_back(i);
while(n>1)
{
int g=fuck[n]/4;
for(int i=1;i<=fuck[n];i++)a[i]=v[i-1];
v.clear();
for(int i=1;i<=g;i++)
{
int p=qqq(a[(i-1)*4+1],a[(i-1)*4+2],a[(i-1)*4+3],a[(i-1)*4+4]);
v.push_back(p);
}
n-=2;
}
if(n==1)
{
ask(v[0],v[1]);
int q=read();
if(q==1)ans(v[0]);
else ans(v[1]);
}
else ans(v[0]);
}
int main()
{
fuck[1]=2;
for(int i=2;i<=19;i++)fuck[i]=fuck[i-1]*2;
int T=read();
while(T--)solve();
return 0;
}