题解-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 ...
随机推荐
- 关闭防火墙和设置主机名和ip及克隆机网卡处理方法
关闭防火墙: service NetworkManager stop --图形化用ifconfig之前先关掉网络服务. chkconfig NetworkManager off (将开机自启动关掉,使 ...
- python实战GUI界面+mysql
前言 前面用tkinter做了一个巨丑的GUI界面,今天想把它变漂亮起来,重新找回page做了一个界面,它也是基于tkinter开发的所见即所得的界面编辑器,前面因为代码搞不明白没用上,现在重新研究一 ...
- java 打包压缩包下载文件
1. 下载压缩包zip方法 @Override public void downloadZip(HttpServletResponse servletResponse) { String nowTim ...
- RESTFul服务开发必备的一款IDEA插件!用了就离不开了
我们经常谈 RESTful Web 服务开发,但是我发现很多人实际就根本不懂这个概念.只是听着大家都这么说,也就跟着一起说了,哈哈哈! 因此,在开始推荐这个IDEA插件之前,非常有必要花一小会时间简单 ...
- BurpSuite多重代理的情形
有时候为了隐藏自己的真实IP,访问目标网站需要走代理.比如说,通过代理IP访问目标网站并且代理IP可以随时切换,这样可以避免IP被封堵后无法访问目标网站的尴尬. 一. 首先把代理切换为全局模式 操作步 ...
- 新同事不讲“码”德,这SQL写得太野了,请耗子尾汁~
今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的SQL语句效率低下,所以我们也可以自省自检一下. 1. LIMI ...
- 利用分块传输绕WAF
分块传输原理介绍 背景 HTTP Connection有两种连接方式:短连接和长连接: 短连接即一次请求对应一次TCP连接的建立和销毁过程. 长连接是多个请求共用同一个连接这样可以节省大量连接建立时间 ...
- ServerLess之云函数实践-天气API
关注我的个人博客,发掘更多的内容 ServerLess之云函数实践-天气API 前言 云计算是大势所趋 Serverless 架构即"⽆服务器"架构,它是一种全新的架构方式,是云计 ...
- java开发两年,连这些多线程知识都还没掌握,你凭什么涨薪!
并发与并行 并发:两个或者多个事件在同一时间段发生(交替执行) 并行:两个或者多个事件在同一时刻发生(cpu多核.同时执行) 线程与进程 进程:是一个内存中运行的应用程序,有自己独立的内存空间,一个应 ...
- Java基础教程——运算符
运算符 算术运算符 加 减 乘 除 取余 自加 自减 + - * / % ++ -- public class 算术运算符 { public static void main(String[] arg ...