[AGC058C] Planar Tree 题解
前言
赛时没做出来,赛后把题补了。果然是 maroonrk 出的,名不虚传啊……真的很好的一道题目。
解法
题目中的圆周有以下几个性质:
- 圆周上如果有相邻的等值,我们可以去掉一个而不改变答案(这个很好证明);
- 如果 \(1\) 和 \(2\) 相邻,那么擦去 \(1\) 不影响答案;同样的道理,如果 \(3\) 和 \(4\) 相邻,擦去 \(4\) 不影响答案。
我们定义“规范化”为尽可能地多执行以上操作的过程。
任何满足要求的树也都具有满足以下条件的边:
- 边连接的两个点在圆周上相邻;
- 其中一个点是树的叶子。
所以,我们可以通过执行以下操作来形成满足条件的树:
- 选择两个相邻且可连接的点并连接它们;
- 选择其中一个点作为叶子,将它从圆周上擦除。
那么,该如何利用上述操作来简化题目呢?
我们可以发现,在“规范化”后的圆周上,我们只有可能连接编号为 \(2\) 和 \(3\) 的点。假设我们将 \(2\) 当作那片被擦掉的叶子:
- 如果圆周上有这样的一段“弧”:\(\cdots,4,2,3,\cdots\),擦除了 \(2\) 之后 \(3\) 和 \(4\) 相邻,就可以进行“规范化”擦除,间接地相当于擦除了一对 \(2\) 和 \(4\);
- 如果圆周上有这样的: \(\cdots,3,2,3,\cdots\),那么按照上面的思路 \(2\) 和 \(3\) 也将被擦除;
- ……
考虑以下一系列操作:在“规范化”状态下执行上述操作,然后再次“规范化”……
如果我们也考虑把 \(3\) 当作叶子(擦除 \(3\)),这一系列操作每次可以擦除一对 \((2,3),(1,3)\) 或 \((2,4)\)。
如果可以重复上面的操作,且最终只有 \(2\) 和 \(3\) 在圆周上,我们就可以构造出满足条件的树。
所以,我们可以推出以下必要条件:
- 设圆环上 \(i\) 的数量为 \(C_i\),则 \(C_2>C_4\) 且 \(C_3>C_1\)。
我们可以看到,实际上它也是充分条件。因为如果有顶点 \(1\) 或 \(4\) 在圆上,那么我们可以擦除一对 \((1,3)\) 或 \((2,4)\)。
我们可以在 \(O(n)\) 的时间复杂度内解决这个问题。
实现
注意到,我的代码中有一个 \(f\) 数组,其中 \(f=\{2,2,3,3\}\)。但是因为我在实现中为方便处理,将所有输入的数减去了 \(1\),所以代码中 \(f=\{1,1,2,2\}\)。
它的作用是什么呢?判断相邻的两个点能否进行规范化操作!我们注意到,如果两个点编号为 \(i,j\),\(f_i=f_j\) 的必要条件为 \(i=j\) 或 \(|i-j|=1\)。
所以,如果 \(f_i=f_j\),假设 \(f_i=i\),就代表 \(i=2\) 或 \(i=3\),不管 \(j\) 是什么,擦掉 \(j\) 都是“规范化”过程中的合法操作。
最后再用 std::map 来统计每个数出现的数量,比较后输出即可。
放代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int t,f[4]={1,1,2,2}; cin>>t;
while(t--){
int n; cin>>n;
vector<int> a;
for(int i=0;i<n;i++){
int x; cin>>x;
if(x--;i&&f[x]==f[a.back()]){
if(f[x]==x)a.back()=x;
}
else a.emplace_back(x);
}
if(f[a[0]]==f[a.back()]){
if(f[a[0]]==a.back())a[0]=a.back();
a.pop_back();
}
vector<int> m(4); for(int i:a)m[i]++;
cout<<(m[2]>m[0]&&m[1]>m[3]?"Yes\n":"No\n");
}
return 0;
}
[AGC058C] Planar Tree 题解的更多相关文章
- Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)
D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...
- POJ 1308 Is It A Tree?--题解报告
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31092 Accepted: 10549 D ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- 【文文殿下】CF1098C Construct a tree 题解
题解 挺水的一道题. Rating $ \color{orange} {2300}$ 以下送命题. 首先我们知道,所有子树大小之和就是节点个数加上从根到所有节点的路径长度之和. 他要求度数尽可能小,所 ...
- BZOJ2588:Count on a tree——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2588 Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你 ...
- CC TSUBSTR:Substrings on a Tree——题解
https://www.codechef.com/problems/TSUBSTR https://vjudge.net/problem/CodeChef-TSUBSTR 给一棵点权为字母的树,你只能 ...
- 【日常学习】【二叉树遍历】Uva548 - Tree题解
这道题目本身不难,给出后序遍历和中序遍历,求到节点最小路径的叶子,同样长度就输出权值小的叶子. Uva上不去了,没法測.基本上是依照ruka的代码来的.直接上代码 //Uva548 Tree #inc ...
- SPOJ - QTREE Query on a tree题解
题目大意: 一棵树,有边权,有两个操作:1.修改一条边的权值:2.询问两点间路径上的边的权值的最大值. 思路: 十分裸的树链剖分+线段树,无非是边权要放到深度大的一端的点上,但是有两个坑爹的地方,改了 ...
- 洛谷 P2633 Count on a tree 题解
题面 对于每个点建立一颗主席树: 然后按照树上差分的思想统计主席树的前缀和: lca+主席树+前向星存表就可以了: #include <bits/stdc++.h> #define inc ...
- [Luogu P4178]Tree 题解(点分治+平衡树)
题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...
随机推荐
- Redis存储商品热度
项目中有一个需求,就是可以根据商品的热度进行排序 起初想着使用string类型来存储如: sku:hotscore:商品的ID 但是这回有个问题,当商品数量多了那k-v岂不是得炸了,维护起来也非常不方 ...
- HDU-2159 二维背包
最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问题是,xhd升掉最后一级还需n的经 ...
- 神经网络优化篇:详解dropout 正则化(Dropout Regularization)
dropout 正则化 除了\(L2\)正则化,还有一个非常实用的正则化方法--"Dropout(随机失活)". 假设在训练上图这样的神经网络,它存在过拟合,这就是dropout所 ...
- NetSuite 开发日记 —— 事务处理行限制
一.创建行限制 在 NetSuite 中处理事务时,一次可访问的记录.事务处理或数据行数限制为 10,000.除非另有说明,此限制适用于所有交易类型.超过 1,000 行可能会对 Netsuite 的 ...
- 使用kubeadm在Centos8上部署kubernetes1.18
// 查看系统版本 cat /etc/centos-release CentOS Linux release 8.1.1911 (Core) // 如果系统环境为8.0(云服务器默认最大安装环境为8. ...
- Python——第二章:列表的概念
在编程中,列表(List)是一种常用的数据结构,用于存储一组有序的元素.列表是Python中的内置数据类型之一,它允许你在一个变量中存储多个值,并且这些值可以是不同的数据类型,包括整数.浮点数.字符串 ...
- Ubuntu 命令使用方法
apt-get 用作于deb包 yum作用于tar包(也可以运作于rpm包) 首先用yum list wget检查一下你的虚拟机有没有安装wget,如果安装了下面图中会显示 @dvd ,我的没有安装所 ...
- 【eBPF-03】进阶:BCC 框架中 BPF 映射的应用 v1.0
eBPF 中实现内核态代码与用户态代码是可以实时通信的,这主要靠 BPF 映射 来实现. BPF 映射 是内核空间的一段内存,以 键值对 的方式存储.内核态程序可以直接访问 BPF 映射,用户态需要通 ...
- Pytest07-pytest.ini配置文件
1.pytest配置文件 固定名称:pytest.ini 作用域:当前目录及子目录 具体配置功能见下: [pytest] # 01 把命令行参数自动添加到这里 addopts = -s -v --ht ...
- WPF通用权限平台系统,正在研发中(基本于:VS2019 WPF+WebAPI(.NET 6.0)+SqlSugar +SQLServer2014)