首页 > 其他分享 >Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)

Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)

时间:2024-02-02 23:22:43浏览次数:25  
标签:Coloring tong int rep Codeforces long vis Wonderful define

思路:
分类讨论:
当一个数字出现的次数大于等于k,那么最多有k个能被染色,
当一个数字出现的次数小于k,南那么这些数字都可能被染色
还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小于k的所有数字的出现次数总和为sum,将所有这些数字排序后,前sum-sum%k个数字是都可以被染色的,按照1~k的顺寻依次染色即可。
主要是有点不太好实现。
对于这种我们需要统计每个数字有多少个,同时还需要保留每个数字的下标信息的我们可以开多个vector去维护
对于不需要的直接开一个桶就行。

#include <bits/stdc++.h> 
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define ls p<<1
#define rs p<<1|1
#define PII pair<int, int>
#define pll pair<long long, long long>
#define ll long long
#define ull unsigned long long
#define db double
#define endl '\n'
#define debug(a) cout<<#a<<"="<<a<<endl;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 0x3f3f3f3f 
#define x first
#define y second

using namespace std;

const int N=2e5+10,mod=1e9+7;
int a[N];
int ans[N];
vector<int>tong[N];
bool vis[N];

void solve()
{
	int n,k;cin>>n>>k;
	rep(i,1,n)
	{
		vis[i]=a[i]=ans[i]=0;
		if(tong[i].size())	tong[i].clear();
	}
	rep(i,1,n)
	{
		int x;cin>>x;
		a[i]=x;
		tong[x].push_back(i);
	}
	vector<int>b;
	rep(i,1,n)
	{
		if(!vis[a[i]]&&tong[a[i]].size()>=k)
		{
			rep(j,1,k)	ans[tong[a[i]][j-1]]=j;
			vis[a[i]]=1;
		}
		else if(!vis[a[i]]&&tong[a[i]].size()>0)
		{
			rep(j,0,tong[a[i]].size()-1)	b.push_back(tong[a[i]][j]);
			vis[a[i]]=1;
		}	
	}
	int ss=b.size();
	rep(i,0,ss-ss%k-1)	ans[b[i]]=(i%k+1);
	rep(i,1,n)	cout<<ans[i]<<' ';
	cout<<endl;
}
signed main()
{
	IOS	
//  	freopen("1.in", "r", stdin);
  	int _;
	cin>>_;
	while(_--)
	solve();
	return 0;
}

参考洛谷上大佬的代码写的显然简洁很多。

int main() {
	int m,n,k;
	cin>>m;
	while(m--){
		int cnt[200005],ans[200005],inp;//cnt统计26个字母的个数,ans存储染色结果
		vector<pair <int,int> > v;
		cin>>n>>k;
		for(int i=0;i<=n;i++){
			ans[i]=0;cnt[i]=0;
		}
		for(int i=0;i<n;i++){
			cin>>inp;		
			//cout<<"cnt[inp]: "<<cnt[inp]<<" ";
			if(cnt[inp]<k){
				v.push_back({inp,i});
			}
            		cnt[inp]++;		
		}
		sort(v.begin(),v.end());//排序,目的是为了避免同个数字被染同样色
		int groups=v.size()/k;//把能染色的个数分成k组,设一次染色过程为把k种颜色各自用一遍,groups就是能有几次染色过程
		for(int i=0;i<groups*k;i++){//gruops*k即为保证用各种颜色次数相等时的最大染色数量
			ans[v[i].second]=i%k+1;//染色
		}
		for(int i=0;i<n;i++) cout<<ans[i]<<" ";
		cout<<endl;
	}
	return 0;
}

标签:Coloring,tong,int,rep,Codeforces,long,vis,Wonderful,define
From: https://www.cnblogs.com/cxy8/p/18004205

