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 这道题……不得不说,从标题到题面都能看出一股浓浓的膜法气息……苟…… 题意就是统计顺序 ...
随机推荐
- pagehelper 使用
MySQL对分页的支持 简单来说MySQL对分页的支持是通过limit子句.请看下面的例子. limit关键字的用法是 LIMIT [offset,] rows offset是相对于首行的偏移量(首行 ...
- MySQL使用普通用户访问返回ERROR 1698 (28000): Access denied for user 'root'@'localhost'
这个问题最开始查资料都说要改密码,密码不对.其实不是这个样子都. 解决方法 修改/etc/mysql/my.cnf,添加以下内容 [mysqld] skip-grant-tables 重启mysql服 ...
- [luogu1552][派遣]
题目链接 思路 首先肯定要树形dp,一直没想到怎么用左偏树.如果不断弹出又不断地合并复杂度不就太高了.瞄了眼题解才知道可以直接用大根树.然后记录出当前这棵左偏树的大小(树里面所有点的薪水之和)以及点的 ...
- MVC相关问题归纳
问题: 1.How MVC pattern flows 2.对象模型.关系模型 3.OR Framework 4.EF(Entity FrameWork)实体框架 5.模型驱动数据数据驱动模型的两种方 ...
- PKUWC2019滚粗记
真的不想说些什么了,还是自己太菜了,水平低啊.深深感受到NOIP2017以后的那种绝望,这最好的签约清北的机会,就这样白白错过了.本以为自己的应该有NOIAg的实力,运气好是前120吧,没想到自己还是 ...
- python之网络编程--锁、信号量、线程、队列
一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...
- Mybatis 中获得 connection
转: Mybatis 中获得 connection 2012年07月30日 19:02:21 dqsweet 阅读数:13861 @Autowired private SqlSession sql ...
- 第一节,初识OpenCV3-图像的读、写、显、格式转化等
之前一直在看深度学习,突然用到了对图像处理的东西,所以过来补充一下OpenCV基础. 就顺便从网上了买了一本OpenCV 3计算机视觉这本书,这本书比较薄,但是目前已经够我用了,在这里就记录一下我的学 ...
- session/cookie/token
1.cookie是把登录信息存放在客户端 2.session是把登录信息存放在服务器 3.token是在登录的时候服务器提供一个令牌标识,可以存放在local storage,请求资源时带上token ...
- #1479 : 三等分(树形DP)
http://hihocoder.com/problemset/problem/1479 #1479 : 三等分 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最 ...