Codeforces 512E - Fox And Polygon(构造)
中规中矩的构造题一道。
首先考虑将两张图都向一个中间状态转化。方便起见我们取所有点都连向 \(1\) 号点的情形作为中间状态。
考虑怎样从初始状态向我们这个中间状态转化。显然我们要将所有不与 \(1\) 相连的对角线都变得与 \(1\) 相连对吧,那我们就考虑从 \(2\) 开始枚举每一个点 \(x\) 以及一个与 \(x\) 相连的边 \((x,y)(x<y)\),满足 \(y\) 与 \(1\) 有边,如果 \(|x-y|>2\) 说明这条对角线不符合要求,我们就找出 \(x,y\) 所在的四边形,显然一个端点是 \(1\),另一个端点枚举一下即可找出,假设为 \(z\),那么我们就操作 \(1,x,y,z\) 构造的四边形,将 \((x,y)\) 变成 \((1,z)\)。如果我们找不到这样的 \(y\) 说明不存在与 \(x\) 相连的不合法的边,我们就继续进入到下一个 \(x\) 即可。容易发现每次操作会恰好使一个不合法的边变得合法,而总边数最多只有 \(n-1\),因此总操作次数的上限为 \(2n-2\)。
时间复杂度 \(\mathcal O(n^2)\)。
事实上本题如果用 bitset 优化数据范围可以出到 \(5\times 10^4\),具体解法就是对每个点开一个 bitset 存储与其相连的点,然后用 bitset 的取并和 _Find_first() 函数找出符合要求的 \(y\),再用 bitset 的取并找出 \(x,y\) 对应的 \(z\)。
const int MAXN=1000;
int n;
struct solver{
vector<pii> op;int tp,a[MAXN+5][MAXN+5];
void read(){int u,v;scanf("%d%d",&u,&v);a[u][v]=a[v][u]=1;}
void work(){
for(int i=1;i<=n;i++) a[i%n+1][i]=a[i][i%n+1]=1;
for(int i=2;i<n;i++) if(a[1][i]){
while(1){
int ps=n;
for(int j=i+1;j<=n;j++) if(a[1][j]){ps=j;break;}
if(ps==i+1) break;
for(int j=i+1;j<ps;j++) if(a[ps][j]&&a[i][j]){
a[j][1]=a[1][j]=1;a[i][ps]=a[ps][i]=0;
(tp)?op.pb(mp(i,ps)):op.pb(mp(1,j));break;
}
}
}
}
} s1,s2;
int main(){
scanf("%d",&n);
for(int i=1;i<=n-3;i++) s1.read();
for(int i=1;i<=n-3;i++) s2.read();
s1.tp=1;s1.work();s2.work();printf("%d\n",s1.op.size()+s2.op.size());
for(int i=0;i<s1.op.size();i++) printf("%d %d\n",s1.op[i].fi,s1.op[i].se);
for(int i=(int)(s2.op.size())-1;~i;i--) printf("%d %d\n",s2.op[i].fi,s2.op[i].se);
return 0;
}
Codeforces 512E - Fox And Polygon(构造)的更多相关文章
- Educational Codeforces Round 10 B. z-sort 构造
B. z-sort 题目连接: http://www.codeforces.com/contest/652/problem/B Description A student of z-school fo ...
- Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)
题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...
- CodeForces 388A Fox and Box Accumulation (模拟)
A. Fox and Box Accumulation time limit per test:1 second memory limit per test:256 megabytes Fox Cie ...
- Codeforces 1246D/1225F Tree Factory (构造)
题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...
- Codeforces - 1202D - Print a 1337-string... - 构造
https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...
- Codeforces 388C Fox and Card Game (贪心博弈)
Codeforces Round #228 (Div. 1) 题目链接:C. Fox and Card Game Fox Ciel is playing a card game with her fr ...
- Codeforces 743C - Vladik and fractions (构造)
Codeforces Round #384 (Div. 2) 题目链接:Vladik and fractions Vladik and Chloe decided to determine who o ...
- Codeforces 1368E - Ski Accidents(构造+思维)
Codeforces 题面传送门 & 洛谷题面传送门 神仙构造题(不过可能我构造太烂了?) 首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条 ...
- Codeforces 1270E - Divide Points(构造+奇偶性)
Codeforces 题目传送门 & 洛谷题目传送门 显然,直接暴力枚举是不可能的. 考虑将点按横纵坐标奇偶性分组,记 \(S_{i,j}=\{t|x_t\equiv i\pmod{2},y_ ...
随机推荐
- TCP三次握手四次挥手,通俗易懂版
三次握手四次挥手 三次握手 其实很好理解,三次握手就是保证双手都有发送和接受的能力.那么最少三次才能验证完成 即----> 客户端发送---服务端收到----服务端发送-- 1.客户端发送 -- ...
- 【Spring】IoC容器 - 依赖来源
前言 上一篇文章已经学习了[依赖注入]相关的知识,这里详细的介绍一下[依赖来源]. 依赖来源 我们把依赖来源分为依赖查找的来源和依赖注入的来源分别讨论. 依赖查找的来源 1. Spring BeanD ...
- [对对子队]会议记录4.15(Scrum Meeting 6)
今天已完成的工作 何瑞 工作内容:制作了合成指南 相关issue:实现游戏内UI界面使用的组件 马嘉 工作内容:基本实现了箱子内物品列表 相关issue:实现游戏内UI界面使用的组件 ...
- 【二食堂】Alpha - Scrum Meeting 8
Scrum Meeting 8 例会时间:4.18 11:40 - 12:10 进度情况 组员 昨日进度 今日任务 李健 1. 实体的添加和关系的添加实现的有bug,柴博和刘阳进行了帮助issue 1 ...
- 【二食堂】Beta - Scrum Meeting 3
Scrum Meeting 3 例会时间:5.15 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续完成文本区域划词添加的功能 issue 1. 划词功能已经实现,继续开发 ...
- 摘录:ddr3内存条时序概念
本文摘自:内存系列二:深入理解硬件原理 - 知乎 (zhihu.com),感谢作者! 上次虽然解决了小张的问题,却引发了他对内存原理的兴趣.这不他又来找我了,说我还欠他一个解释.这次我们约在一个咖啡馆 ...
- 矩阵中的路径 牛客网 剑指Offer
矩阵中的路径 牛客网 剑指Offer 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下 ...
- 求1+2+3...+n 牛客网 剑指Offer
求1+2+3...+n 牛客网 剑指Offer 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). ...
- kail入侵win2003 sp2 中文版系统
攻击机:kail -- IP:192.168.74.132 目标靶机:win2003 sp2 中文版系统-- IP:192.168.74.128 一.扫描漏洞 1. 在kail中运行 namp 192 ...
- Linux 文本三剑客之 awk
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...