Codeforces 888 div3 A-G
创始人
2024-11-14 15:34:01
0

A. Escalator Conversations

分析

二者身高差为k的倍数且不超过m-1倍,身高差不能为0(即不能在同一个阶梯)

C++代码

#include using namespace std; void solve(){ 	int n,m,k,H,ans=0; 	cin>>n>>m>>k>>H; 	for(int i=0;i>x; 		if(H!=x&&abs(H-x)%k==0&&abs(H-x)/k<=m-1)ans++; 	} 	cout<>t; 	while(t--){ 		solve(); 	} 	return 0; } 

B. Parity Sort

分析

把奇数和偶数分开排序,然后依次填充原数组奇数和偶数的地方,判断是否有前面的数大于后面的情况,如果有,则输出NO

C++代码

#include #include #include using namespace std; void solve(){ 	int n; 	cin>>n; 	vector s(n+5,0),a,b; 	for(int i=1;i<=n;i++){ 		cin>>s[i]; 		if(s[i]%2)b.push_back(s[i]); 		else a.push_back(s[i]); 	} 	sort(a.begin(),a.end()); 	sort(b.begin(),b.end()); 	int ia=0,ib=0,flag=0; 	for(int i=1;i<=n;i++){ 		if(s[i]%2==0)s[i]=a[ia++]; 		else s[i]=b[ib++]; 		if(s[i]>t; 	while(t--){ 		solve(); 	} 	return 0; }

C. Tiles Comeback

分析

k=1,直接从a[1]跳到a[n]

k!=1

1、a[1]==a[n],找有没有k个a[1]即可

2、a[1]!=a[n],找k个a[1]和k个a[n]且要按顺序

C++代码

#include using namespace std; void solve(){ 	int n,k; 	cin>>n>>k; 	int a[n+5]; 	for(int i=1;i<=n;i++)cin>>a[i]; 	if(k==1)puts("YES"); 	else if(a[1]==a[n]){ 		int sum=0; 		for(int i=1;i<=n;i++) 			if(a[i]==a[1])sum++; 		if(sum>=k)puts("YES"); 		else puts("NO"); 	}else{ 		int cnt1=1,cnt2=1,l=n; 		for(int i=2;i<=n;i++){ 			if(a[i]==a[1])cnt1++; 			if(cnt1==k){ 				l=i; 				break; 			} 		} 		for(int j=n-1;j>l;j--) 			if(a[j]==a[n])cnt2++; 		if(cnt2>t; 	while(t--){ 		solve(); 	} 	return 0; }

D. Prefix Permutation Sums

分析

对于给定的数组a,找出它的原数组s

因为a只丢了一个元素,所以原数组的1~n的排列中一定有两个数没出现,如果大于两个元素,则原数组不存在

对原数组的每个小于等于n的元素标记出现过,如果元素出现次数大于1或者元素>n,就用cnt记录下来;接下来找出未出现过的两个数的和sum,如果等于cnt,则表示原数组存在,否则不存在

C++代码

#include #include using namespace std; typedef long long LL; void solve(){ 	int n; 	cin>>n; 	LL a[n+5]={0},b[n+5]={0},cnt=0,flag=0; 	for(int i=1;i>a[i]; 	vector s; 	for(int i=1;i1)cnt=s[i]; 		}else cnt=s[i]; 	} 	LL sum=0,k=0; 	for(int i=1;i<=n;i++) 		if(!b[i])k++,sum+=i; 	if(k>2||k==2&&sum!=cnt)flag=1; 	if(!flag)puts("YES"); 	else puts("NO");  } int main(){ 	int t; 	cin>>t; 	while(t--){ 		solve(); 	} 	return 0; }

E. Nastya and Potions

分析

一个药水x可以被几种药物混合制成就建几条指向x的边,建完边后就用拓扑排序做,所有入度为0的药水的价格只能是它本身的价格,入度不为0的价格可以由其他的药水混合制成,最终的最低价格为min(直接买的价格,由其他药水混合的价格)

C++代码

#include #include using namespace std; typedef long long LL; const int N=200010; int h[N],e[N],ne[N],idx; LL a[N],d[N],w[N]; int n,k; void add(int a,int b){ 	e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void solve(){ 	cin>>n>>k; 	for(int i=1;i<=n;i++) 		h[i]=-1,w[i]=0,d[i]=0; 	idx=0; 	for(int i=1;i<=n;i++)cin>>a[i]; 	while(k--){//输入所有无限免费供应的药水 		int x; 		cin>>x; 		a[x]=0; 	} 	for(int i=1;i<=n;i++){ 		int m,x; 		cin>>m; 		while(m--){ 			cin>>x; 			add(x,i); 			d[i]++;//i的入度加一 		} 	} 	queue q; 	for(int i=1;i<=n;i++)         //入度为0的药水的价格只能是它本身的价格,不能由别的药水混合制成 		if(!d[i])w[i]=a[i],q.push(i); 	while(q.size()){ 		int t=q.front(); 		q.pop(); 		w[t]=min(w[t],a[t]);//更新药水t的价格 		for(int i=h[t];i!=-1;i=ne[i]){ 			int j=e[i]; 			w[j]+=w[t];//计算药水j由别的药水混合所需的价格 			if(--d[j]==0)q.push(j); 		} 	} 	for(int i=1;i<=n;i++)cout<>t; 	while(t--){ 		solve(); 	} 	return 0; }

