首页 > TAG信息列表 > Dfs2

CF1498F Christmas Game

从简单往复杂推。 菊花图并且 \(k=1\) 时,这是个 \(Nim\) 游戏。 继续 \(k=1\),奇偶分类后发现一样是奇数深度意义下的 \(Nim\) 游戏。 \(k > 1\) 时,深度除以 \(k\) 后还是个 \(Nim\) 游戏。 换根 \(dp\) 求解一下即可。 #include<cstdio> const int H=4000040; char G[H],*_=G; in

G. Xor Tree - 字典树

G. Xor Tree https://codeforces.ml/group/MKpYqfAQQQ/contest/386972/problem/G 题意 给一个数组里面的数都不相同 对于每个数组中的数 找到数组中与之亦或值最小的数 这两个数之间有一条边 求最多删去多少个数 使得最后得到的图是连通图 思路 字典树 处理每个数的二进制数 根据0

HYSBZ1036 [ZJOI2008]树的统计(树链剖分)

将树通过树链剖分转化成线性序列,用线段树维护最值,和值即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=30005; 7 int n,m; 8 int head[maxn],to[maxn<<1],nxt[maxn

树链剖分

LCA struct Edge{ int v,nxt; }edge[maxn]; int head[maxn],tot=0; inline void read(int &x){ x=0;char tmp=getchar(); while(tmp<'0'||tmp>'9')tmp=getchar(); while(tmp>='0'&&tmp<='9')x=(x<<

Kosaraju 求强连通分量

感觉比 Tarjan 好写多了!虽然正确性可能不如 Tarjan 好理解。 先求出 dfs 树,然后按照出栈序倒序在反图上 dfs,每次 dfs 所有能走到的点都构成了一个强连通分量,然后将它们在图上删去。 代码(来自 oi-wiki) 时间复杂度 \(\mathcal{O}(|V|+|E|)\). // C++ Version // g 是原图,g2 是反图 v

cf1010 D. Mars rover(树)

题意: 有一棵逻辑运算树,叶子节点为输入节点(IN),取值0/1;其他节点有AND/OR/XOR/NOT四种类型,并根据儿子节点取不同的值。输出为根节点的值。 初始每个输入节点的值给定(因此所有节点的值确定)。问单独改变每个输入节点的值而保持其他输入节点不变,输出是多少 思路: 二叉树,每个节点存储节

2020ccpc秦皇岛 K - Kingdom‘s Power

K - Kingdom’s Power 比赛的时候思路出了 但不会证。 赛后敲了就过了。 #include <bits/stdc++.h> using namespace std; const int N = 1000010; #define ll long long int n; vector <pair<int, int>> tr[N]; int depth[N]; int val[N]; int dfs1(int u, int dep) {

题解 Revive

传送门 柿子人畜无害,但有个地方误导性极强 给定一棵树,每条边有一个边权,要带修查询一个点与其子树外的所有点间的距离和 这个东西没有可以时间可以接受的解法! 考场上就死这了……觉得维护出来就可以A了,结果死活维护不出来 正解是另一种解法: \((\sum a_i)^2 = \sum a_i^2 + \su

【题解】bzoj3252 攻略

bzoj3252 攻略 \(\text{Solution:}\) 题目是指每次选择一条链就会把它清空,求选 \(k\) 条链的最大价值。 打眼看上去不知道咋做……想一下这不就是个长链剖分! 维护一个带权的长链剖分,然后直接对每一条链的权值和排序,取前 \(k\) 大就可以了。 因为长链剖分的每一条链都是不重复的,没

BZOJ1812: [Ioi2005]riv(树形dp)

题意 题目链接 Sol 首先一个很显然的思路是直接用\(f[i][j] / g[i][j]\)表示\(i\)的子树中选了\(j\)个节点,该节点是否选的最小权值。但是直接这样然后按照树形背包的套路转移的话会有一种情况无法处理,就是说该节点不选,儿子节点也不选,这样我们就不清楚儿子节点的子节点的贡献了 一

1481F.AB Tree(树上信息统计+01背包+记录DP路径+Bitset优化时间复杂度)

    #include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; const int inf=1e9; int n,m,x; int dep[maxn];//节点在第几层 int num[maxn];//每一层的节点个数 int lev[maxn];//每一层的叶子节点个数 bitset<maxn> f[2500]; int w[maxn]; int ok[maxn]; vect

HDU 1547 Bubble Shooter dfs

#include<iostream> #include<algorithm> #include<cstring> using namespace std; int n, m, x, y, ans; char map[120][120]; bool visit[120][120]; //六个方向,且奇书偶数行是不一样的 void dfs1(int a, int b, char c) //将与射出去的泡泡相连的相同的泡泡全都标记 { i

2n皇后问题

2n皇后问题 每天一篇CSDN,快乐无极限! 如果有更好的解题方法,欢迎评论区讨论哦

2020 CSP-S2 & NOIP 2020 考试小错误总结

因为博主是一个退役选手,所以有很多以前记得的细节,现在经常犯错,所以写下来留作复习。 树链剖分的dfs2的时候一定要判断v不等于fa还有v不等于son[u]才继续走下去dfs2(v,v)。 随机一个东西的时候代码前面一定要加上 srand(time(NULL)); 在win机下测的时候要自己写一个大一点的rn

[CF1316D] Nash Matrix - DFS

对一个 \(n\times n\) 的棋盘,每个格子上有一个字母,表示遇到这个格子就向着某个方向走或者停止。现在给定从每个位置开始会走到的位置,或者死循环,试构造一个合法的棋盘,或者输出 INVALID。 Solution 除去死循环的部分,终点相同的点会形成独立的联通块,我们从终点开始反向 DFS 即可 如果

SP375 QTREE - Query on a tree

SP375 QTREE - Query on a tree 我是借这道题来说说如何从c++改到c的 1.我怕麻烦,所以把结构体拆了(忍痛割爱我封装的线段树) 2.max、swap函数进行了手写 max: ll llmax(ll x,ll y){return x>y?x:y;} swap: x^=y^=x^=y emm...这的确是一个神奇的swap,不用函数 至于为什么是对的

板子

树链剖分。 const int N = 1e5 + 10 ; struct node { int v , nxt ; } ; node e[N << 1] ; int head[N] , cnt = 0 ; inline void Add(int u , int v) { e[++ cnt].v = v ; e[cnt].nxt = head[u] ; head[u] = cnt ; } int size[N] , son[N] , d[N] ; inline void Dfs1(int u)

【csp模拟赛九】--dfs2

  dfs 代码: #include<algorithm>#include<iostream>#include<cstdio>using namespace std;int n,m,p,q,ans1,ans2,len;int ans[35],sum[35];bool ok[35];struct haochi{ int zl,jg,ctb; int tot,dr[35]; friend bool operator < (const haochi &x,

洛谷试炼场 4-17 树链剖分

layout: post title: 洛谷试炼场 4-17 树链剖分 author: "luowentaoaa" catalog: true mathjax: true tags: - 树链剖分 - 数据结构 - 洛谷 [ZJOI2008]树的统计 (入门题,链最大值,链和) 思路 #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998

【题解】P3258松鼠的新家

【题解】[P3258 JLOI2014]松鼠的新家 树链剖分板子题。 总结一点容易写错的地方吧: if(d[top[u]]<d[top[v]]) swap(u,v);注意是\(top\)。 在\(dfs2\)中,if(e[t].to!=r[now]&&e[t].to!=son[now])注意\(r[now]\)而不是\(last\) #include<bits/stdc++.h> using namespace std; #defin