Codeforces Round #482 (Div. 2)

题目链接:Codeforces Round #482 (Div. 2)


A:特判n为0的情况即可,否则判断奇偶。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
signed main(){
	cin>>n;
	if(n==0)	return puts("0"),0;
	if(n&1)	cout<<(n+1)/2;
	else	cout<<n+1; 
	return 0;
}

B:因为可以持续n回合,所以把n加上判断即可,特判本身一个字符串就全部为同一字符的情况。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,cnt[3][300];
string str[3],name[3];
struct node{int mx,id;}t[3];
int cmp(node a,node b){return a.mx>b.mx;}
signed main(){
	name[0]="Kuro",name[1]="Shiro",name[2]="Katie";
	cin>>n;
	for(int i=0;i<3;i++){
		cin>>str[i];
		for(int j=0;j<str[i].size();j++)	
			cnt[i][str[i][j]]++,t[i].mx=max(t[i].mx,cnt[i][str[i][j]]);
		t[i].id=i;
		if(n==1&&t[i].mx==str[0].size())	t[i].mx=str[0].size()-1;
		else	t[i].mx=min(t[i].mx+n,(int)str[0].size());
	}
	sort(t,t+3,cmp);
	if(t[1].mx==t[0].mx)	puts("Draw");
	else	cout<<name[t[0].id];
	return 0;
}

C:很明显就是找到x的子树size,和y的子树size,然后就可以算出不合法的路径,用总路径减去即可。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,x,y,vis[N];
vector<int> g[N];
int bfs(int x,int y){
	queue<int> q;	int res=1;	q.push(x);	memset(vis,0,sizeof vis);	vis[x]=1;
	while(q.size()){
		int u=q.front();	q.pop();
		for(int i=0;i<g[u].size();i++){
			int to=g[u][i];	if(vis[to]||to==y)	continue;
			vis[to]=1;	res++;	q.push(to);
		}
	}
	return n-res;
}
signed main(){
	cin>>n>>x>>y;
	for(int i=1,a,b;i<n;i++)
		scanf("%lld %lld",&a,&b),g[a].push_back(b),g[b].push_back(a);
	int sz1=bfs(x,y),sz2=bfs(y,x);
	cout<<n*(n-1)-sz1*sz2;
	return 0;
}

D:建立1e5个Trie,然后每次从因子当中找Trie即可,求得最大异或值。

AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int q,t[N*30][2],mi[N*30],rt[N],idx,op,x,y,z;
vector<int> v[N];
inline void add(int x,int pos){
	int p=rt[pos];
	for(int i=16;i>=0;i--){
		int k=(x>>i)&1;
		if(!t[p][k])	t[p][k]=++idx;
		mi[p]=min(mi[p],x);	p=t[p][k];
	}
	mi[p]=min(mi[p],x);
}
inline int ask(int x,int s,int pos){
	if(x%y!=0||s<=x||mi[rt[pos]]>s-x)	return -1;	int p=rt[pos],res=0;
	for(int i=16;i>=0;i--){
		int k=(x>>i)&1;
		if(k==1){
			if(t[p][0])	p=t[p][0];
			else	p=t[p][1],res+=(1<<i);
			continue;
		}
		if(!t[p][1]){p=t[p][0];	continue;}
		if(mi[t[p][1]]+x<=s){
			p=t[p][1];	res+=(1<<i);
		}else	p=t[p][0];
	}
	return res;
}
inline void get(){
	for(int i=1;i<=1e5;i++){
		for(int j=i;j<=1e5;j+=i)	v[j].emplace_back(i);
	}
}
inline void solve(){
	scanf("%d %d",&op,&x);
	if(op==1){
		for(int i=0;i<v[x].size();i++)	add(x,v[x][i]);
	}else{
		scanf("%d %d",&y,&z);
		printf("%d\n",ask(y,z,y));
	}
}
signed main(){
	cin>>q;	get();	memset(mi,0x3f,sizeof mi);
	for(int i=1;i<=1e5;i++)	rt[i]=++idx;
	for(int i=1;i<=q;i++)	solve();
	return 0;
}
发布了434 篇原创文章 · 获赞 234 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/103956908
今日推荐