首页 > 其他分享 >Pinely Round 2 (Div. 1 + Div. 2)

Pinely Round 2 (Div. 1 + Div. 2)

时间:2023-08-31 18:55:05浏览次数:40  
标签:std PII typedef cout int Pinely long Div Round

Pinely Round 2 (Div. 1 + Div. 2)

比赛链接
因为第二天早上满课,所以这个比赛没有打,但是补题还是要有的。

A题Channel

A题链接
你是一个博主,有n个订阅者,当你发表了一篇博客时,会被订阅者看到,一开始有a名订阅者在线,随后给你q个指令,“+”代表有一个订阅者上线,“-”代表有一个订阅者下线,你想知道是否全部订阅者都阅读过你的文章,YES表示肯定,MAYBE表示也许,NO表示没有,

A思路:

一开始这个题会错意了,以为减号代表的有可能不是他的订阅者下线,但应该是都是订阅者的信息,接下来就是这个题的思路:如果是YES,那一定是有一段全部是+号,表示有这么一段序列全是加号,并且长度大于n个订阅者。如果是NO呢,就是即使我们下线的全是之前在线的,一开始在线的订阅者加上+号的数量还要小于n,这表明绝不可能出现全部查看的情况,其他情况均是MAYBE。

A代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
	int n,a,q;
	cin>>n>>a>>q;
	int m=a;
	int maxn=a;
	int ans=0;

	for(int i=1;i<=q;i++){
		char b;
		cin>>b;
		if(b=='+'){
			m++;
			maxn=max(maxn,m);
			ans++;

		}
		else{
			m--;

		}
	}
	if(maxn>=n){
		cout<<"YES"<<endl;
	}
	else{
		if(a+ans>=n){
			cout<<"MAYBE"<<endl;
		}
		else{
			cout<<"NO"<<endl;
			
		}
	}
}
int main(){
	int t;
	cin>>t;
	// cout<<t<<endl;
	while(t--){
		solve();
	}
	return 0;
}

B. Split Sort

题目链接
给定一个序列a,你可以进行操作:选择一个数 x ,将所有 比 x 小的数按照序列中的顺序放到 x 前面 , 将所有大于等于 x 的数 按照序列中的顺序放到 x 后面。求整个序列满足单增的最小操作数。

B思路:

一开始我以为只需要找到一个位置他的前一个数比当前数的位置大,那这个点就是需要交换的,但这样想是错的,倒不是思路错,只是无法满足是最小操作数,看样例发现,当我们改变一个数的位置的时候,有些数的位置也会改变,事实上这个题的操作于逆序对有关,操作数为整个序列中 i 和 i + 1 位置的逆序对数量。

B代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
bool cmp(PII a,PII b){
	return a.first<b.first;

}

void solve(){
	int n;
	cin>>n;
	int ans1=0;

	std::vector<PII> v(n+1);
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;

		v[i].first=x;
		v[i].second=i;
		if(x<v[i-1].first){
			ans1++;

		}
	}
	sort(v.begin(),v.end(),cmp);
	int ans=0;
	if(n==1){
		cout<<0<<endl;
	}
	else{
		for(int i=2;i<=n;i++){
			if(v[i].second<v[i-1].second){
				ans++;
			}
		}
		cout<<ans<<" "<<ans1<<endl;
		
	}
}
int main(){
	int t;
	cin>>t;
	// cout<<t<<endl;
	while(t--){
		solve();
	}
	return 0;
}

C. MEX Repetition

题目链接
给定一个长度为n,大小在[0,n]的没有相同元素的序列,总共进行k轮操作,每轮操作将按照顺序从i=1~n,使得ai=MEX(a1,a2,a3,...)。其中MEX函数代表了所有数当中没有出现的最小非负整数。例如:MEX(1,1,2)=0,MEX(0,1,2)=3。求k轮操作后序列变成了什么样子,

C思路:

一开始我竟然没有读懂这个题是在说什么,果然中午没睡觉太困啦影响脑子转动,睡醒一觉醒来发现这个题还是比较简单的,但是如果只是简单的模拟的话其实是会超时的,我们不妨将这n+1个数字按照他规定的方式进行展开,这样说可能不太明显,画个图就比较易懂了。
image

