题解-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 ...
随机推荐
- 位图bitmap应用
所有比特的编号方法是,从低字节的低位比特位开始,第一个bit为0,最后一个bit为 n-1. 比如说,现在有个数组是这样子的,int a[4],那么a[0]的比特位为0--31a[1]的比特位为32- ...
- python之 栈与队列
忍不住想报一句粗口"卧槽"这尼玛python的数据结构也太特么方便了吧 想到当初学c语言的数据结构的时候,真的是一笔一划都要自己写出来,这python尼玛直接一个模块就ok 真的是 ...
- 11.java设计模式之享元模式
基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...
- [LeetCode题解]234. 回文链表 | 快慢指针 + 反转链表
解题思路 找到后半部分链表,再反转.然后与前半部分链表比较 代码 /** * Definition for singly-linked list. * public class ListNode { ...
- 【Kubernetes学习笔记】-服务访问之 IP & Port & Endpoint 辨析
目录 不同类型的IP Pod IP Cluster IP 不同类型的Port port nodePort TargetPort containerPort hostPort Endpoint Endp ...
- vulnhub: DC 9
信息收集: root@kali:/opt/test# nmap -A -v 192.168.76.137 Starting Nmap 7.80 ( https://nmap.org ) at 2020 ...
- [java基础]复习 java三大特性,异常,接口,String
继承 关键字extends 继承是为了不同的实现(龙生九子,各不相同) 单继承,一个类最多只能有一个父类 除了私有的外,子类可以访问父类的方法.属性. new过程中,父类先进行初始化,可通过super ...
- Linux查看并杀死被占用的端口
sudo apt-get install lsof //安装lsof sudo lsof -i:端口号 //查找对应的进程号 sudo kill -9 进程号 //杀死对应的进程
- 使用ssh远程连接命令行系统
1.进入shell窗口 2.ssh+用户名+@+ip 例如:ssh root@39.96.58.107 3.输入密码
- 初探Lerna
1.简介 首先是关于Monorepo(一篇不错的介绍Monorepo的文章),它是管理项目代码的一种方式,主要手段是通过在一个项目仓库中管理多个模块/仓库包.而Multirepo是传统的仓库管理方法, ...