Underground Lab CodeForces - 782E (欧拉序)

大意:$n$结点,$m$条边无向图, 有$k$个人, 每个人最多走$\left\lceil\frac {2n}{k}\right\rceil$步, 求一种方案使得$k$个人走遍所有的点

$n$结点树的欧拉序长度为$2n-1$, 直接取$dfs$树的欧拉序即可

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstdio>
#include <vector>
#define pb push_back
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;

const int N = 4e5+10, INF = 0x3f3f3f3f;
int n, m, k, mx;
int vis[N];
vector<int> g[N], path;

void dfs(int x) {
    vis[x] = 1, path.pb(x);
    for (int y:g[x]) {
        if (!vis[y]) dfs(y),path.pb(x);
    }
}

int main() {
    cin>>n>>m>>k;
    REP(i,1,m) {
        int x, y;
        cin>>x>>y;
        g[x].pb(y),g[y].pb(x);
    }
    dfs(1),path.pop_back();
    for (int i=1; i<=k; cout<<‘\n‘,++i) {
        if (path.empty()) {
            cout<<"1 1";
            continue;
        }
        int mx = (2*n+k-1)/k;
        if (mx>path.size()) mx = path.size();
        cout<<mx<<‘ ‘;
        REP(j,1,mx) {
            cout<<path.back()<<‘ ‘;
            path.pop_back();
        }
    }
}

原文地址:https://www.cnblogs.com/uid001/p/10340843.html

时间: 2024-08-30 00:11:57

Underground Lab CodeForces - 782E (欧拉序)的相关文章

【BZOJ 3772】精神污染 主席树+欧拉序

这道题的内存-------真·精神污染---.. 这道题的思路很明了,我们就是要找每一个路径包含了多少其他路径那么就是找,有多少路径的左右端点都在这条路径上,对于每一条路径,我们随便选定一个端点作为第一关键字,另一个作为第二关键字,于是就有了两维限制,按照主席树的一般思路,我们把建树顺序作为一维,然后在里面维护另一维,那么我们在外面限制第一关键字,就是在树上建主席树,查询减LCA,在里面的话我们把每个点作为第一关键字对应的第二关键字,放入主席树,而主席树维护的是欧拉序区间,所以我们每次查询只用查

lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs

https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) 1 /* 2 在这里,对于一个数,选择最左边的 3 选择任意一个都可以,[left_index,right_index],深度都大于等于这个数的深度 4 */ 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cmath> 8 #include <cstring> 9 #include &

DFS序-树链剖序-欧拉序

,二叉树是一颗线段树,树状数组,树上的每个维护节点负责维护一个区间信息,节点之间又包含和属于的关系.例如线段树: DFS序: 我们通过对每个节点设置两个量,in和out.从根节点开始DFS搜索,in为第一次搜索到时的时间戳,out为退出出栈时的时间戳. 可以得到,例如我们要查询以b为根节点我们只需要查询区间[2,5]:要查询以c为根节点子树的信息,我们可以查询区间[6,7]:查询a需要查询区间[1,8].在程序中,当要查询修改时,我们可以用线段树去维护,因为这些序列的性质和线段树太像了.我们要注

P3379 【模板】最近公共祖先(LCA)(欧拉序+rmq)

P3379 [模板]最近公共祖先(LCA) 用欧拉序$+rmq$维护的$lca$可以做到$O(nlogn)$预处理,$O(1)$查询 从这里剻个图 #include<iostream> #include<cstdio> #include<vector> using namespace std; int read(){ char c=getchar(); int x=0; while(c<'0'||c>'9') c=getchar(); while('0'&l

欧拉序动态维护树直径

https://zhuanlan.zhihu.com/p/84236967 https://www.cnblogs.com/TinyWong/p/11260601.html 一个月过去了,我还是没有学动态点分治... 欧拉序保存了每个节点进入和返回的情况,$n$ 个结点的树,欧拉序列长度为 $2n - 1$. 两个结点的LCA就是它们在欧拉序中出现的位置的区间中,深度最小的那个结点. 对于边权为正的树,上面定义中的深度也可以换成到根的距离,用dis[u]表示结点 $u$ 到根的距离. 那么两个节

HDU 2586(LCA欧拉序和st表)

什么是欧拉序,可以去这个大佬的博客(https://www.cnblogs.com/stxy-ferryman/p/7741970.html)巨详细 因为欧拉序中的两点之间,就是两点遍历的过程,所以只要找遍历过程中对应的最小的深度就行了,这里用st表存,first存第一个u出现的地方,用value存欧拉序,同时用depth存对应深度 模板 1 struct node{ 2 int v,next,dist; 3 }a[maxn<<1]; 4 int n,m,tot,len; 5 int st[m

Codeforces 781C Underground Lab 构造

原文链接https://www.cnblogs.com/zhouzhendong/p/CF781C.html 题目传送门 - CF781C 题意 给定一个 n 个点 m 条边的无向连通图,请你用 k 条长度不大于 $\lceil 2n/k \rceil$ 的路径来覆盖所有节点至少一次.每一条路径长度至少为 1 ,同一条路径可以多次经过同一个节点. $n,m\leq 2\times 10^5,\ \ 1\leq k\leq n$ 题解 连通图是一个很优秀的性质. 我们只需要找出这个图的任意一个 d

CodeForces - 508D Tanya and Password(欧拉通路)

Description While dad was at work, a little girl Tanya decided to play with dad's password to his secret database. Dad's password is a string consisting of n + 2 characters. She has written all the possible n three-letter continuous substrings of the

Codeforces 508D Tanya and Password 欧拉通路Euler

题目链接:点击打开链接 题意:给定n个长度为3各不相同的字符串,猜一个n+2位的密码. 这个密码包含上面的所有字符串 思路: 把 abc 拆成ab -> bc 则得到一个图,目标就是走遍所有 ab->bc 这样的边,也就是找一条欧拉通路. #include <cstdio> #include <algorithm> #include <string.h> #include <queue> #include <cstring> #inc