F. Lisa and the Martians

分析

求(a[i]^x)&(a[j]^x)的最大值,即a[i]^x和a[j]^x的二进制数相同的位置尽可能多且尽可能在高位,即a[i]和a[j]二进制相同的位置尽可能多,即不同的位置尽可能少且尽可能为低位,

则可以装换成求a[i]^a[j]的最小值

有个常用结论:n个数的最小异或对答案就是排序后最小的相邻异或和

所以直接排序后求最小相邻异或和即可

然后计算t

对于选择的a[i]和a[j],从前往后枚举第0~k-1位,

如果a[i]和a[j]的第i位都是0,则t的第i位一定是1

如果a[i]和a[j]的第i位都是1,则t的第i位一定是0

如果一个0一个1,则t的第i位随意

C++代码

#include #include #include #include #include using namespace std; const int N=200010,INF=2e9; void solve(){ 	int n,k; 	cin>>n>>k; 	vector> a(n); 	for(int i=0;i>x; 		a[i]={x,i+1}; 	} 	sort(a.begin(),a.end()); 	int minn=INF,id1,id2,ai,aj; 	for(int i=0;i>i&1,a2=aj>>i&1; 		//a1=a2=0则x的该位一定是1;  a1!=a2则x的该位可以是0也可以是1,这里当成0; a1=a2=1则x的该位一定是0 		if((a1==0&&a2==0))x+=t; 		t*=2; 	} 	cout<>t; 	while(t--){ 		solve(); 	} 	return 0; } 

G. Vlad and the Mountains

分析

这题在线做法肯定会超时,那么可以用离线做法,先存储所有询问,再统一处理

首先,对于一对询问a,b,e,依题意,不能到达高度大于h[a]+e的山上

所以把每条边的权值设置成连接该边的两点的高度较大值

vector> edge;//按照edge[i]={w,a,b},先是权值,然后是两个点

然后把每条边按照权值从小到大排序

vector> query;//按照edge[i]={h[a]+e,a,b,i},先是h[a]+e,然后两个点,然后是询问的编号

对所有询问按照h[a]+e从小到大排序

然后依次枚举每个询问,每次将权值<=h[a]+e的边加入到并查集,然后判断a和b是否在同一连通块中,如果是,就可以从a走到b,否则不能

C++代码

#include #include #include #include using namespace std; const int N=200010; int p[N],h[N]; int find(int x){ 	if(p[x]!=x)p[x]=find(p[x]); 	return p[x]; } void merge(int a,int b){ 	a=find(a),b=find(b); 	if(a!=b)p[a]=b; } void solve(){ 	int n,m,q; 	cin>>n>>m; 	for(int i=1;i<=n;i++)p[i]=i;//并查集  	for(int i=1;i<=n;i++)cin>>h[i]; 	vector> edge(m);//存储所有的边  	for(int i=0;i>a>>b; 		edge[i]={max(h[a],h[b]),a,b}; 	} 	sort(edge.begin(),edge.end());  	cin>>q; 	vector> query(q); 	for(int i=0;i>a>>b>>e; 		query[i]={h[a]+e,a,b,i}; 	} 	sort(query.begin(),query.end()); 	 	vector ans(q,0); 	int t=0; 	for(auto [h,u,v,i]:query){ 	    //把所有高度小于等于h的点都加入到并查集中 		while(t>t; 	while(t--){ 		solve(); 	}  	return 0; }

相关内容

热门资讯

透视辅助(aa poker)a... 透视辅助(aa poker)aapoker猫腻(透视)总是真的有挂(详细辅助揭秘攻略);暗藏猫腻,小...
透视app(wpK)wpk提高... 透视app(wpK)wpk提高胜率(透视)详细辅助解说技巧(原来真的有挂)运wpk提高胜率辅助工具,...
透视能赢(AAPOKER)aa... 透视能赢(AAPOKER)aapoker俱乐部(透视)一直存在有挂(详细辅助教你教程)暗藏猫腻,小编...
透视黑科技!德州微扑克辅助,(... 透视黑科技!德州微扑克辅助,(云扑克德州)其实存在有挂(详细辅助微扑克教程);1、德州微扑克辅助系统...
辅助透视(wPk)微扑克有辅助... 辅助透视(wPk)微扑克有辅助挂(透视)详细辅助必备教程(好像有挂)1、游戏颠覆性的策略玩法,独创攻...
透视挂(AAPOKeR)aa扑... 透视挂(AAPOKeR)aa扑克辅助(透视)真是是有挂(详细辅助攻略教程)1、实时aa扑克辅助开挂更...
透视软件!德扑ai智能机器人,... 透视软件!德扑ai智能机器人,(德州app)好像是真的有挂(详细辅助技巧教程)透视软件!德扑ai智能...
透视免费(微扑克)wpk有辅助... 透视免费(微扑克)wpk有辅助挂(透视)详细辅助技巧教程(总是真的有挂);1、许多玩家不知道wpk有...
透视好友房(AAPOkER)a... 透视好友房(AAPOkER)aapoker辅助工具存在(透视)切实存在有挂(详细辅助教你攻略)1、a...
透视系统!智星德州菠萝有挂吗,... 透视系统!智星德州菠萝有挂吗,(智星德州)切实有挂(详细辅助透视教程);1、构建自己的智星德州菠萝有...