比赛地址:https://atcoder.jp/contests/abc216。
只有 ABCDEF 的题解,G 待补,H 不会。
A
模拟。
void mian(){
int x,y;
scanf("%d.%d",&x,&y);
if(0<=y&&y<=2)printf("%d-",x);
if(3<=y&&y<=6)printf("%d",x);
if(7<=y&&y<=9)printf("%d+",x);
puts("");
}
B
模拟。
const int N=1000;
std::string s[N+10],t[N+10];
int n;
void mian(){
std::cin>>n;
for(int i=1;i<=n;i++)
std::cin>>s[i]>>t[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(s[i]==s[j]&&t[i]==t[j]){
puts("Yes");
return;
}
puts("No");
}
C
考虑遍历 \(n\) 的每一个二进制位,如果是 \(1\),就 \(\times 2\),\(+1\),如果是 \(0\),就 \(\times 2\)。
ll n;
void mian(){
scanf("%lld",&n);
for(int i=59;i>=0;i--)
if((n>>i)&1LL)printf("BA");
else printf("B");
puts("");
}
D
如果某一堆中 \(x\) 在 \(y\) 上面但是另一堆中 \(y\) 在 \(x\) 上面,那么就不行。
以此类推,可以得到一个结论:把这些 \(\langle x,y\rangle\) 的关系连有向边,如果存在环就不行,否则就行。
const int N=2e5;
struct Edge{int to,nxt;}e[N*2+10];int head[N+10],tote=1;
inline void addEdge(int u,int v){e[++tote].to=v;e[tote].nxt=head[u];head[u]=tote;}
int n,m,ind[N+10];
bool topoSort(){
std::queue<int> q;
for(int i=1;i<=n;i++)
if(!ind[i])q.push(i);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(--ind[v]==0)q.push(v);
}
}
for(int i=1;i<=n;i++)
if(ind[i])return 0;
return 1;
}
void mian(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int k,x,lst=-1;
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d",&x);
if(lst==-1)lst=x;
else addEdge(lst,x),ind[x]++;
}
}
puts(topoSort()?"Yes":"No");
}