codeforces1361C Johnny and Megan‘s Necklace
https://codeforces.com/problemset/problem/1361/C
从高到低位枚举,如果一个项链的答案是ans,那么根据题意等价于这些连接之间末位的ans个bits是相同的,把一对珍珠当一条边,连接末位的bits之间的连线,然后跑欧拉回路,记录边的顺序就行了
从标程里学习了递归的欧拉回路写法,方便记录边的序号,还学了新的输出姿势,涨姿势了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define fir first
#define sec second
typedef pair<int,int> p;
const int maxl=1<<20;int n,m,cas,k,cnt,tot,ansb;
int a[maxl][2],du[maxl],ans[maxl];
int s[maxl],cur[maxl];
bool in[maxl],vis[maxl];
vector <p> e[maxl];inline void prework()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i][0],&a[i][1]);
} inline void dfs(int u)
{vis[u]=true;for(p d:e[u])if(!vis[d.fir])dfs(d.fir);
}inline bool jug(int mask)
{for(int i=0;i<=mask;i++)e[i].clear(),vis[i]=false;int u,v,len,cnt;for(int i=1;i<=n;i++){u=a[i][0]&mask;v=a[i][1]&mask;e[u].push_back({v,2*i+1});e[v].push_back({u,2*i});}cnt=0;for(int i=0;i<=mask;i++){len=e[i].size();if(len&1)return false;if(!vis[i] && len>0){if(cnt>0) return false;cnt++,dfs(i);}}return true;
}inline void eular(int u,int pre=-1)
{while(e[u].size()){p d=e[u].back();e[u].pop_back();if(in[d.sec/2])continue;in[d.sec/2]=true;eular(d.fir,d.sec);}if(pre!=-1){ans[++ans[0]]=pre;ans[++ans[0]]=pre^1;}
}inline void solv(int mask)
{int len,u,i;for(int st=0;st<=mask;st++){len=e[st].size();if(len>0){eular(st);return;}}
}inline void mainwork()
{for(int i=20;i>=0;i--)if(jug((1<<i)-1)){solv((1<<i)-1);ansb=i;return;}
}inline void print()
{printf("%d\n",ansb);for(int i=1;i<=2*n;i++)printf("%d%c",ans[i]-1," \n"[i==2*n]);
}int main()
{int t=1;//scanf("%d",&t);for(cas=1;cas<=t;cas++){prework();mainwork();print();}return 0;
}
codeforces1361C Johnny and Megan‘s Necklace相关推荐
- CF1361C. Johnny and Megan‘s Necklace(构造,欧拉回路,传递闭包)
CF1361C. Johnny and Megan's Necklace Solution 真duliu,快做吐了... 刚开始想了一个假做法(但前面还是很真的). 假的做法大概是你发现这个东西具有传 ...
- codeforces:1361(div1)1362(div2):总结
文章目录 前言 1362-A. Johnny and Ancient Computer 解析 1362-B - Johnny and His Hobbies 解析 1362-C - Johnny an ...
- 拆位 ---- C. Johnny and Another Rating Drop[位运算,计算每一位的贡献+推导过程]
C. Johnny and Another Rating Drop 题目大意:就是定义一个不公平度就是相邻两个数的二进制位不相同数 比如说:100和011就是有3位不同 现在给你一个n∈[1,1e18 ...
- HDU 5727 Necklace
题目:Necklace 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5727 题意:要用n个阳石和n个阴石来串一个项链(环状),规定阳石旁边只能是阴石,阴 ...
- Johnny and Another Rating Drop CodeForces - 1362C(规律)
The last contest held on Johnny's favorite competitive programming platform has been received rather ...
- HDU 5730 Shell Necklace(生成函数 多项式求逆)
Shell Necklace 由题意可得f[n]=∑i=1na[i]f[n−i]f[n] = \sum\limits_{i = 1} ^{n} a[i] f[n - i]f[n]=i=1∑na[i] ...
- E:Johnny and Grandmaster
Johnny and Grandmaster 或许更好的阅读体验 思路 这道题就是把一组数分成两个集合,使这两个集合的对p的次方的和的差的最小值,也就是求sum1−sum2sum1 - sum2sum ...
- UVa10054 The Necklace 欧拉回路
如果图G中的一个路径包括每个边恰好一次,则路径称为欧拉路径. 如果一个回路是欧拉路径,则称为欧拉回路.(即起点终点相同的欧拉路) 有欧拉回路的称为欧拉图,有欧拉路径但无欧拉回路的称为半欧拉图. 无向图 ...
- Happy Necklace
happy necklace 题意:一个项链是由红蓝两个珠子构成,项链不是环,是一条线,要求每一个素数长度红色珠子的个数大于等于蓝色珠子的个数,给你n个珠子问符合条件的项链的个数. 思路:一看取模就知 ...
最新文章
- Redis的数据类型详解
- 【数学和算法】初识卡尔曼滤波器(二)
- web前端——transform变形 旋转角度正负的判断
- win7系统如何提高电脑运行速度
- mac npm command not found
- 分析“关于Linux内核引入的accept_local参数的一个问题”
- 全国计算机b类一级考试试题题库,全国计算机等级考试模拟题:一级B试题(一)...
- cad批量打印_CAD插件批量打印3.5.9
- JAVA毕业设计Web企业差旅在线管理系统计算机源码+lw文档+系统+调试部署+数据库
- 用matlab计算矩阵的权重,如何使用matlab计算加权平均分
- 日系插画学习笔记(十一):日系插画标准上色流程
- Android 电源键事件流程分析
- SIGIR'22 | 利用最小化互信息学习反事实推断中的解耦表征
- 黔南州委常委、统战部部长潘选一行领导莅临迦太利华调研
- R语言 | 编写自己的函数
- 淘系自研前端研发工具 AppWorks 正式发布
- excel单元格内容拆分_Excel中把一个单元格内容拆分到多个单元格内的两种方法...
- 如何更改mysql数据库的用户名和密码
- 实用软件测试技术与持续质量改进方法 培训课程
- c语言函数指针封装函数,C语言之函数指针、回调函数的使用