[luogu3767]膜法

luogu

神仙题

线段树分治+带权并查集

把每个操作看成点

首先这个操作的结构是一棵树

你发现每个点的对它的子树产生影响

我们可以想到用dfn序把它转成一段区间用线段树分治来做

但是还有删除操作,相当于在一个大区间里面挖掉几个小区间

可以对每个操作开一个vector记录区间搞一搞

然后带权并查集是模5意义下的,可以认为给你的操作相当于从u连向v的一条权值为1或2的边

当u,v在同一个集合时,判断是否满足条件,否则就连边

  1. #define pb push_back
  2. #define ls x<<1,l,mid
  3. #define rs x<<1|1,mid+1,r
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. const int _=1e5+5;
  7. int re(){
  8. int x=0,w=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
  11. return x*w;
  12. }
  13. int n,m,ts,top,dis;
  14. int fa[_],del[_],sz[_],dfn[_],par[_],siz[_],d[_];
  15. bool ans[_];
  16. struct node{int u,v;}st[_];
  17. struct edge{int u,v,w;}e[_];
  18. vector<int>son[_],s[_];
  19. vector<edge>t[_<<2];
  20. void dfs(int u){
  21. sz[u]=1;if(u)dfn[u]=++ts;
  22. if(del[u])s[del[u]].pb(u);
  23. for(int i=0,j=son[u].size();i<j;i++){
  24. int v=son[u][i];
  25. dfs(v);sz[u]+=sz[v];
  26. }
  27. }
  28. void add(int&x,int y){x=(x+y)%5;}
  29. int find(int x){
  30. add(dis,d[x]);
  31. if(x==par[x])return x;
  32. return find(par[x]);
  33. }
  34. void upd(int x,int l,int r,int ql,int qr,edge E){
  35. if(ql<=l&&r<=qr){t[x].pb(E);return;}
  36. int mid=(l+r)>>1;if(ql<=mid)upd(ls,ql,qr,E);
  37. if(qr>mid)upd(rs,ql,qr,E);
  38. }
  39. void solve(int x,int l,int r,bool ok){
  40. int pre=top;
  41. for(int i=0,j=t[x].size();i<j;i++){
  42. int u=t[x][i].u,v=t[x][i].v,w=t[x][i].w;
  43. dis=0;int fu=find(u),du=dis;
  44. dis=0;int fv=find(v),dv=dis;
  45. if(fu==fv&&(du-dv+5)%5!=w)ok=0;
  46. if(fu^fv){
  47. if(siz[fu]>siz[fv]){swap(du,dv);swap(u,v);swap(fu,fv);w=-w;}
  48. siz[fv]+=siz[fu];par[fu]=fv;
  49. d[fu]=(w+dv-du+10)%5;st[++top]=(node){fu,fv};
  50. }
  51. }
  52. if(l==r)ans[l]=ok;
  53. else{int mid=(l+r)>>1;solve(ls,ok);solve(rs,ok);}
  54. while(top^pre){
  55. int u=st[top].u,v=st[top].v;top--;
  56. siz[v]-=siz[u];par[u]=u;d[u]=0;
  57. }
  58. }
  59. int main(){
  60. n=re(),m=re();
  61. int op,u,v;
  62. for(int i=1;i<=m;i++){
  63. son[fa[i]=re()].pb(i);op=re();
  64. if(op==3)del[i]=re();
  65. else{u=re(),v=re();e[i]=(edge){u,v,op};}
  66. }
  67. dfs(0);
  68. for(int i=1;i<=m;i++){
  69. if(del[i])continue;
  70. int k=s[i].size(),lst=dfn[i];
  71. for(int j=0;j<k;j++){
  72. int u=s[i][j];
  73. if(lst<dfn[u])upd(1,1,m,lst,dfn[u]-1,e[i]);
  74. lst=dfn[u]+sz[u];
  75. }
  76. if(lst<dfn[i]+sz[i])upd(1,1,m,lst,dfn[i]+sz[i]-1,e[i]);
  77. }
  78. for(int i=1;i<=n;i++)par[i]=i,siz[i]=1;
  79. solve(1,1,m,1);
  80. for(int i=1;i<=m;i++)puts(ans[dfn[i]]?"excited":"naive");
  81. return 0;
  82. }

[luogu3767]膜法的更多相关文章

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

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

  2. luogu P3767 膜法

    传送门 这题如果没有删除操作,可以直接使用可持久化并查集 注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有 ...

  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. 【bzoj5055】膜法师(离散化+树状数组)

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

  9. 【PCB】扫盲总结

    1.PCB是什么 PCB( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气连接的载体.由于它是采用电子印刷 ...

随机推荐

  1. ansible自动化工具使用

    1.服务端配置 安装即可,无需启动,在安装ansible之前需要配置epel源 [root@m01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirr ...

  2. 【共享单车】—— React后台管理系统开发手记:AntD Table基础表格

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  3. fmt标签的格式化日期使用

    声明: <%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %> or <%@ taglib pre ...

  4. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_字符串

    一般声明字符串都会加一个长度的限制,比如A:STRING(80);至于真实的字符串长度不要超过这个限制即可   在测试中,我演示了两个字符串的方法,CONCAT字符串拼接和REPLACE字符串替换.拼 ...

  5. 在windows上一键编译各种版本的protobuf(2017-12-05修改)

    所需工具 : cmake  for  windows 和  git for windows 原理:protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cm ...

  6. C3:建造者模式 Builder

    将一个复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示. 应用场景: A.创建这个对象通常需要较多的参数,才能完整的表示该对象.B.类的各个组成部分的具体实现类或算法经常面临变化,但将他 ...

  7. Laravel之加密解密/日志/异常处理及自定义错误

    一.加密解密 1.加密Crypt::encrypt($request->secret) 2.解密try { $decrypted = Crypt::decrypt($encryptedValue ...

  8. 基于SpringMVC+Ext.js的权限管理系统(无权限框架)

    代码地址如下:http://www.demodashi.com/demo/12811.html 0.准备工作 注意!!! 本案例数据库相关请下载例子包,内有数据库脚本.EXCEL数据表和详细的设计文档 ...

  9. 深入理解dp px density

    1 http://blog.csdn.net/lcaihy1314/article/details/8446401 2 待续

  10. SpringBoot集成actuator模块的基本使用

    © 版权声明:本文为博主原创文章,转载请注明出处 1. 版本 SpringBoot:2.0.0.RELEASE 2. 集成 SpringBoot集成actuator模块非常简单,只需要引入actuat ...