Codeforces Round #784 (Div. 4)#蒻枸题解

A


B 输出出现次数大于3的 数 else -1


C 每次操作 奇数位+1 or 偶数位 +1 使得最后 只有 偶数 或 只有奇数

        所以 只要 奇数位 有奇数&& 有偶数 or 偶数位 有奇数 &&有偶数  输出no esle yse


D 染色题 每次选择两位进行染色 可知 在一段区间内 绝对是不完全一样的

每一段是两个W之间 or 开头-W or W-结尾 记住这个结论直接on判断即可

#include<bits/stdc++.h>

using namespace std;
map<int,int>mp;
int main(){
	
//	
	int t; cin>>t;
	while(t--){
		int n; cin>>n;
		
		string s; cin>>s;
		
		int flag=0;
		int b,r;
		b=0,r=0;
		for(int i=0;i<n;i++){
			if(s[i]=='W') {
				//flag=0;
				
				if((b&&!r)||(r&&!b)){
					flag=1; cout<<"NO"<<endl; break; 
				} 
				b=r=0;continue;
			}else if(s[i]=='B'){
				b=1;
			}else{
				r=1;
			}
			if(i==n-1){
				if((b&&!r)||(r&&!b)){
					flag=1; cout<<"NO"<<endl; break; 
				} 
			}
			
		}
		
		if(!flag) cout<<"YES"<<endl;
				
	}
	return 0;
}

E       \sum(i,j) i<j   s[i][0] == s[j][0]&&s[i][1] != s[j][1]  ||   s[i][0] != s[j][0]&&s[i][1] == s[j][1]

        map 存储         因为 有一个一样的 一个不一样的  所以 以这个一样的为基础 模拟那个不一              样的即可

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int maxn=1e6;

#define inf 0x3f3f3f


map<string,int>mp;	
string s[100060];
int main(){
	
//	
	int t; cin>>t;
	while(t--){
		int n; cin>>n;
		for(int i=1;i<=n;i++){
			//string s; cin>>s;
			cin>>s[i];
			mp[s[i]]++;
		}
		ll sum=0;
		
		for(int i=1;i<=n;i++){
			
			mp[s[i]]--;
			string tmp="aa";
			char tt='a';
			tmp[0]=s[i][0];
			for(int j=0;j<=10;j++){
				tmp[1]=char(tt+j);
				if(tmp==s[i]) continue;
				sum+=mp[tmp];
			}
			tmp="aa";
			tt='a';
			tmp[1]=s[i][1];
			for(int j=0;j<=10;j++){
				tmp[0]=char(tt+j);
				if(tmp==s[i]) continue;
				sum+=mp[tmp];
			}
			//sum+=n-i-mp[s[i]];
		}
		cout<<sum<<endl;
	}
	return 0;
}

F  左右开弓 模拟 维护


G  模拟  从下往上找即可

        

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int maxn=1e6;

#define inf 0x3f3f3f


map<string,int>mp;	
string s[100060];
ll a[200006];
int main(){
	
//	
	int T ; cin>>T;
	while(T--){
		int n,m; cin>>n>>m;
		for(int i=0;i<n;i++) cin>>s[i];
		
		for(int i=n-1;i>=1;i--){
			for(int j=0;j<m;j++){
				if(s[i][j]=='.'){
					for(int k=i-1;k>=0;k--){
						if(s[k][j]=='o') break;
						if(s[k][j]=='*') {
							//break;
							s[k][j]='.';
							s[i][j]='*';
							break;
						} 
					}
				}
			}
		}
		
		for(int i=0;i<n;i++){
			cout<<s[i]<<endl;
		}
	}
	return 0;
}

H

        二进制思想

        我们可以知道  他的最大二进制位数 31位 2^0 - 2^30

        把每一个数 转化成 二进制  遍历这个二进制数 如果这一位为0 那么记录下来

        我们知道  最后结果是 所有数 and 

        如果 某一位为0 那么 所有数and  的话  这一位也都是0

        所以 我们从30位 开始遍历  如果操作数 大于目前的0的个数 那么就可以置1

        这也属于贪心思想   如果操作数<该位0的个数 那么  你or再多的1 也是无用的

        还有就是 如果该位没有0 说明 所有数在该位都是1 and 后也是1 所以直接+pow(2,i)即可

        

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int maxn=1e6;

#define inf 0x3f3f3f


map<string,int>mp;	
string s[100060];
ll a[200006];
ll num[1000];
int main(){
	
//	
	int T ; cin>>T;
	while(T--){
		memset(num,0,sizeof(num));
		int n,m; cin>>n>>m;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			ll k= a[i];
			int cnt=0;
		//	if(a[i]==0) num[0]++;
			
			while(k){
				if(k%2==0)
				num[cnt]++;
				cnt++;
				k/=2;
			}
			for(int j=cnt;j<=30;j++) num[j]++;
		}
		ll sum=0;
		for(int i=30;i>=0;i--){
			if(num[i]){
				if(m>=num[i]){
					m-=num[i];
					sum+=pow(2,i);
				}
			}else{
				sum+=pow(2,i);
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

我只能沦落到做div4了

裂了裂了

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛郎恋刘娘,刘娘念牛郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值