C代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
bool cmp(PII a,PII b){
	return a.first<b.first;

}

void solve(){
	int n,k;
	cin>>n>>k;
	std::vector<int> v;
	std::map<int, int> mp;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		mp[x]=1;
		v.push_back(x);

	}
	for(int i=0;i<=n;i++){
		if(mp[i]!=1){
			v.push_back(i);

		}
	}
	//y因为是0-n有n+1个数字
	n+=1;
	int t=k%n;//看看是取到了哪个位置
	int st=n-t;
	for(int i=1;i<n;i++){
		cout<<v[st%n]<<" ";
		st++;

	}
	cout<<endl;

}
int main(){
	int t;
	cin>>t;
	// cout<<t<<endl;
	while(t--){
		solve();
	}
	return 0;
}

D. Two-Colored Dominoes

原题链接
有一个n * m 的网格。其中有若干个1 * 2的多米诺骨牌横着放或者竖着放在其中,你需要将其一格涂成黑色,一格涂成白色。需要满足一行当中白色的格子等于黑色的格子,一列当中白色的格子等于黑色的格子。问能否涂成每行和每列黑白颜色数目相等的样子,可以输出画法,不可以输出-1;

D思路:

这个题也并不是很难,你想如果横着放是不是影响到的就是两列,竖着放影响到的就是两行,基于这个的基础上,我们可以对这些按照一黑一白和一白一黑插着放,这样就保证了颜色相等,所以我们只需要统计一下对应行列中横竖放着的个数就可以。

D代码:

#include<bits/stdc++.h>
using namespace std;
const int N=510;
typedef long long ll;
typedef pair<int,int> PII;
bool cmp(PII a,PII b){
	return a.first<b.first;

}
char a[N][N];

void solve() 
{
	int n , m;
	cin>>n>>m;
	vector<int>row[m] , column[n];
	for(int i = 0 ; i < n ; i ++){
		for(int j = 0 ; j < m  ; j ++){
			cin>>a[i][j];
			if(a[i][j] == 'L'){
				row[j].push_back(i);
			}
			if(a[i][j] == 'U'){
				column[i].push_back(j);
			}
		}
	}
	for(int i = 0; i < m ; i++){
		if(row[i].size() % 2 == 1){
			cout<<"-1\n";
			return;
		}
		else{
			int t = row[i].size();
			int flag = 1;
			for(int j = 0 ; j < t ; j ++){
				int r = row[i][j];
				if(flag == 1){
					a[r][i] = 'W';
					a[r][i + 1] = 'B';
					flag *= -1;
				}
				else{
					a[r][i] = 'B';
					a[r][i + 1] = 'W';
					flag *= -1;
				}
			}
		}
	}
	for(int i = 0 ; i < n ; i ++){
		if(column[i].size() % 2 == 1){
			cout<<"-1\n";
			return;
		}
		else{
			int t = column[i].size();
			int flag = 1;
			for(int j = 0 ; j < t ; j ++){
				int c = column[i][j];
				if(flag == 1){
					a[i][c] = 'W';
					a[i + 1][c] = 'B';
					flag*=-1;
				}
				else{
					a[i][c] = 'B';
					a[i + 1][c] = 'W';
					flag*= -1;
				}
			}
		}
	}
	for(int i = 0 ; i < n ; i++){
		for(int j = 0;  j < m ; j ++){
			cout<<a[i][j];
		}
		cout<<endl;
	}
}     
int main(){
	int t;
	cin>>t;
	// cout<<t<<endl;
	while(t--){
		solve();
	}
	return 0;
}

标签:std,PII,typedef,cout,int,Pinely,long,Div,Round
From: https://www.cnblogs.com/du463/p/17670227.html

