题目

m(1<=m<=1e5)个数组,第i个数组的长度为ni(2<=ni<=2e5,ni为偶数)

第i个数组内的第j个值aij(1<=aij<=1e9),sumni<=2e5

问是否能把这些整数分成两个multiset,不妨称为L集合和R集合,

使得每个数组内恰有一半元素在L集合内,另一半元素在R集合内,

且L集合和R集合最终是相同的multiset

思路来源

palayutm、wifiii代码

题解

如果想到欧拉回路的构造,就很好做了

首先考虑无解的情形,某一种数字出现了奇数次,一定无解;否则,一定有解

先把数字离散化,然后这里给出一种构图方式:

第i个数组中,ai0和ai1连无向边,ai2和ai3连无向边,以此类推

相当于ai0和ai1位于二分图的不同侧,ai2和ai3同理,

可以发现,对于图上每个点(离散化后的数字)来说,

由于出现次数是偶数,所以度数为偶数,所以欧拉回路一定有解

不妨在某一种欧拉回路的方案中,边x是从第i个数组的a值指向b值的,

给边定向,不妨给b值划分到R集合,给a值划分到L集合

无论同一个数组内的边如何定向,都恰有一半属于L,另一半属于R

而对于每个数字v来说,恰有一半边从v出发指向其他点,另一半边从其他点出发回到v

这里试了一下c11和c17的语法,感觉还挺好用的

心得

反向考虑,为什么这么建图,

由于每个数字出现是偶数,所以每个aij连一条边,就能保证欧拉回路有解

由于最后每个数组内恰有ni/2个位于L集合,另ni/2个位于R集合,

所以相当于有ni/2对互斥关系,就对应在每个数组内建ni/2对两两结对的边,

给边定向时,让相邻点位于不同集合,即可达到这个目的

这与官方题解中,二分图左侧点i表示第i个数组,右侧点j表示数字j的建图方法,本质一致

代码

#include<bits/stdc++.h>
using namespace std;
void fast(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
int main(){fast();int m,n;cin>>m;vector<vector<int> >a(m),ans(m);vector<int>b;for(int i=0;i<m;++i){cin>>n;a[i].resize(n);ans[i].resize(n);for(int j=0;j<n;++j){cin>>a[i][j];b.push_back(a[i][j]);}}sort(b.begin(),b.end());b.erase(unique(b.begin(),b.end()),b.end());vector<int>deg(b.size());for(int i=0;i<m;++i){for(auto &v:a[i]){v=lower_bound(b.begin(),b.end(),v)-b.begin();deg[v]++;}}for(auto &v:deg){if(v&1){cout<<"NO"<<endl;return 0;}}vector<vector<array<int,4>> >e(b.size());int id=0;for(int i=0;i<m;++i){for(int j=1;j<a[i].size();j+=2){e[a[i][j]].push_back({a[i][j-1],i,j,id});e[a[i][j-1]].push_back({a[i][j],i,j-1,id});id++;}}vector<bool>vis(id);function<void(int)> dfs = [&](int u){while(!e[u].empty()){auto [v,i,j,id]=e[u].back();e[u].pop_back();if(vis[id])continue;vis[id]=1;ans[i][j]=1;dfs(v);}};for(int i=0;i<b.size();++i){dfs(i);}cout<<"YES"<<endl;for(int i=0;i<m;++i){for(auto &v:ans[i]){cout<<(v?'L':'R');}cout<<endl;}return 0;
}

Codeforces Round #770 (Div. 2) E. Fair Share(欧拉回路)相关推荐

  1. Codeforces Round #770 (Div. 2) Problem B.Fortune Telling

    题意: 给定两个数,Alice的数x, Bob的数 x + 3,和一个长度为n的数组a,x和x + 3都要和a的每一个数执行 "加法" 或 "异或" 两个操作的 ...

  2. Codeforces Round #770 (Div. 2) B. Fortune Telling

    题目链接:点击跳转 题意: 有一个长度为n的数组a,对于数组中的每个数,有两种操作方法,1.x + a, 2. x ^ a(^为异或符),Alice开始拥有的数为x,Bob拥有的数为x+3,每个人必须 ...

  3. B.Fortune Telling Codeforces Round #770 (Div. 2)

    题目链接:Fortune Telling 题解:由于x+y的奇偶性等于x^y的奇偶性,即只需要判断x+sum和y的奇偶性 #include<bits/stdc++.h> using nam ...

  4. Codeforces Round #770 (Div. 2) ABCD题解

    A. Reverse and Concatenate 思路: 答 案 要 么 1 要 么 2 答案要么1要么2 答案要么1要么2 等 于 1 的 必 要 条 件 是 反 转 之 后 是 它 本 身 等 ...

  5. Codeforces Round #693 (Div. 3)A~G解题报告

    Codeforces Round #693 (Div. 3)A~G解题报告 A Cards for Friends 原题信息 http://codeforces.com/contest/1472/pr ...

  6. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  7. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  8. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  9. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

最新文章

  1. 5G 与边缘计算的发展现状(2021 年 6 月)
  2. matlab 在图片上绘制热力图_python可视化之seaborn——热力图
  3. POJ2536 二分图匹配
  4. Docker网络和服务发现
  5. context:component-scan使用说明
  6. 前端学习(3318):异步处理thunk
  7. JS学习笔记2-JavaScript 语法
  8. this super的用法
  9. c( )函数--R语言
  10. MES助力日立电梯提升精细化管理水平
  11. IPC Send timeout detected模拟和总结
  12. Auto.js学习笔记13:images.findImag()报错找不到方法,返回的坐标无法点击等问题利用图片的相似度执行精准目标点击(实战篇)
  13. 逻辑回归原理与sklearn实现
  14. 【新手入门必看】git 和 github 介绍
  15. 中国人民大学计算机专硕好考吗,干货:中国人民大学考研复试成功经验分享,值得收藏!...
  16. azkaban 调度任务一直处于preparing状态
  17. Tita 绩效管理:一对一正式面谈
  18. Plants vs. Zombies【二分答案】
  19. 高考之后,“学”并未止步 :Juphoon Class (菊风云课堂)上线,助力构建实时互动课堂
  20. 对话NASA传奇宇航员:太空中不止有未知与神秘,还有下午茶和电影

热门文章

  1. 基于java互助平台设计_java毕业设计_springboot框架的校园互助网站设计
  2. 上海亚商投顾:ChatGPT概念领跌 两市约3800股下跌
  3. 三角网格参数化几种简单的方法比较
  4. codeigniter框架helpers,libraries,models目录说明
  5. SQL IN(规定多个值) 和 BETWEEN(选取介于两个值之间的数据范围) 操作符
  6. 灌溉系统通过远程io模块控制多个喷淋阀门开关
  7. 分布式网站架构和设计
  8. Halcon 算子 smallest_circle
  9. 模拟模拟交易系统(五)——系统功能展示
  10. linux ls lh每个列,Linux ls命令用法