CodeForces 1361E James and the Chase(dfs + 结论)

problem

洛谷链接

solution

看到这个 20%20\%20% 的特殊性质,脑海里第一个就想到了随机化算法。已经PTSD了着实上头

如果本题只是随便求一个 interesting\text{interesting}interesting 的点,那就非常简单了。

随机化一个点,检查这个点是否满足 interesting\text{interesting}interesting 的限制即可。

如果判断一个点是否是 interesting\text{interesting}interesting 的点?以该点为根建立 dfs-tree。如果只有树边和返祖边,没有一条横叉边,那么这个点就是“有趣点”。

一次判断的复杂度是 O(n)O(n)O(n) 的。

执行 min⁡(100,n)\min(100,n)min(100,n) 次,正确率就高达 1−(45)1001-(\frac{4}{5})^{100}1(54)100

虽然很简单,但是本题的正解就是建立在这种随机的基础上的。

我们不能求出所有点,但是可以快速通过随机求出一个 interesting\text{interesting}interesting 点,记为 ididid

ididid 为根,建立 dfs-tree ,那么这棵树是没有横叉边的。

考虑能否在这棵树上求出所有的 interesting\text{interesting}interesting 点。

显然是可以的,需要用到几个小性质。

定理1 树上一个非根节点 uuu 的子树内至少会有一条连向子树外的边(跨过 uuu),即返祖边。

这是显然的,因为题目保证点两两之间是可以互达的。

定理2 如果树上一个非根节点 uuu 的子树内有不止一条连向子树外的边,则该点不是 interesting\text{interesting}interesting 点。

  • 如果两条返祖边都指向同一个祖先,也就意味着 uuu 有两条到达这个祖先的路径。
  • 如果两条返祖边指向不同的祖先,但这两组先之间也存在祖先后辈关系,相当于到某个辈分较小的祖先也有两条路径。

定理3 如果树上一个非根节点 uuu 的子树内只有一条连向子树外的边,uuu 是“有趣点” 当且仅当这条返祖边连向的祖先也是“有趣点”。

这也是显然的。uuu 到这个祖先是一条简单路径,祖先不是“有趣点”就意味着祖先到某个点有不止一条路径。传递过来等价于 uuu 到某个点也有不止一条路径。

请时刻注意,根 ididid 一定是“有趣点”,树一定没有横叉边。

所以我们可以通过 dfs 来完成筛选。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
bool flag;
int T, n, m;
vector < int > ans, G[maxn];
int dep[maxn], low[maxn], cnt[maxn], vis[maxn];
bool bad[maxn];void dfs_good( int u ) {if( ! flag ) return;vis[u] = 1;for( int v : G[u] )if( ! vis[v] ) dfs_good( v );else if( vis[v] == 2 ) { flag = 0; return; }vis[u] = 2;
}int dfs( int u ) {vis[u] = 1, low[u] = u;for( int v : G[u] )if( ! vis[v] ) {dep[v] = dep[u] + 1;cnt[u] += dfs( v );if( dep[low[v]] < dep[low[u]] ) low[u] = low[v];}
//为什么选深度最小的点呢?因为这个点的辈分最大 能跨过这个点的返祖边对应的点越少else {cnt[u] ++, cnt[v] --;//因为之前是直接把后代的返祖边加上来的,但是这些返祖边对于这个祖先而言还是后代之间的连边 并未跨过这个祖先if( dep[v] < dep[low[u]] ) low[u] = v;}if( cnt[u] > 1 ) bad[u] = 1;return cnt[u];
}void dfs_bad( int u ) {vis[u] = 1;if( bad[low[u]] ) bad[u] = 1;for( int v : G[u] ) if( ! vis[v] ) dfs_bad( v );
}int main() {mt19937 wwl(time(0));scanf( "%d", &T );while( T -- ) {ans.clear();for( int i = 1;i <= n;i ++ ) {G[i].clear();low[i] = bad[i] = dep[i] = cnt[i] = vis[i] = 0;}scanf( "%d %d", &n, &m );for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );}uniform_int_distribution < int > range( 1, n );int id = -1;for( int t = 1;t <= 100;t ++ ) {flag = 1;for( int i = 1;i <= n;i ++ ) vis[i] = 0;id = range( wwl );dfs_good( id );if( flag ) break;}if( ! flag ) { puts( "-1" ); continue; }for( int i = 1;i <= n;i ++ ) vis[i] = 0;dfs( id );for( int i = 1;i <= n;i ++ ) vis[i] = 0;dfs_bad( id );for( int i = 1;i <= n;i ++ )if( ! bad[i] ) ans.push_back( i );sort( ans.begin(), ans.end() );if( ans.size() * 5 < n ) printf( "-1" );else for( int i : ans ) printf( "%d ", i );printf( "\n" );}return 0;	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021牛客暑期多校训练营4