相关文章

  • Educational Codeforces Round 148 (Rated for Div. 2)E. Combinatorics Problem(组合
    题目链接:https://codeforces.com/contest/1832/problem/E 题意:  当然这是化简后的题意,原题面和这个差距还是有点大的; 分析: 因为组合数有公式:  所以:   嗯,然后就没有了; 时间复杂度:O(n*k); 代码: #include<bits/stdc++.h>#defineintlonglong......
  • P9437 『XYGOI round1』一棵树 题解
    首先这是一道很明显的换根dp。首先注意到要拼接数,所以我们可以先处理出\(num_i=10^{x}\),使得\(10^x>a_i>10^{x-1}\),这样方便我们后面算贡献。我们以这棵树为例子来推状态转移方程。先假设\(dp_u\)表示以\(1\)为根时,从\(u\)的子树的点到\(u\)的权值和。那么\[......
  • C-小美的01串翻转_牛客周赛 Round 9
    链接:https://ac.nowcoder.com/acm/contest/63869/C来源:牛客网题目描述小美定义一个01串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。例如,"10001"的权值是1,因为只需要修改一次:对第三个字符取反即可。现在小美拿到了一个01......
  • CF1864C Divisor Chain
    思路刚拿到题,想了一些方法但都被推翻了,在这里列举出来,并给出反例:每次减去最小的因数,反例:\(1024\)等形如\(a^k\)的数,每次都会减去\(a\)导致\(a\)的出现次数超过\(2\)次。每次减去大于等于\(\sqrtx\)的因子,\(x\)为目前的数,并特判指数的情况,反例:\(35\)等由两个......
  • Educational Codeforces Round 118
    好烦,又是只有三题,讲课的老师实在是太吵了,没法思考细节A题开始还搞麻烦了B题纯诈骗,找最小的做y即可C题直接二分判断即可D题其实没看多久我就秒了,对于当前的数x来说无非就是mex=x-1mex=xmex=x+1\(f[x]\)表示mex=x,后面没有数\(g[x]\)表示mex=x,后面有x+1,并且只可能是x+1,不可......
  • Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)
    A.给三个数\(x\)\(y\)\(n\)。需要构造一个长度为\(n\)的数组满足以下条件\(a_1=x\),\(a_n=y\)。\(a\)严格递增。定义\(b_i=a_{i+1}-a_{i}\),\(b\)严格递减。显然前两个条件非常宽松,定义好起始点,让\(a\)严格单调递增即可。显然\(b\)是\(a\)的差......
  • Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)
    Preface因为不清空E题调了好久才过,没时间看后面的题了遂2h下机,赛后感觉F还是可做的这周三和周四的CF因为第二天有课可能都要开另一个小号随便打打了,毕竟有早八还打到两点钟实在是顶不住的说A.IncreasingandDecreasing从后往前贪心地确定每个数,最后检验下即可#include<cst......
  • Codeforces Round 888 (Div. 3)G. Vlad and the Mountains(数据结构,图论)
    题目链接:https://codeforces.com/contest/1851/problem/G 大致题意: 给出n个点m条边的无向图,每个点有点权h【i】。从点i到点j会消耗h【j】-h【i】的能量,如果小于0,那么就是恢复对应绝对值的能量。 进行q次询问,每次询问包含起点s,终点t,能量e,能量在移动过程中不能小......
  • Codeforces Round 887 (Div. 1)C. Ina of the Mountain(数据结构,反悔贪心)
    题目链接:https://codeforces.com/problemset/problem/1852/C 题意: 给定一个长度为n的序列和正整数k; 每次可以选取任意一个区间,将区间内每个数减1; 如果出现一个数变成0,那么那个数变成k; 问至少操作多少次可以使得每个数变成k; 分析: 将每个数值抽象为对应高度的......
  • Codeforces Round 892 (Div. 2)E. Maximum Monogonosity(动态规划,数学)
    题目链接:https://codeforces.com/contest/1859/problem/E 题意: 有长度为n的a和b俩个序列,定义f【l,r】=abs(a【l】-b【r】)+abs(b【l】-a【r】); 给正整数k,求 不相交的区间且  所有  区间的长度 的 和 为k的最大值 是多少? 分析: 这里借鉴一个佬......