题解-CF1282E The Cake Is a Lie
题面
\(T\) 组测试数据。每次给一个 \(n\) 边形的三角剖分,求节点顺序和剖分顺序。
数据范围:\(3\le n\le 10^5\),\(\sum n\le 10^5\)。
蒟蒻解
这题在炫酷的代码和外表下是一个大水题。
对于每一个剖下来的三角形的边,要么是原多边形的边,要么是割的边。
多边形的边在所有三角形的边中出现 \(1\) 次,割边在所有三角形中出现 \(2\) 次。
所以用 map
记录每条边的出现次数。
然后从一个三角形出发,然后用 dfs
合并上出现 \(2\) 次的边的三角形即可。
对于第一个询问可以用一个环状链表,第二个可以回溯加 vector
。
为了不方便,代码中从一个有两条原多边形的边的三角形开始,这样每次就最多有两边要合并三角形了。
代码
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair((a),(b))
#define x first
#define y second
#define be(a) (a).begin()
#define en(a) (a).end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
#define R(i,a,b) for(int i=(a),I=(b);i<I;i++)
#define L(i,a,b) for(int i=(b)-1,I=(a)-1;i>I;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int N=1e5;
int n,nex[N],ea[N-2],eb[N-2],ec[N-2];
bool vis[N]; vector<int> ans;
map<pair<int,int>,vector<pair<int,int>>> mp;
#define pa(x,y) mp(min(x,y),max(x,y))
#define an(x,y) mp[pa(x,y)]
//Main
void solve(pair<int,int> e){
if(nex[e.y]==e.x) swap(e.x,e.y);
vector<pair<int,int>> tv=an(e.x,e.y);
int ez=vis[tv[0].x]?tv[1].x:tv[0].x;
int et=vis[tv[0].x]?tv[1].y:tv[0].y;
vis[ez]=true,nex[e.x]=ez,nex[ez]=e.y;
if(sz(an(e.x,ez))>=2) solve(mp(e.x,ez));
if(sz(an(e.y,ez))>=2) solve(mp(e.y,ez));
ans.pb(et);
}
void Main(){
cin>>n,ans.clear();
fill(nex,nex+n,-1);
fill(vis,vis+n,false);
if(n==3){
cin>>ea[0]>>eb[0]>>ec[0];
cout<<"1 2 3\n1\n";
return;
}
mp.clear();
R(i,0,n-2){
cin>>ea[i]>>eb[i]>>ec[i];
--ea[i],--eb[i],--ec[i];
an(ea[i],eb[i]).pb(mp(ec[i],i));
an(ea[i],ec[i]).pb(mp(eb[i],i));
an(eb[i],ec[i]).pb(mp(ea[i],i));
}
int s=-1; pair<int,int> e(-1,-1);
R(i,0,n-2){
int cnt=0;
if(sz(an(ea[i],eb[i]))==2) cnt++,e=pa(ea[i],eb[i]);
if(sz(an(ea[i],ec[i]))==2) cnt++,e=pa(ea[i],ec[i]);
if(sz(an(eb[i],ec[i]))==2) cnt++,e=pa(eb[i],ec[i]);
if(cnt==1){s=i;break;}
}
nex[ea[s]]=eb[s],nex[eb[s]]=ec[s],nex[ec[s]]=ea[s];
vis[ea[s]]=vis[eb[s]]=vis[ec[s]]=true,ans.pb(s);
solve(e);
int now=0;
R(i,0,n) cout<<now+1<<' ',now=nex[now];cout<<'\n';
for(int x:ans) cout<<x+1<<' ';cout<<'\n';
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int tn; cin>>tn;
R(ta,0,tn) Main();
return 0;
}
祝大家学习愉快!
题解-CF1282E The Cake Is a Lie的更多相关文章
- ACM-ICPC2018 沈阳赛区网络预赛-E-The cake is a lie
You promised your girlfriend a rounded cake with at least SS strawberries. But something goes wrong, ...
- codeforces 1282 E. The Cake Is a Lie (dfs+构造)
链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...
- Codeforces Round #610 (Div. 2) A-E简要题解
contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...
- 【ACM-ICPC 2018 沈阳赛区网络预赛】不太敢自称官方的出题人题解
A. Gudako and Ritsuka 链接 by Yuki & Asm.Def 期望难度:Hard- 考虑从后往前进行博弈动态规划,在这一过程中维护所有的先手必胜区间.区间不妨采用左开右 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 Solution
A. Gudako and Ritsuka 留坑. B. Call of Accepted 题意:定义了一种新的运算符$x d y$ 然后给出中缀表达式,求值 思路:先中缀转后缀,然后考虑如何最大如何 ...
- C程序员必须知道的内存知识【英】
C程序员必须知道的内存知识[英] 时间 2015-03-08 14:16:11 极客头条原文 http://marek.vavrusa.com/c/memory/2015/02/20/memory ...
- 题解【CodeForces171C】A Piece of Cake
Description 给你\(n\)个数,求出\(\sum_{i=1}^{n} a_{i}\times i\qquad\) Input 共\(n + 1\)个数,分别为\(n\)和\(n\)个数\( ...
- cdoj 48 Cake 水题
Cake Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/48 Descrip ...
- hdu 5640 King's Cake(BestCoder Round #75)
King's Cake Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
随机推荐
- 自定义圆角背景的textview,抛弃shape
自定义一个圆角背景的TextView,解放双手,不用再写shape了. 1.values目录新建attrs.xml. <?xml version="1.0" encoding ...
- UNP——原始套接字
1.原始套接字的用处 使用原始套接字可以构造或读取网际层及其以上报文. 具体来说,可以构造 ICMP, IGMP 协议报文,通过开启 IP_HDRINCL 套接字选项,进而自定义 IPv4首部. 2. ...
- 高性能arm运行ceph存储基准测试
关于arm 之前wdlab对外发布过一次约500个节点的arm的ceph集群,那个采用的是微集群的结构,使用的是双核的cortex-a9 ARM处理器,运行速度为1.3 GHz,内存为1 GB,直接焊 ...
- C# Random类的正确应用
Random类介绍 Random类一个用于产生伪随机数字的类.这里的伪随机表示有随机性但是可以基于算法模拟出随机规律. Random类的构造方式有两种. Random r= new Random(). ...
- 公司人员组织架构图用思维导图软件MindManager怎么做
有朋友一直不太明白组织架构图怎么做,其实组织架构图就是组织结构图.小编今天就在这里以一个公司为例,来给大家演示一番人员组织结构图怎么做. 老规矩,先说一下小编使用的软件跟电脑系统,这里用的是MindM ...
- 攻克弹唱第七课(如何弹奏neon)
在本期文章中,笔者将通过Guitar Pro 7来跟大家研究一下neon的曲谱,顺便复习一下之前文章中说过的和弦技巧. 在<如何在指板上寻找特殊和弦(二)>这一期课程中,我们分析过如何使用 ...
- JAVA8新特性Optional,非空判断
Optional java 的 NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过 "防止 NPE,是程序员的基本修养." 但是修养归 ...
- 对于this和当前线程的一些理解
在学习这个InheritableThreadLocal类的时候,我对于有个地方一直没有理解,我发现了盲点. 1 private void init(ThreadGroup g, Runnable ta ...
- 根节点到叶子节点路径之和为target
//递归吧,但是在递归到底的条件上要判断好,比如说完整路径是到叶子节点,也就是说左右子节点都为空,并且这时候的root.val==target表示找到了一个list,再返回. 但是因为我并没有直接就用 ...
- gitlab private-token利用工具
在渗透测试中,经常会遇到只获得gitlab PRIVATE-TOKEN的情况,而gitlab提供了一系列的api给我们通过这个token去访问gitlab. 所以做了个简单的gitlab工具,以供紧获 ...