传送门

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

注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有加入操作.如果考虑了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. Flask Mysql数据库连接

    下载库: pip install flask-sqlalchemy 下载后进入终端使用python后import导入模块测试没有报错就说明成功了 py文件: # -*- encoding: utf-8 ...

  2. React之Perf

    import Perf from 'react-addons-perf' // ES6语法 var Perf = require('react-addons-perf') // ES5语法针对node ...

  3. bzoj1791[IOI2008]Island岛屿(基环树+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...

  4. java的集合

    Collection: 1.list ArrayList.Vector.LinkedList ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. Vector是 ...

  5. Codeforces Round #523 (Div. 2)

    Codeforces Round #523 (Div. 2) 题目一览表 来源 考察知识点 完成时间 A Coins cf 贪心(签到题) 2018.11.23 B Views Matter cf 思 ...

  6. tar压缩解压文件

    查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/ ...

  7. (BFS/DFS) leetcode 200. Number of Islands

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  8. (进制转换 栈)P1143 进制转换 洛谷

    题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10n> ...

  9. mysql视图、触发事务、存储过程

    视图 视图是一个虚拟表(非真实存在的),其本质就是根据SQL语言获取动态的数据集,并为其命名,用户使用时只需要使用名称即可获得结果集,可以将结果集当做表来使用. 视图是存在数据库中的,如果我们程序中使 ...

  10. JAVA核心技术I---JAVA基础知识(抽象类和接口)

    一:抽象类 (一)定义 类:属性(0或多个)+方法(0或多个)一个完整(健康)的类:所有的方法都有实现(方法体)类可以没有方法,但是有方法就肯定要有实现,这才是一个完整的类一个完整的类才可以被实例化, ...