相关文章

  • Codeforces Round 919 (Div. 2)
    A一笔带过,维护可能的最大值和最小值,并对于3操作特殊维护一下即可。B枚举第一个人删多少个数(贪心的想,一定删最大的几个,因为假如留着一定会对第二个人有利)第二个人一定是翻的越多越好,且翻的都是最大的几个数。使用前缀和容易计算答案。C妙妙题。枚举\(k\),接着发现\(a_i......
  • Codeforces Round 799 (Div. 4)G. 2^Sort
    暴力枚举每一个端点然后去check显然是复杂度为\(O(n^2)\)是来不及的。我们考虑大区间满足小区间一定满足,用两个指针维护一下当前满足不等式的区间,然后长度达到就计算答案。思路很简单,主要是这类双指针的题目里面的一些细节需要注意为了更好写我们总是先维护区间然后再计算答......
  • Codeforces Round 922 (Div 2)
    CodeforcesRound922(Div.2)A-BrickWall贪心的去想水平的越多越好,k随意改,那么可以构造出没有垂直的,那么计算水平的有几块就行#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineAcodeios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#def......
  • Codeforces Round 922 (Div. 2)
    https://codeforces.com/contest/1918题目很有意思。A~Dvp中过了,但是太太太慢,亟须复健。E赛后过的,交互题真是难调!F看题解过的A.BrickWall*800用砖头砌墙有形状\(1\timesk\)的水平砖和形状\(k\times1\)的竖直砖,要不重不漏地铺满\(n\timesm\)的区域,问水平砖数量......
  • Codeforces Round 922 (Div. 2)
    CodeforcesRound922(Div.2)ps:25分钟AB都over,C给我打破防了、、、讨厌异或、、、我一直以为是数学结果、、、只能说一怒之下怒了一下A.BrickWall想法:要使得稳定性高,那么就多用1*2的砖块就行(A题可以直接找规律,通过样例)#include<bits/stdc++.h>usingnamespacestd;......
  • Codeforces Round 922 (Div. 2) 赛后总结
    自豪的是D题做出来了,悲哀的是B题没能做出来C题的绝对值最小D题,DP存不下状态就把状态放进所求值中比赛快结束的时候,我想,这个B题,它但凡需要我通过归并排序或者树状数组求逆序对,不比C题进制转化要难?于是我就猜了一个结论结论是对的,但不幸的是,我编程实现的时候出错了考虑怎样证......
  • Codeforces Round 770 (Div. 2)(数学异或奇偶性)
    B.FortuneTelling拿到题目看数据范围之后就知道暴力显然是来不及的。那么只能找性质。\(考虑x和x+3的不同\quad奇偶性不同\)\(然后考虑两种操作对于一个数的奇偶性的影响\)\(加法:同奇偶则运算结果是偶,不同则运算结果为奇\)\(异或:惊奇的发现异或也是这样的\)这样我们就......
  • Codeforces Round 922 (Div. 2)
    基本情况A题当时做完提交一直编译错误后面发现是语言选择错误,浪费了五六分钟,然后去做B没想到去看C看了样例感觉可以做,结果干了好久都没出来,倒回去看B还是没做出来,感觉全程很紧张不知道为什么,脚一直在抖。A.BrickWall没啥好说的,就是全部放竖直的,实在不能放了再放横的而且把横......
  • Codeforces Round 921 (Div. 1)
    Preface被折纸狠狠地腐乳了,但好在手速够快光速写完前两题成功把Ohara_Rinne这个号也打上橙了之后就不开其它小号打了,也差不多该尝试去向上挑战了,不然一直呆在舒适圈内也没啥提升的说A.DidWeGetEverythingCovered?直接把序列自动机建出来,不妨设状态\((x,y)\)表示构造了长......
  • Codeforces Round 922 (Div. 2)
    CodeforcesRound922(Div.2)比赛链接A.BrickWall思路简单的模拟,要想实现最高的稳定性,就横着放就可以了,因为长度必须大于等于2,所以最后即使不能被2整除,也可以算在里面Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){ intn,......