Codeforces Round 817 (Div. 4)

A - Spell Check

考察是否只有这几个字符出现。用map记录一下即可。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>

char a[5]={'T','i','r','m','u'};
void solve()
{
	int n;
	cin>>n;
	string s;
	cin>>s;
	if(n!=5){
		cout<<"No"<<endl;
		return ;
	}
	map<char ,int> mp;
	
	for (int i=0;i<n;i++){
		mp[s[i]]++;
	}
	for (int i=0;i<5;i++){
		if(mp[a[i]]!=1){
			cout<<"NO"<<endl;
			return ;
		}
	}
	
	cout<<"Yes"<<endl;
	
}
signed main()
{
	IOS
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

B - Colourblindness

简单的遍历一下,将特殊的情况考虑到即可。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>

char a[2][110];
void solve()
{
	int n;
	cin>>n;
	
	for (int i=0;i<2;i++){
		for (int j =0;j<n;j++){
			cin>>a[i][j];
		}
	}
	
	for (int i=0;i<n;i++){
		if(a[0][i]==a[1][i]){
			continue;
		}
		else if (a[0][i]=='G' && a[1][i]=='B'){
			continue;
		}
		else if (a[0][i]=='B' && a[1][i]=='G'){
			continue;
		}
		else {
			cout<<"NO"<<endl;
			return ;
		}
	}
	cout<<"Yes"<<endl;
	
}
signed main()
{
	IOS
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

C - Word Game

任然可以开一个map 记录每个字符串出现的次数,用二维字符串来将记录总的字符串,每次取三个即可。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>


void solve()
{
	int n;
    cin>>n;
    vi a(3);
    string s[3];
	map<string,int> mp;
	for (int i=0;i<3;i++){
		for (int j=1;j<=n;j++){
			string s1;
			cin>>s1;
			mp[s1]++;
			s[i]+=s1;
		}
	}
	
	for (int i=0;i<3;i++){
		for (int j=0;j<s[i].size();j+=3){
			string s1="";
			s1+=s[i][j];
			s1+=s[i][j+1];
			s1+=s[i][j+2];
			if(mp[s1]==1){
				a[i]+=3;
				
			}
			else if (mp[s1]==2){
				a[i]+=1;
			}
			
		}
	}
	for (int i=0;i<3;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	

	
}
signed main()
{
	IOS
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

D - Line

先将未改变之前的总数记录,然后枚举每一位并记录改变后对于总数的贡献,并对这个记录的数组进行排序,将最大贡献的排在前面。最后在按位进行相加即可。(当贡献小于0时,可以选择不加上这个贡献)。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>


void solve()
{
	int n;
	cin>>n;
	string s;
	cin>>s;
	vi a(n);

	int ans=0;
	for (int i=0;i<n;i++){
		if(s[i]=='L'){
			ans+=i;
			a[i]+=(n-1-i)-i;
		}
		else {
			ans+=n-1-i;
			a[i]+=i-(n-1-i);
		}
	}
	
	sort(all(a),greater());
	
	for (int i=0;i<n;i++){
		ans+=max((int)0,a[i]);
		cout<<ans<<" ";
	}
	cout<<endl;
	

	
}
signed main()
{
	IOS
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

E - Counting Rectangles

这题可以采用二维前缀和的做法。将高作为行,宽作为列,用坐标记录这样一个矩形的面积。

最后只要求出右下角坐标位(hb-1,wb-1) 左上角坐标位(hs+1,ws+1)的前缀和数组的面积即可。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>

const int N= 100010;
int  a[1010][1010];
int s[1010][1010];
void solve()
{
	int n,q;
	cin>>n>>q;
	
	for (int i=0;i<=1000;i++){
		for (int j=0;j<=1000;j++){
			a[i][j]=s[i][j]=0;
		}
	}
	for (int i=1;i<=n;i++){
		int h,w;
		cin>>h>>w;
		a[h][w]+=h*w;
	}
	
	for (int i=1;i<=1000;i++){
		for (int j=1;j<=1000;j++){
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
		}
	}
	
	for (int i=1;i<=q;i++){
		int h1,h2,w1,w2;
		cin>>h1>>w1>>h2>>w2;
		
		cout<<s[h2-1][w2-1]-s[h2-1][w1]-s[h1][w2-1]+s[h1][w1]<<endl;
	}
	
}
signed main()
{
	IOS
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

G - Even-Odd XOR

题意位奇数位上的数异或和等于偶数位上的数的异或和。可理解为总异或和为0。

所以改为要求一个没有重复的数的异或和为0的序列。

可以先从第一位到第n-3 为放任意不相等的数,可以为1--n-3. 但前n-3 位的异或和不能等于n-2 位。所以如果前n-3 位的异或和等于n-2 位就放另一个没出现过的数 eg:n-1 .

此时还要注意一个问题,就是前n-2 位的异或和要等于第n位数,但第n位数不能出现过。所以我们可以将d第n-2 位数设为一个极大的数(2^30) 这样的话可以保证第三十位始终不被占用从而使得第n位不出现过。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>

void solve()
{
	int n;
	cin>>n;
	
	vi a;
	int sum=0;
	for (int i=1;i<=n-3;i++){
		a.push_back(i);
		sum^=i;
	}
	
	if((sum^(n-2))==0){
		sum^=(n-1);
		a.push_back(n-1);
	}
	else {
		a.push_back(n-2);
		sum^=(n-2);
	}
	
	a.push_back(1<<30);
	sum^=(1<<30);
	
	a.push_back(sum);
	
	for (auto x : a){
		cout<<x<<" ";
	}
	cout<<endl;
}
signed main()
{
	IOS
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值