C /\/\/\/
奇偶分类然后就是送分题,代码懒得写了。
D Robot Arms
非常强的二进制拆分,见代码。(题解自己看去)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
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<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
vector<int> v;
void sol(int x,int y)
{
for(int i=0;i<v.size();i++)
{
int s=v[i];
if(abs(x)>abs(y))
{
if(x<0)x+=s,putchar('L');
else x-=s,putchar('R');
}
else
{
if(y<0)y+=s,putchar('D');
else y-=s,putchar('U');
}
}
putchar('\n');
}
const int N=1010;
int x[N],y[N],c[2];
int main()
{
int n=read();
for(int i=1;i<=n;i++)x[i]=read(),y[i]=read(),c[x[i]+y[i]&1]++;
if(c[0]&&c[1])return puts("-1"),0;
for(int i=30;i>=0;i--)v.push_back(1<<i);
if(c[0])v.push_back(1);
printf("%d\n",(int)v.size());
for(int i=0;i<v.size();i++)printf("%d ",v[i]);putchar('\n');
for(int i=1;i<=n;i++)sol(x[i],y[i]);
return 0;
}
E Tr/ee
感觉这个 E 比 D 简单,因为我都能想出来。。。
有解当且仅当:
- \(\forall 1\le i<n,s_i=s_{n-i}\);
- \(s_1=s_{n-1}=1\);
- \(s_n=0\)。
把 \(s_i=1\) 的下标拎到一个 \(p_1,p_2,\cdots,p_m\) 里,那么弄一个长度为 \(m\) 的链,并且第 \(i\)(\(2<i\le m\))个点挂上 \(p_i-p_{i-1}-1\) 个点。这样是 \(n-1\) 个点,往第 \(m\) 个点再挂一个即可。
#include<bits/stdc++.h>
using namespace std;
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<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
const int N=1e5+10;
char s[N];int p[N],c;
int main()
{
scanf("%s",s+1);
int n=strlen(s+1);
if(s[1]=='0'||s[n-1]=='0'||s[n]=='1')return puts("-1"),0;
for(int i=1;i<n;i++)if(s[i]!=s[n-i])return puts("-1"),0;
for(int i=1;i<=n;i++)if(s[i]^48)p[++c]=i;
int m=c;
for(int i=2;i<=c;i++)
{
printf("%d %d\n",i,i-1);
for(int j=1;j<=p[i]-p[i-1]-1;j++)printf("%d %d\n",i,++m);
}
printf("%d %d\n",c,++m);
return 0;
}
F Distance Sums
一场四道题的比赛出两道构造题,这合理吗?这合理吗????