Planar Tree

题解

首先,我们看这题呀,感觉这东西好像很阴间的样子,想想有没有什么比较好的方法。
好像没有的样子。
首先当然可以有比较简单的 O ( n 3 ) O\left(n^3\right) O(n3)的区间 d p dp dp做法,不过这东西好像根本没有利用上我们 A i ∈ [ 1 , 4 ] A_i\in[1,4] Ai​∈[1,4]的性质。
不妨考虑一下这个性质有什么用。

显然,这里我们可以发现, A i = 1 / 4 A_i=1/4 Ai​=1/4的点连接到的点的权值都是唯一的,它们如果与 2 / 3 2/3 2/3相邻,显然可以直接合并到那上面。
同样,如果有两个相邻的权值相同的数,也是可以合并到一起的,因为它们必然可以连向相同的目标。
我们可以把上面两类点给合并起来,得到一个相邻的点都不同并且不存在 ( 1 , 2 ) / ( 3 , 4 ) (1,2)/(3,4) (1,2)/(3,4)相邻的图形。

但这又有什么用呢?
我们可以发现,我们的树其实是可以由不断合并在环上相邻的边构成的。
显然,对于一个大小为 n n n的环,其生成树上肯定会存在一个叶子与其父亲相邻,否则必然会出现相交的线段。
也就是说,我们可以由这种方式递归构造出整棵树。
我们上面的合并显然是优秀的合并,也就是说,它并不会影响最后的答案是否有解。
那么我们再来看在我们的新环上有能怎么办了?
如果这个环仅存在 2 2 2和 3 3 3的时候显然是有解的,所以我们的目的是将这个环上的 1 , 4 1,4 1,4全部去掉。
如果要去掉 1 1 1,环上肯定得存在 2 2 2,为了两者不相邻,它们肯定会用 3 3 3隔开,也是说能合并的地方必然长这个样子: . . . , 1 , 3 , 1 , 3 , 1 , 3 , 1 , 3 , 2 , . . . ...,1,3,1,3,1,3,1,3,2,... ...,1,3,1,3,1,3,1,3,2,...,这样我合并 ( 1 , 2 ) (1,2) (1,2)后必然会去掉一个 3 3 3。
同样,在合并 ( 3 , 4 ) (3,4) (3,4)后也必然去掉一个 2 2 2。
也就是说,我们有解的必要条件是 c n t 2 ⩾ c n t 4 ∧ c n t 3 ⩾ c n t 1 cnt_2\geqslant cnt_4\wedge cnt_3\geqslant cnt_1 cnt2​⩾cnt4​∧cnt3​⩾cnt1​。
但显然,它们两个不能同时取等,因为我们最后一次合并后肯定还会剩一个。
所以,我们真正的必要条件是: ( c n t 2 ⩾ c n t 4 ∧ c n t 3 > c n t 1 ) ∨ ( c n t 2 > c n t 4 ∧ c n t 3 ⩾ c n t 1 ) (cnt_2\geqslant cnt_4\wedge cnt_3>cnt_1)\vee(cnt_2>cnt_4\wedge cnt_3\geqslant cnt_1) (cnt2​⩾cnt4​∧cnt3​>cnt1​)∨(cnt2​>cnt4​∧cnt3​⩾cnt1​)。
容易发现这个条件也是充分的,因为按照我们上面的方法是可以构造得到解的。

所以,只需要按我们上面的方法缩点后判断一下即可。
时间复杂度 O ( ∑ n ) O\left(\sum n\right) O(∑n)。

