A. EhAb AnD gCd
给你一个
,让你构造一个
,然后问你
。
思路:
还想了一会。。。直接构造1
就ok了。
B
给你一个串,你可以无限延长复制它,然后问你LIS长度。
思路:
把给的字符串排个序,然后这个字符串LIS就是答案。
C
题意:
给你一棵树,然后让你给树的边上赋权值,权值大小为:
让你输出方案,使得任意两点之间的MEX的最大值最小。
MEX是两点之间路径上不曾出现的最小非负整数。
思路:
我们可以发现,总会有一条路径上会有
,所以我们尽可能不让2和他们在一个路径上。
然后我的思路就是用
找一条树上的最长链,进行放置权值,先放0,1和其他,最后放置2。现在想想这真是个糟糕的思路,我们只需要找一个度大于等于3的点放置完0,1,2,其余随便放置就可以了。难受。。。最后还是贴的ZHJ的代码,ZHJ ORZ!果然还是我太弱了。。。
vector<int> G[N];
vector<pair<int,int> > vp;
map<pair<int,int> ,int> hap;
int deg[N];
int main(){
int n = read();
rep(i,1,n-1){
int u = read(),v = read();
deg[u] ++;
deg[v] ++;
vp.push_back({u,v});
G[u].push_back(v);
G[v].push_back(u);
}
int co(0);
rep(i,1,n){
if(deg[i] >= 3){
int S = G[i].size();
rep(j,0,2){
int y = G[i][j];
hap[{i,y}] = hap[{y,i}] = co++;
}
break;
}
}
int S = vp.size();
rep(i,0,S-1){
int x = vp[i].first,y = vp[i].second;
if(hap.count({x,y})) cout<<hap[{x,y}]<<endl;
else {
cout<<co++<<endl;
}
}
}
D
题意很简短,但构造过程不好想。
给你一个
和
,然后让你构造一个元素个数最小的数组,使得这些数字的异或和为
,前缀和为
。
思路:
异或又被称为不进位加法,
这个式子可以这样理解,
只是计算出每一位不考虑进位时候的情况,可以
还是进位的,进位的时候肯定是
当前位都是1,才会往前进位。而
第
为1,说明第
位该往前进位,而乘2则是整体左移,就是往前进位。然后在加上刚才没考虑进位的情况。
这个题目不存在解的情况,就是
的情况和
奇偶性不同的情况。前者是因为异或是不进位加法,所以肯定不会大于加法的值;后者是因为,如果某一位
不一致,则肯定是进位造成的,而最后一位肯定没有进位,所以要为1都为1,要为0,都为0。
对于
的情况直接输出
就行了。
对于一般情况,
因为
所以
我们令
就行了
答案就是
可是第一个样例长度为2啊
这是因为
所以是
int main(){
ll a = read(),b = read();
if(a==b&&a==0) {return puts("0"),0;}
else if(a==b) {cout<<1<<'\n'<<a<<endl;return 0;}
if(a > b|| ((a&1)!=(b&1))) {puts("-1");return 0;}
ll x = (b - a)>>1;
if((a^x)==(a+x)) cout<<2<<'\n'<<a+x<<' '<<x<<endl;
else cout<<3<<'\n'<<a<<' '<<x<<' '<<x;
}