传送门

这题如果没有删除操作,可以直接使用可持久化并查集

注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有加入操作.如果考虑了dfn序,那么每个操作影响的都是一个连续区间,一个删除操作会把一个加入操作的区间挖一个空

于是考虑线段树分治,把依赖关系的树建出来,以dfn序为下标建立线段树,每个点的加入操作都加到线段树的某个区间上去,然后从根出发,遇到一个点就做一遍操作,维护一下带权并查集,顺便把操作影响加入栈中,到叶子节点就可以记录答案,然后退出某个点可以从操作栈顶部依次撤销操作

#include<bits/stdc++.h>
#define LL long long
#define ldb long double
#define il inline
#define re register
#define ft first
#define sc second
#define mkpr make_pair using namespace std;
const int N=1e5+10,inf=999999999;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N],nt[N],hd[N],tot;
il void add(int x,int y){++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;}
struct node
{
int x,y,z;
};
vector<node> s[N<<2];
bool an[N];
int n,m,a[N],b[N][2],dfn[N],pp[N],sz[N],ti=-1;
vector<pair<int,int> > op[N];
int ff[N],mm[N],di[N],w[N],st[N][3],tp;
il int findf(int x)
{
if(ff[x]==x)return x;
int an=findf(ff[x]);
di[x]=di[ff[x]]+w[x];
return an;
}
#define mid ((l+r)>>1)
void modif(int o,int l,int r,int ll,int rr,node x)
{
if(ll<=l&&r<=rr) {s[o].push_back(x);return;}
if(ll<=mid) modif(o<<1,l,mid,ll,rr,x);
if(rr>mid) modif(o<<1|1,mid+1,r,ll,rr,x);
}
void quer(int o,int l,int r,bool p)
{
int nn=s[o].size();
bool np=p;
for(int i=0;i<nn;++i)
{
++tp;
int x=findf(s[o][i].x),y=findf(s[o][i].y),z=s[o][i].z,xx=di[s[o][i].x],yy=di[s[o][i].y];
if(x!=y)
{
z=xx-yy-z;
if(mm[x]<mm[y]) swap(x,y),z=-z;
st[tp][0]=y,st[tp][1]=x,st[tp][2]=mm[x];
ff[y]=x,mm[x]+=mm[y],w[y]=z;
}
else
{
st[tp][0]=st[tp][1]=st[tp][2]=0;
if(((xx-yy-z)%5+5)%5) np=0;
}
}
if(l==r) an[pp[l]]=np;
else quer(o<<1,l,mid,np),quer(o<<1|1,mid+1,r,np);
while(nn--)
{
ff[st[tp][0]]=st[tp][0],di[st[tp][0]]=w[st[tp][0]]=0;
mm[st[tp][1]]=st[tp][2];
--tp;
}
}
#undef mid
void dfs(int x)
{
pp[dfn[x]=++ti]=x,sz[x]=1;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
dfs(y);
sz[x]+=sz[y];
}
if(a[x]==3)
{
int xx=b[x][0];
op[xx].push_back(mkpr(dfn[x]-1,dfn[x]+sz[x]));
}
} int main()
{
n=rd(),m=rd();
for(int i=1;i<=m;++i)
{
add(rd(),i);
a[i]=rd();
if(a[i]<3) b[i][0]=rd(),b[i][1]=rd();
else b[i][0]=rd();
}
dfs(0);
for(int i=1;i<=m;++i)
{
if(a[i]==3) continue;
sort(op[i].begin(),op[i].end());
int nn=op[i].size(),l=dfn[i];
for(int j=0;j<nn;l=op[i][j].sc,++j)
{
if(op[i][j].ft<l) continue;
if(l<=op[i][j].ft) modif(1,1,m,l,op[i][j].ft,(node){b[i][0],b[i][1],a[i]});
}
if(l<=dfn[i]+sz[i]-1) modif(1,1,m,l,dfn[i]+sz[i]-1,(node){b[i][0],b[i][1],a[i]});
}
for(int i=1;i<=n;++i) ff[i]=i,mm[i]=1;
quer(1,1,m,1);
for(int i=1;i<=m;++i) puts(an[i]?"excited":"naive");
return 0;
}

