首页 > 其他分享 >CF1325F Ehab's Last Theorem

CF1325F Ehab's Last Theorem

时间:2022-09-06 15:34:12浏览次数:92  
标签:CF1325F include Last dep dfs int reads Ehab now

传送门


思路

dfs 树的一道出色的应用题

令 \(k=\lceil \sqrt n \rceil\)

我们先按照遍历的顺序构建出 dfs 树

对于一条返祖边 \((u, v)\),如果有 \(dep_u-dep_v +1\ge k\),那么 dfs 树上的链 \((v, u)\) 就是一个满足要求的环

假如并没有满足要求的环,说明对于从根出发的链上任意两点 \((x,y)\),如果有 \(dep_x+k-1\ge dep_y\),那么在原图中 \(x,y\) 一定没有连边

而且 dfs 树上不位于同一条链上的两点之间也没有连边

于是我们可以按 \(dep\bmod (k-1)\) 进行分组

根据抽屉原理,一定有一个组点的个数 \(\ge k\)


#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#define LL long long
#define FOR(i, x, y) for(int i = (x); i <= (y); i++)
#define ROF(i, x, y) for(int i = (x); i >= (y); i--)
#define PFOR(i, x) for(int i = he[x]; i; i = r[i].nxt)
inline int reads()
{
    int sign = 1, re = 0; char c = getchar();
    while(c < '0' || c > '9'){if(c == '-') sign = -1; c = getchar();}
    while('0' <= c && c <= '9'){re = re * 10 + (c - '0'); c = getchar();}
    return sign * re;
}
int n, m, k;
struct Node
{
    int to, nxt;
}r[400005]; int he[100005];
std::bitset<200005> rvis;
inline void Edge_add(int u, int v)
{
    static int cnt = 1;
    r[++cnt] = (Node){v, he[u]};
    he[u] = cnt;
}
std::bitset<100005> vis;
int dep[100005], fa[100005];
std::vector<int> q[100005];
void dfs(int now)
{
    vis[now] = 1; q[dep[now] % (k - 1)].emplace_back(now);
    PFOR(i, now)
    {
        if(rvis[i >> 1]) continue;
        int to = r[i].to;
        if(vis[to])
        {
            if(dep[now] - dep[to] + 1 >= k)
            {
                printf("2\n%d\n", dep[now] - dep[to] + 1);
                while(1)
                {
                    printf("%d ", now);
                    if(now == to) exit(0);
                    now = fa[now];
                }
            }
        }
        else
        {
            dep[to] = dep[now] + 1;
            fa[to] = now;
            rvis[i >> 1] = 1;
            dfs(to);
        }
    }
}
signed main()
{
#ifndef ONLINE_JUDGE
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    n = reads(), m = reads(); k = ceil(sqrt(n));
    FOR(i, 1, m)
    {
        int u = reads(), v = reads();
        Edge_add(u, v), Edge_add(v, u);
    }
    FOR(i, 1, n) if(!vis[i])
        dep[i] = 1,
        dfs(i);
    puts("1");
    FOR(i, 0, m - 1) if(q[i].size() >= k)
    {
        FOR(j, 0, k - 1) printf("%d ", q[i][j]);
        break;
    }
    return 0;
}

标签:CF1325F,include,Last,dep,dfs,int,reads,Ehab,now
From: https://www.cnblogs.com/zuytong/p/16661983.html

相关文章

  • elasticsearch版本升级type属性的变化
    type属性的由来从Elasticsearch的第一个发布版本以来,每一个document都被存储在一个单独的index里,并被赋予了一个type,一个mapping代表一个type相关的数据类型以及索引类型。......
  • ubuntu20上配置ElasticFusion
    1、安装cmake3.22版本以上的版本(因为在进行编译时,要求cmake版本需3.22以上)1.1、查看当前版本cmake---version1.2、卸载cmakesudoaptremovecmake1.3、下载官......
  • Difference between elastic IP and Public IP
    LearnwhatiselasticIPandpublicIPmeansinAWS.ListoutalldifferencesbetweenelasticIPandpublicIPinAWS.IwashavingaconversationaboutAWSwi......
  • ElasticSearch-全文检索
    1.ElasticSearch-全文检索1.1简介:Elasticsearch是一个分布式的开源搜索和分析引擎,在ApacheLucene的基础上开发而成。Lucene是开源的搜索引擎工具包,Elasticsearch......
  • Elastic.Apm 源码解析
    源码中有如下sample:1vardistributedTracingData=DistributedTracingData.TryDeserializeFromString(args[0]);23WriteLineToConsole($"Calleeprocessstar......
  • Elasticsearch 面试题
    Elasticsearch面试题为什么要使用Elasticsearch?系统中的数据,随着业务的发展,时间的推移,将会非常多,而业务中往往采用模糊查询进行数据的搜索,而模糊查询会导致查询引擎......
  • Elasticsearch
    Elasticsearch什么是ElasticsearchElasticsearch、Kibana、Beats和LogstashES是一个开源的高扩展的分布式全文搜索引擎全文搜索引擎这里说到的全文搜索引擎指的是......
  • Elasticsearch 查询 UV
    ES聚合指标value_count:计数cardinality:去重计数avg:平均值sum:求和max:最大值min:最小值percentiles:百分比top_hits:简单来说就是聚合分组后从每一个......
  • ElasticSearch 分组聚合统计
    统计总数:GETmytest-statistics/_search{"size":0,"query":{"bool":{"must":[{"range":{"day":{......
  • 基于Docker安装ElasticSearch(一)
    一、安装前准备dockernetwork为容器新增了一张指定网络的虚拟网卡。创建一个局域网让elasticsearch和kibana进行网络互联,存放在同一个网络,kibana可以直接通过容器访问......