luogu P3767 膜法
这题如果没有删除操作,可以直接使用可持久化并查集
注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有加入操作.如果考虑了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 膜法的更多相关文章
- [luogu3767]膜法
[luogu3767]膜法 luogu 神仙题 线段树分治+带权并查集 把每个操作看成点 首先这个操作的结构是一棵树 你发现每个点的对它的子树产生影响 我们可以想到用dfn序把它转成一段区间用线段树分 ...
- 【OpenJudge3531】【背包DP】【膜法交配律】判断整除
判断整除 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.比如序列:1.2.4共有8种可能的序列:(+1) + (+ ...
- B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)
题目链接:https://cn.vjudge.net/contest/284294#problem/B 题目大意:查询区间内有多少个不相同的数. 具体思路:主席树的做法,主席树的基础做法是查询区间第k ...
- A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)
题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...
- BZOJ3669 膜法森林 - LCT
Solution 非常妙的排序啊... 仔细想想好像确实能够找出最优解QUQ 先对第一关键字排序, 在$LCT$ 维护第二关键字的最大值 所在的边. 添边时如果$u, v$ 不连通 就直接加边. 如 ...
- 2018.10.16 NOIP模拟 膜法(组合数学)
传送门 原题,原题,全TM原题. 不得不说天天考原题. 其实这题我上个月做过类似的啊,加上dzyodzyodzyo之前有讲过考试直接切了. 要求的其实就是∑i=lr(ii−l+k)\sum _{i=l ...
- NOIP模拟题 膜法
题目大意 给定若干组询问求$\sum\limits_{i=l}^r \dbinom{i}{k}$. 最终输出每组询问答案的乘积. 题解 首先把$l,r$分开处理相减,只需要求$\sum\limits_ ...
- Luogu P1082 同余方程(exgcd模版)
传送门 求ax%b = 1,即ax - by = 1: 很明显这是一个exgcd的形式. 那么要做这道题,首先需要gcd和exgcd的算法作铺垫. gcd(辗转相膜法): int gcd(int a, ...
- 【bzoj5055】膜法师(离散化+树状数组)
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=5055 这道题……不得不说,从标题到题面都能看出一股浓浓的膜法气息……苟…… 题意就是统计顺序 ...
随机推荐
- A1003. Emergency
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- Spring boot学习笔记之@SpringBootApplication注解
@SpringBootApplication(exclude = SessionAutoConfiguration.class) public class BootReactApplication { ...
- 第二节,神经网络中反向传播四个基本公式证明——BackPropagation
假设一个三层的神经网络结构图如下: 对于一个单独的训练样本x其二次代价函数可以写成: C = 1/2|| y - aL||2 = 1/2∑j(yj - ajL)2 ajL=σ(zjL) zjl = ∑ ...
- sed 的|
#!/bin/bash/etc/init.d/nginx start && \sed -i "s|/project/env/|/${PROJ}/${ENVT}/|g" ...
- phpStudy 5.5n +zendstudio12.5+xDebugger的配置
1.之前一直安装zendDebugger都没装上去,用phpStudy版本转换器转到对应版本的ZendDebuger也没用,后来发现自己下载的zendstudio的php是5.5的,而且自带了zend ...
- 简单BootLoader
目录 简单BootLoader 概述 NOR与NAND启动 链接脚本规划 初始化规划 参数设置 title: 简单BootLoader tags: linux date: 2018-09-28 23: ...
- maven_eclipse配置maven
1.eclipse配置3.3.9版本的maven 2.修改仓库位置
- Journal Storage Directory not formatted
类型一: 当你从异常信息中看到JournalNode not formatted,如果在异常中看到三个节点都提示需要格式化JournalNode. 如果你是新建集群,你可以重新格式化NameNode, ...
- JavaEE之JDBC编程[详解]
1.数据库简介 数据库(DB,Data Base ) 数据库管理系统(DBMS,Data Base Management System) 关系型数据库(RDB) 关系型数据库管理系统(RDBMS) S ...
- vue表单校验提交报错TypeError: Cannot read property 'validate' of undefined
TypeError: Cannot read property 'validate' of undefined at VueComponent.submitForm (plat_users.html: ...