[Luogu 4092] HEOI/TJOI2016 树

[Luogu 4092] HEOI/TJOI2016 树

<题目链接>



搜了树剖标签不知道怎么就跳出了个暴搜题啊!

管他既然做了就发上来吧…

有修改标签就向下搜并修改,遇到标签即停止。

这题是真的真的短。

#include <cstdio>
#include <queue>
using std::queue;
const int MAXN=100010;
bool flag[MAXN];
int n,q,cnt,head[MAXN],top[MAXN];
struct edge
{
    int nxt,to;
    edge(int nxt=0,int to=0):nxt(nxt),to(to){}
}e[MAXN<<1];
void AddEdge(int u,int v)
{
    e[++cnt]=edge(head[u],v);
    head[u]=cnt;
}
void PushDown(int x)
{
    queue<int> q;
    q.push(x),flag[x]=top[x]=x;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u],v;i;i=e[i].nxt)
            if(!flag[v=e[i].to] && x^top[v])
                q.push(v),top[v]=x;
    }
}
int main(int argc,char *argv[])
{
    scanf("%d %d",&n,&q);
    for(int i=1,x,y;i<n;++i)
    {
        scanf("%d %d",&x,&y);
        AddEdge(x,y),top[i]=1;
    }
    top[n]=1;
    for(int i=1,x;i<=q;++i)
    {
        char c;
        scanf("\n%c %d",&c,&x);
        if(c==‘C‘)
            PushDown(x);
        else
            printf("%d\n",top[x]);
    }
    return 0;
}

谢谢阅读。

原文地址:https://www.cnblogs.com/Capella/p/8508775.html

时间: 2024-10-29 20:05:30

[Luogu 4092] HEOI/TJOI2016 树的相关文章

HEOI&amp;TJOI2016 树

标准意义上第一道非模板树剖题,虽然我并不认为它是树剖 另:这是一道水题,第二道本省省选题(菜的一批) Description link 题意简述:给一棵树,支持两种操作: 1.对一个节点打标记 2.求一个节点距离最近的直系祖先(就是根到它链上的那种节点) 定义:自己也算自己的祖先 Solution \[Begin\] 首先树和序列转化,求一波 \(dfn\) 序 整一棵线段树,维护这个序列 修改的时候就变成了了区间取 \(max\),这里不是那种纯 \(max\) 如果询问就变成了单点查询 这里

[Luogu] 可持久化线段树 1(主席树)

https://www.luogu.org/problemnew/show/P3834 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn = 2e5 + 10; #define RR freopen("gg.in", "r", stdin) int n

luogu 1712 区间(线段树+尺取法)

题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭区间,然后线段树的每一个节点表示一个半开半闭区间. 接着我们注意到需要求最小的花费,且这个花费只与选择的区间集合中的最大长度和最小长度有关. 这意味着如果最大长度和最小长度一定,我们显然是需要把中间长度的区间尽量的选择进去使答案不会变的更劣. 不妨把区间按长度排序,枚举每个最小长度区间,然后最大区间

【Luogu】P3384主席树模板(主席树查询K小数)

YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查完再改回来... MDZZ 于是就有了主席树. 先不考虑主席树,我们来考虑一个奇特的线段树. 一般的线段树,数列位置是下标,而把数列维护值作为线段树中存的元素. 那我们如果反过来,把数列元素当做线段树的下标...??? 比如说数列[4 2 3 1] 如果线段树的下标是1.2.3.4......? 那

[bzoj 1798][luogu p2023]Seq 线段树Seq

题目大意: 维护一个数列,支持区间乘,区间加,求区间和. 线段树题,对于乘和加操作我们可以维护一个标记.对于乘用乘法分配律分解. 代码如下: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int N = 100010; 7 int inline getint() 8 { 9

Luogu【模板】树状数组

https://www.luogu.org/problemnew/show/P3374 单点修改, 区间查询 1 //2018年2月18日17:58:16 2 #include <iostream> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 500001; 7 int n, m; 8 int a[N], c[N]; 9 10 inline int lowbit(int x){ 11 return x &

【luogu P3377 左偏树(可并堆)】 模板

题目连接:https://www.luogu.org/problemnew/show/P3377 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 300001 + 10; struct Left_Tree{ int val, fa, son[2], dis; }h[maxn&l

LUOGU P2344 奶牛抗议 (树状数组优化dp)

传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j-1])$,但是这样的时间复杂度是$O(n^2)?$,所以考虑优化,发现必须满足$sum[i]\ge sum[j-1]?$才能进行转移,那么直接离散化后用树状数组维护一个前缀和即可. #include<iostream> #include<cstdio> #include<cstr

luogu P2607 [ZJOI2008] 骑士 树dp

传送门 又一个没有上司的舞会 这个dp有环 妈妈怎么办啊 要不...环上随便断一条边? 然后最后选的时候分别取两个根节点不选的情况的最大值 几个要点: 1.图可能是多个环套树 要循环走完 2.不能只记录顶点 因为如果有重边的话会把二元环筛掉 3.位运算优先级... 要写成(i^1)==cntline Time cost inf 这题从上周就开始D 一度放弃 今天想整一下以前做过的所有题然后就 就写出来啦!!(开心) Code: (边界写的比较奇怪 是Debug的时候被吓怕了) 1 #includ