Codeforces Round #423
A:水.
B:注意min(n,m)>=max(xmax-xmin+1,ymax-ymin+1)就行
C:刚开始想用待输入字符串是否是已经确定字符串的子串做(map<int,string>) 如果是就跳过 不是就把超过的部分赋值 这样就可以避免重复赋值 但总觉得不是还不是最优 后来看到有人用并查集做觉得思路相同且实现地更好
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; char s[N],res[N*2]; int fa[N*2]; int Find(int x) { return x==fa[x]?x:fa[x]=Find(fa[x]); } int main() { for(int i=0;i<N*2;i++)fa[i]=i; int n,t,x; scanf("%d",&n); int ml=0; for(int i=0;i<n;i++) { scanf("%s",s); scanf("%d",&t); int l=strlen(s); while(t--) { scanf("%d",&x); ml=max(ml,l+x-1); int y=x; while((y=Find(y))<=l+x-1) { res[y]=s[y-x]; fa[y]=y+1; } } } for(int i=1;i<=ml;i++)if(!res[i])res[i]='a'; puts(res+1); return 0; }
D:..碰到过的最简单的D题 向日葵构造
有n个点 其中k个点为叶子只能连一条边 剩下的边至少有2条边连 求树中最远的两个点最近是多少:很明显每个非叶子节点最少都连有一个叶子 先把叶子全部连在一个非叶子上 再每有一个非叶子节点就连在最初的上面 分一个叶子给他