比賽鏈接:https://codeforces.com/contest/1328
A. Divisibility Problem
嚶
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
//#define int ll
ll a,b,c,t;
signed main(){
	cin>>t;
	while(t--){
		cin>>a>>b;
		c=(b-a%b)%b;
		cout<<c<<endl;
	}
	return 0;
}
 
        B. K-th Beautiful String
嚶嚶
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
//#define int ll
ll a,b,c,t,n;
string s;
signed main(){
	cin>>t;
	while(t--){
		cin>>n>>b;
		s.assign(n,'a');
		repeat(i,2,n+1){
			if(b<=i-1){
				s[n-i]='b';
				s[n-b]='b';
				cout<<s<<endl;
				break;
			}
			else b-=i-1;
		}
	}
	return 0;
}
 
        C. Ternary XOR
嚶嚶嚶
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
//#define int ll
ll a,b,c,t,n;
string s,ans;
signed main(){
	cin>>t;
	while(t--){
		cin>>n;
		cin>>s;
		ans.assign(s.size(),'0');
		repeat(i,0,n){
			if(s[i]=='2')
				ans[i]='1';
			else if(s[i]=='0')
				ans[i]='0';
			else{
				ans[i]='1';
				break;
			}
		}
		cout<<ans<<endl;
		repeat(i,0,n)
			cout<<char((s[i]-ans[i]+3)%3+'0');
		cout<<endl;
	}
	return 0;
}
 
        D. Carousel
好了不嚶了
題意是所有相鄰的不同類必須不同色。如果把相鄰的同類縮成一點(比如 \([1,1,2,2,2]\) 縮成 \([1,2]\)),這樣可以通過縮完后序列長度奇偶性判斷是否可行(全是一類的1種顏色,偶數就2種顏色,奇數就3種顏色)
(當然我代碼里沒縮點,只是這么解釋的)
當然這么寫會瘋狂wa2,因為如果 \([1,2,3,3]\) 也是可以用兩種顏色染色的(\([1,2,1,2]\)),我們發現相鄰的同一類也能染不同色的規則是有用的(!!)於是要特判一下
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
//#define int ll
ll t,n;
int a[N];
void output(int c1,int c2,int c3){ //c1,c2,c3都是可用的顏色,c3還代表了顏色數
	int c=c3;
	cout<<c3<<endl;
	int now=a[0];
	repeat(i,0,n){
		if(now==a[i]);
		else if(c==c1)c=c2;
		else c=c1;
		cout<<c<<' ';
		now=a[i];
	}
	cout<<endl;
}
signed main(){
	cin>>t;
	while(t--){
		cin>>n;
		repeat(i,0,n)cin>>a[i];
		a[n]=a[0];
		int cnt=0;
		repeat(i,0,n){
			if(a[i]!=a[i+1])cnt++;
		}
		if(cnt==0)output(1,1,1);
		else if(cnt%2==0)output(1,2,2);
		else if(cnt==n)output(1,2,3);
		else{ //最后一種情況
			repeat(i,0,n){
				if(a[i]==a[i+1]){
					a[i]=1e9; //染上一種獨特的顏色
					break;
				}
			}
			output(1,2,2);
		}
	}
	return 0;
}
 
        E. Tree Queries