luogu P3767 膜法的更多相关文章

  1. [luogu3767]膜法

    [luogu3767]膜法 luogu 神仙题 线段树分治+带权并查集 把每个操作看成点 首先这个操作的结构是一棵树 你发现每个点的对它的子树产生影响 我们可以想到用dfn序把它转成一段区间用线段树分 ...

  2. 【OpenJudge3531】【背包DP】【膜法交配律】判断整除

    判断整除 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.比如序列:1.2.4共有8种可能的序列:(+1) + (+ ...

  3. B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)

    题目链接:https://cn.vjudge.net/contest/284294#problem/B 题目大意:查询区间内有多少个不相同的数. 具体思路:主席树的做法,主席树的基础做法是查询区间第k ...

  4. A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)

    题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...

  5. BZOJ3669 膜法森林 - LCT

    Solution 非常妙的排序啊... 仔细想想好像确实能够找出最优解QUQ 先对第一关键字排序, 在$LCT$ 维护第二关键字的最大值 所在的边. 添边时如果$u, v$ 不连通 就直接加边.  如 ...

  6. 2018.10.16 NOIP模拟 膜法(组合数学)

    传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...

  7. NOIP模拟题 膜法

    题目大意 给定若干组询问求$\sum\limits_{i=l}^r \dbinom{i}{k}$. 最终输出每组询问答案的乘积. 题解 首先把$l,r$分开处理相减,只需要求$\sum\limits_ ...

  8. Luogu P1082 同余方程(exgcd模版)

    传送门 求ax%b = 1,即ax - by = 1: 很明显这是一个exgcd的形式. 那么要做这道题,首先需要gcd和exgcd的算法作铺垫. gcd(辗转相膜法): int gcd(int a, ...

  9. 【bzoj5055】膜法师(离散化+树状数组)

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=5055 这道题……不得不说,从标题到题面都能看出一股浓浓的膜法气息……苟…… 题意就是统计顺序 ...

随机推荐

  1. QML-关于Qt.rgba()颜色无法正常显示问题

    GitHub:八至 作者:狐狸家的鱼 本文链接:关于Qt.rgba()颜色的正确写法 当在正常给color属性写颜色的时候,用十六进制能正常显示,但是用Qt.rgba()时,颜色无法正常显示出来. 按 ...

  2. iview表单验证下拉框不通过问题

    iview表单验证的步骤: 第一步:给 Form 设置属性 rules :rules 第二步:同时给需要验证的每个 FormItem 设置属性 prop 指向对应字段即可 prop=”“ 第三步:注意 ...

  3. java基础入门-语法(1)

    因为平时用到一些java的项目,比如ElasticSearch,zookeeper等,有时也想看看里面怎么实现的,或者看到别人分析原理时候会用到java源码, 自己也想跟着学一下,最起码能看懂别人的分 ...

  4. java 中+的运算规则

    1.Java中的加法的运算优先级是从左往右的 2.字符串""隔壁跟的+号意思是字符串的连接 就不是加法了 3.'字符' 后面的+号意思是'字符'的ascall码值和后面的值相加 c ...

  5. JAVA-集合类型List(ArrayList、LinkedList)常用操作例子(基础必备)

    package com.net.xinfang.reflect; import java.util.ArrayList; import java.util.Arrays; import java.ut ...

  6. bootstrap实现checkbox全选、取消全选

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 最新版本的 ...

  7. canvas绘图history妙用

    function palette(canvas,ctx){ //初始化画布内部元素默认样式 this.strokeColor = 'red'; //默认选中红色触发颜色 this.fillColor ...

  8. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

  9. SQL Server2012安装流程

    今天手比较抽风,把原来的SQL Server给卸载了,卸载还卸了半天,真是…… 安装时找了好多教程,结果都不是很详细,然后准备自己摸索一下,把这个过程记录下来,供大家参考,如果有不当的地方,欢迎指正, ...

  10. 039、Data Volume 之 bind mount (2019-02-28 周四)

    参考https://www.cnblogs.com/CloudMan6/p/7142150.html     Date Volume 本质上是Dokcer host文件系统中的目录或者文件,能够直接被 ...