2021牛客暑期多校训练营4 题号题目知识点ACourseBSample GameCLCSDRebuild TreeETree Xor思维线段树FJust a jokeGProductHConvolutionIInverse PairJAverage

Docker最全教程之使用.NET Core推送钉钉消息(二十)

前言上一篇我们通过实战分享了使用Go推送钉钉消息&#xff0c;由于技痒&#xff0c;笔者现在也编写了一个.NET Core的Demo&#xff0c;作为简单的对照和说明。最后&#xff0c;由于精力有限&#xff0c;笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块…

[线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r_{m-1}\}{r0​,r1​,...,rm−1​} 。 若对于任意 m−1≤nm-1\le nm−1≤n &#xff0c;有 ∑i0m−1an−iri0\sum_{i0}^{m-1}a_{n-i}r_i0∑…

Average

Average 题意&#xff1a; 矩阵W的值可以通过数组a和b得到&#xff0c;W[i][j]a[i]b[j],现在求W的一个子矩阵&#xff0c;平均值最大&#xff0c;且子矩阵必须满足宽度至少是x&#xff0c;高度至少是y&#xff0c;计算最大平均值 题解&#xff1a; 那答案就变成了分别对a和b…

开箱即用Bumblebee独立部署搭建webapi网关详解

在之前的章节里都是讲述如何在程序中使用Bumblebee来构建一个Webapi网关&#xff1b;但这样显然有些麻烦&#xff0c;毕竟很多时候可能只需要一个简单负载处理&#xff0c;还需要写个程序针对服务进行编写代码或配置的确是比较麻烦的事情&#xff1b;如果有负载方面的调整还需要…

LCS(2021牛客多校4)

LCS(2021牛客多校4) 题意&#xff1a; 让你构造三个字符串s1,s2,s3&#xff0c;长度均为n,要求LCS(s1,s2)a,LCS(s2,s3)b,LCS(s1,s3)c 题解&#xff1a; 先考虑三个串互相LCS为x,y,z,且x>y>z 显然如果xy-n>z则无解&#xff0c;反之xy-n<z有解 那么就先给三个串加…

CodeForces 1616H Keep XOR Low {a^b≤x} / CodeForces gym102331 Bitwise Xor {a^b≥x}(trie树 + 计数)

文章目录CodeForces 1616H Keep XOR LowproblemsolutioncodeCodeForces gym102331 Bitwise XorproblemsolutioncodeCodeForces 1616H Keep XOR Low problem 洛谷链接 solution 虽然选的是一个子集&#xff0c;但本质还是二元限制。 这非常类似以前做过的题目&#xff0c;已…

ASP.NET Core 文件系统

静态文件 目录浏览 默认页面 MIME类型配置 实战文件服务器 紧接上一讲 中间件 之后&#xff0c;今天来我们来讲一下关于 ASP.NET Core 中静态文件服务。什么是静态文件&#xff1f;先看一下下面例子&#xff08;在客户端浏览器中通过 url 路径访问了网站的一张图片&#xff09…

[C++] iota语句的语法

头文件为 numeric #include <numeric> using namespace std;语法和 sort / lower_bound / upper_bound 等差不多&#xff0c;都是前闭后开的原则。 iota(Ax,Ay,z) &#xff1a;表示将 AAA 数组的 [x,y)[x,y)[x,y) 区间进行填充&#xff0c;从 zzz 开始&#xff0c;每填…

如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...