前置芝士:最近公共祖先(lca)
首先經過一系列復雜的計算我們發現,這條鏈完全可以是從0到 \(v_t\)(\(dep[v_t]\ge dep[v_i]\) for \(i=1..k\),說人話:給定點里最深的那個)
既然鏈都確定了,就差判定了。我們求出 \(v_i\) 和 \(v_t\) 的最近公共祖先 \(v_{lca}\),可知 \(v_{lca}\) 一定在鏈上,因此判斷 \(v_i\) 與鏈的距離是否小於等於1就是看 \((v_i==v_{lca})\) 或者 \((v_i\) 的父親結點 \(==v_{lca})\)
這樣時間復雜度能控制在 \(O(n+(\sum k) \log n)\)(如果和我一樣用樹剖的話)
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll;
const int N=200010;
//#define int ll
int n,m;
vector<int> e[N];
int dep[N],son[N],sz[N],top[N],fa[N]; //son重兒子,top鏈頂
//lca板子開始
//這是樹剖版的lca,主要是我只有兩個lca板子其中一個還掛了qwq
void dfs1(int x){ //標注dep,sz,son,fa
	sz[x]=1;
	son[x]=-1;
	dep[x]=dep[fa[x]]+1;
	for(auto p:e[x]){
		if(p==fa[x])continue;
		fa[p]=x; dfs1(p);
		sz[x]+=sz[p];
		if(son[x]==-1 || sz[son[x]]<sz[p])
			son[x]=p;
	}
}
void dfs2(int x,int tv){ //標注top
	top[x]=tv;
	if(son[x]!=-1)dfs2(son[x],tv);
	for(auto p:e[x]){
		if(p==fa[x] || p==son[x])continue;
		dfs2(p,p);
	}
}
void init(int s){ //s是根
	fa[s]=s;
	dfs1(s);
	dfs2(s,s);
}
int lca(int x,int y){
	while(top[x]!=top[y])
		if(dep[top[x]]>=dep[top[y]])x=fa[top[x]];
		else y=fa[top[y]];
	return dep[x]<dep[y]?x:y;
}
//lca板子結束
int q[N];
signed main(){
	cin>>n>>m;
	repeat(i,0,n-1){
		int x,y; cin>>x>>y; x--,y--;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	fa[0]=-1; init(0);
	while(m--){
		int s; cin>>s;
		int deepest=0;
		repeat(i,0,s){
			cin>>q[i],q[i]--;
			if(dep[deepest]<dep[q[i]])
				deepest=q[i];
		}
		bool f=1;
		repeat(i,0,s){
			int ancestor=lca(q[i],deepest);
			if(ancestor==q[i] || ancestor==fa[q[i]]);
			else f=0;
		}
		cout<<(f?"YES":"NO")<<endl;
	}
	return 0;
}
 
        F. Make k Equal
這是個毒瘤題,寫了近一個小時,毒瘤
毒瘤歸毒瘤我1a還是挺高興的
分3種情況,所有數都壓到中位數,從小壓到大,從大壓到小
第一種情況就是……怎么說呢,反正中位數是最理想的
后兩種情況開個map維護一下比較方便(我覺得)
辣雞代碼警告(別怪我沒警告你o)(最后一題我怎么只寫了這么點題解呢)
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
#define fi first
#define se second
int cansel_sync=[]{ios::sync_with_stdio(0); cin.tie(0); return 0;}();
typedef long long ll; ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
const int N=200010;
#define int ll
int a[N];
map<int,int> m,m2;
signed main(){
	int n=read(),k=read();
	repeat(i,0,n)a[i]=read();
	sort(a,a+n);
	repeat(i,0,n){
		m[a[i]]++;
		if(!m.count(a[i]-1))m[a[i]-1]=0;
		if(!m.count(a[i]+1))m[a[i]+1]=0;
	}
	for(auto i:m)if(i.se>=k)cout<<0,exit(0);
	m2=m;
	
	int mid=a[(n-1)/2];
	ll nowl=0,nowr=0;
	repeat(i,0,n){
		if(a[i]<mid){
			nowl+=mid-a[i];
		}
		if(a[i]>mid){
			nowr+=a[i]-mid;
		}
	}
	
	ll now0=nowl+nowr-(n-k);
	
	ll now1=0;
	for(auto i=m.begin();i!=m.end();i++){
		if(i->se>=k)break;
		auto nxt=i; nxt++;
		if(nxt->se+i->se>=k){
			now1+=1ll*abs(nxt->fi-i->fi)*(k-nxt->se);
			break;
		}
		nxt->se+=i->se;
		now1+=1ll*abs(nxt->fi-i->fi)*(i->se);
	}
	
	m=m2;
	
	ll now2=0;
	for(auto i=m.rbegin();i!=m.rend();i++){
		if(i->se>=k)break;
		auto nxt=i; nxt++;
		if(nxt->se+i->se>=k){
			now2+=1ll*abs(nxt->fi-i->fi)*(k-nxt->se);
			break;
		}
		nxt->se+=i->se;
		now2+=1ll*abs(nxt->fi-i->fi)*(i->se);
	}
	cout<<min(now0,min(now1,now2));
	return 0;
}
 
       