当前位置:网站首页>CF1634E Fair Share

CF1634E Fair Share

2022-07-05 05:31:00 solemntee

 Insert picture description here
The question : Yes m m m An array , The number of numbers in each array is even . Divide each array in half to the set A 、 B A、B AB Make the final resettable same, judge whether it is legal, and give the scheme .
First of all, I probably only think of Euler circuit on the court , But because there is no demolition point to build a map , We can only do the case of non re set , Later, I had no choice but to broadcast .
The method is to create a bipartite map , Left m m m Dots represent each array , Right c n t cnt cnt( Number of digital categories ) A little bit .
Numbers from the left to the right i i i The directed edge of represents i i i among A A A aggregate , On the contrary, it means to give B B B aggregate . It is easy to know that the original problem is equivalent to searching Euler circuits on bipartite graphs .
Then because there is no need to output the path , Just dye the edges with black and white , Then keep searching the ring .
Then finding a ring will not affect the Euler circuit property of the complementary graph , It is also obvious that Euler can definitely search a ring , That's it .
By the way, please enjoy the new one l a m b d a lambda lambda function

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    
	int m;
	scanf("%d",&m);
	vector<vector<int>>a(m+1),ans(m+1);
	map<int,int>mp,cnt;
	int asdf=0;
	for(int i=1;i<=m;i++)
	{
    
		int n;
		scanf("%d",&n);

		a[i].resize(n+1);
		ans[i].resize(n+1,-1);
		for(int j=1;j<=n;j++)
		{
    
			scanf("%d",&a[i][j]);
			if(mp[a[i][j]]==0)mp[a[i][j]]=++asdf;
			cnt[mp[a[i][j]]]++;
		}
	}
	for(int i=1;i<=asdf;i++)if(cnt[i]%2==1)
	{
    
		printf("NO");
		return 0;
	}
	vector<vector<pair<int,int>>>gra(4e5+5);
	vector<int>cur(4e5+5);
	const int MX=2e5;
	for(int i=1;i<=m;i++)
	{
    
		for(int j=1;j<a[i].size();j++)
		{
    
			gra[i].push_back({
    mp[a[i][j]]+MX,j});
			gra[MX+mp[a[i][j]]].push_back({
    i,j});
			cur[i]++;
			cur[MX+mp[a[i][j]]]++;
		}
	}
	function<void(int,int)>dfs=[&](int now,int flag)
	{
    
		int u=now;
		while(cur[u])
		{
    
			cur[u]--;
			auto [to,pos]=gra[u][cur[u]];
			while(ans[min(u,to)][pos]<0)
			{
    
				ans[min(u,to)][pos]=flag;
				dfs(to,1-flag);
			}
		}
	};
	for(int i=1;i<=m;i++)dfs(i,0);
	printf("YES\n");
	for(int i=1;i<=m;i++)
	{
    
		for(int j=1;j<ans[i].size();j++)
		{
    
			if(ans[i][j]==0)printf("L");
			else printf("R");
		}
		printf("\n");
	}

    return  0;
}

原网站

版权声明
本文为[solemntee]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140621452775.html