这篇文章介绍一下&#xff0c;如何使用VS2017给asp.net core添加容器支持&#xff0c;并发布镜像到私有docker hub&#xff0c;然后用chart管理容器镜像的操作流程。话不多说&#xff0c;just do it.新建项目首先新建一个asp.net core项目&#xff0c;这里我新建一个WebApi默认…

Inverse Pair

Inverse Pair 题意&#xff1a; 一个数组a&#xff0c;现在构造一个数组c&#xff0c;c[i]a[i]0/1&#xff08;0或1&#xff09;&#xff0c;使得c的逆序对最少 题解&#xff1a; 如果x在x1的后面&#xff0c;我们让x这个数1,x1不变&#xff0c;就可以让逆序对少1。如果x在…

CodeForces 1610H Squid Game(延迟贪心 + 构造 + 树状数组)

problem 洛谷链接 solution 考虑重新随便钦定一个点为“根”&#xff0c;并且强制根必须是关键点。 则所有 x−yx-yx−y 不是直系祖先-子代的要求&#xff08;要求Ⅰ&#xff09;&#xff0c;即 xxx 不是 yyy 祖先&#xff0c;yyy 也不是 xxx 祖先&#xff0c;一定都被满足…

P4551 最长异或路径

P4551 最长异或路径 题意&#xff1a; 给定一棵 n 个点的带权树&#xff0c;结点下标从 1 开始到 n。寻找树中找两个结点&#xff0c;求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 题解&#xff1a; 我们指定1为根节点&#xff0c;T(u,v…

[小技巧]EF Core中如何获取上下文中操作过的实体

原文地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10576443.html作者&#xff1a;Lamond Lu 源代码&#xff1a;https://github.com/lamondlu/EFCoreFindSample背景介绍当我们在工作单元(UnitOfWork)中使用EF/EF Core的时候&#xff0c;为了要保持事务&#xff0c;一个用…

CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)

problem luogu-link solution 显然单独考虑每个 iii 的贡献&#xff0c;即被多少个合法上升子序列包含。 令 xmax⁡{j∣j>i∧aj>ai}x\max\{j\ |\ j>i\wedge a_j>a_i\}xmax{j ∣ j>i∧aj​>ai​}&#xff0c;则包含 iii 的合法子序列的结尾元素最远只能到…

Acwing 232. 守卫者的挑战

Acwing 232. 守卫者的挑战 题意&#xff1a; 有n个挑战&#xff0c;一开始背包容量为k&#xff0c;每次挑战有p[i]的概率成功&#xff0c;成功的话会得到一个大小为1的地图碎片或者是提升背包容量X&#xff0c;所有的地图碎片必须装在包里&#xff0c;问最后带地图离开的概率…

IdentityServer4-前后端分离之Vue

前言之前文章讲到如何使用Node.jsExpress构建JavaScript客户端&#xff0c;实现前后端分离。本节将介绍如何使用Vue实现前后端分离&#xff0c;文中介绍Vue的知识比较基础&#xff0c;适合新手学习。一、搭建Vue项目前提条件&#xff1a;安装nodejs、webpack和vue-cli。这个网上…

P1850 [NOIP2016 提高组] 换教室

P1850 [NOIP2016 提高组] 换教室 题意&#xff1a; 有2n个课安排在n个时间段上&#xff0c;每个时间段上都有两个一样的课同时在不同地方上&#xff0c;起初牛牛被所有课都被安排在Ci上课&#xff0c;另一节课在Di上课。牛牛现在想跟换到Di位置&#xff0c;它最多可以申请m节…

守列划分问题(圆排列+排列dp+结论)

problem 将正整数 1∼n1\sim n1∼n 任意划分成 mmm 个非空集合 A1,...,AmA_1,...,A_mA1​,...,Am​。 一个划分是守序的&#xff0c;当且仅当存在一个环排列 (p1,...,pm)(p_1,...,p_m)(p1​,...,pm​)&#xff0c;使得 max⁡Api>min⁡Api−1\max A_{p_i}>\min A_{p_{i-…

ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(三

在上文ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署&#xff08;二&#xff09;中&#xff0c;我介绍了如何使用Azure DevOps为ASP.NET Core应用程序案例&#xff1a;tasklist搭建持续集成环境。在持续集成的过程中&#xff0c;Azure DevOps的Build Pipeline会下…