题面

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的更多相关文章

  1. ACM-ICPC2018 沈阳赛区网络预赛-E-The cake is a lie

    You promised your girlfriend a rounded cake with at least SS strawberries. But something goes wrong, ...

  2. codeforces 1282 E. The Cake Is a Lie (dfs+构造)

    链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...

  3. Codeforces Round #610 (Div. 2) A-E简要题解

    contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...

  4. 【ACM-ICPC 2018 沈阳赛区网络预赛】不太敢自称官方的出题人题解

    A. Gudako and Ritsuka 链接 by Yuki & Asm.Def 期望难度:Hard- 考虑从后往前进行博弈动态规划,在这一过程中维护所有的先手必胜区间.区间不妨采用左开右 ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 Solution

    A. Gudako and Ritsuka 留坑. B. Call of Accepted 题意:定义了一种新的运算符$x d y$ 然后给出中缀表达式,求值 思路:先中缀转后缀,然后考虑如何最大如何 ...

  6. C程序员必须知道的内存知识【英】

    C程序员必须知道的内存知识[英] 时间 2015-03-08 14:16:11  极客头条原文  http://marek.vavrusa.com/c/memory/2015/02/20/memory ...

  7. 题解【CodeForces171C】A Piece of Cake

    Description 给你\(n\)个数,求出\(\sum_{i=1}^{n} a_{i}\times i\qquad\) Input 共\(n + 1\)个数,分别为\(n\)和\(n\)个数\( ...

  8. cdoj 48 Cake 水题

    Cake Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/48 Descrip ...

  9. 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 ...

随机推荐

  1. Jmeter 添加 计数器

    第一步: 添加 > 配置元件  > 计数器    如下图所示: 第二步: 设置递增值与引用名称 第三步:使用引用名称 第四步:执行脚本,查看结果

  2. 干货 MySQL常见的面试题 + 索引原理分析

    常见的面试必备之MySQL索引底层原理分析: MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 1)问题:数据库中最常见的慢查询优化方式是什么? 回答:加索引 2)问题: ...

  3. 来吧,展示!Redis的分布式锁及其实现Redisson的全过程

    前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要 ...

  4. Guitar Pro小课堂之弹唱和弦转换小技巧

    吉他相对其他乐器的便携性,还有其便于弹唱的特点,受到了很多音乐萌新们的喜爱.对于刚刚接触吉他的萌新来说,学琴初期弹唱的时候经常会因为和弦卡顿的转换,和因为食指力度不够或技巧不对无法顺利演奏的大横按,导 ...

  5. guitar pro系列教程(十二):如何设置Guitar Pro的不完全小节

    当我们新建一个GTP谱的时候,我们肯定是要用到节拍,是的,一个乐谱节拍设置的好不好,将直接影响你的乐谱效果好不好,设置节拍的步骤我们之前也有讨论过,今天主要跟大家讲的便是不完全小节. 不完全小节顾名思 ...

  6. Java(8)I/O

    目录 一.File类 1.File类概述 2.File类实例化 3.File类常用方法 二.IO流的原理 1.IO流的原理 2.input和output的理解 三.IO流的分类 1.分类 2.图示 3 ...

  7. yii2.0使用bootstrap中日期插件

    Yii2框架引用bootstrap中日期插件yii2-date-picker的方法. 使用composer安装 日期插件 php composer.phar require "2amigos ...

  8. iOS沙盒文件目录介绍

    1.APP沙盒目录结构简介 首先奉上苹果官方文档: https://developer.apple.com/library/archive/documentation/FileManagement/C ...

  9. 【???】今天上午的考试题——区间dp和字符串/线性筛的综合应用

    T3还没有打出来,就先放两道. ---------------------------------------------------------- T1:密码破译 温温手下的情报部门截获了一封加密信 ...

  10. T - Permutation 题解(思维+dp)

    题目链接 题目大意 给你一个数字n和长为n-1个字符串 字符串包含'<','>' 若s[i]='<' 则代表a[i]<a[i+1] 若s[i]='>' 则代表a[i]&g ...