源码

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
#define MAXN 300005
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
const int INF=0x3f3f3f3f;
const int mo=998244353;
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1;}return t;}
int T,n,a[MAXN],b[MAXN],head,tail,cnt[5];
int main(){read(T);while(T--){read(n);head=tail=0;for(int i=1;i<=n;i++){read(a[i]);a[i]--;bool flag=0;while(head<tail){if(b[tail-1]==a[i]){tail--;continue;}if((b[tail-1]^a[i])==1){if(a[i]==0||a[i]==3)flag=1;else{tail--;continue;}}break;}if(!flag)b[tail++]=a[i];}while(head+1<tail){if(b[head]==b[tail-1])tail--;else if((b[head]^b[tail-1])==1){if(b[head]==0||b[head]==3)head++;else tail--;}else break;}for(int i=head;i<tail;i++)cnt[b[i]]++;if(cnt[0]>cnt[2]||cnt[3]>cnt[1])puts("No");else if(cnt[0]==cnt[2]&&cnt[3]==cnt[1])puts("No");else puts("Yes");cnt[0]=cnt[1]=cnt[2]=cnt[3]=0;}return 0;
}

谢谢!!!

[AGC058C]Planar Tree相关推荐

  1. UWA学堂|渲染模块知识Tree汇总

    渲染效果作为游戏表现力的核心卖点之一,相关课程在学堂中也占了相当大一部分比例.为了方便大家更快速明确地查找到需要的课程,学堂界面新增了分类查找的功能,对应的渲染大类,我们细分了光影.后处理.粒子系统等 ...

  2. 107. Binary Tree Level Order Traversal II

    题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...

  3. 102. Binary Tree Level Order Traversal

    题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...

  4. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  5. [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. Code Forces Bear and Forgotten Tree 3 639B

    B. Bear and Forgotten Tree 3 time limit per test2 seconds memory limit per test256 megabytes inputst ...

  7. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  8. datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  9. java easyui tree例子_EasyUI Tree的简单使用

    此前写过zTree插件的demo,没有记录下来,这次记录一下EasyUI的Tree. 实现效果:获取数据库表的数据,以树结构的形式展示出来. 树结构数据分为同步加载和异步加载,同步加载就是初始化加载时 ...

最新文章

  1. 服务器开一个无限循环的线程可以吗,如何使用无限循环的目标函数创建一个可停止的线程...
  2. java 自定义注解以及获得注解的值
  3. android对话框字体大小,Android Dialog 设置字体大小的具体方法
  4. 2019年全球最受欢迎数据库新鲜出炉,你猜中了吗?
  5. (一)操作系统基本概念(任哲版嵌入ucos和linux笔记)
  6. 同步异步与阻塞非阻塞
  7. 2008流媒体服务器点播搭建详解
  8. 最长回文字串--动态规划
  9. 关于APP测试用例点
  10. tomcat 设置编码格式
  11. select 设置不可用,提交表单时能传值
  12. 【论文阅读】Enhancing Underwater Imagery using Generative Adversarial Networks
  13. HI3861学习笔记(17)——NFC标签NT3H1201使用
  14. 深度学习跑项目的注意事项
  15. JavaWeb笔记:第07章 MVC |EL |JST |Filter |Listener |JQuery |AJAX |Maven |JSON |Redis |Linux |Nginx
  16. Microbiome | 东北农大石宝明/孟庆维等揭示宿主-微生物互作介导猪肠炎免疫
  17. cpu第几代计算机,赛扬G系列有几代cpu分别是
  18. 【时间序列预测】股价预测零售预测
  19. 钽电容的作用,钽电容滤波好的原因
  20. 各种软件开发方向和前景

热门文章

  1. 经典网页设计:20个新鲜出炉的 HTML5 网站
  2. 第十八章行为性模式—观察者模式
  3. 安卓通过SurfaceView类实现手写功能(下)
  4. 【案例】Shazam识别音乐
  5. positional argument follows keyword argument的产生原因和解决办法
  6. Android webView中监听物理返回键一层一层退出
  7. 上海户籍改革持居住证者工作数年可入沪
  8. 在线编程Python网站,亲测好用
  9. 25、基于51单片机声控光控灯红外人体感应控制声光控开关亮灭设计
  10. linux 命令:mv 详解