题面

题解

数据结构做傻了.jpg

考虑每一个节点,它的儿子的取值最多只有\(O(\sqrt {m})\)种,那么可以用一个双向链表维护儿子的所有取值以及该取值的个数,那么对儿子节点修改一个值就是\(O(\sqrt{m})\),整体修改可以通过在自己身上打一个标记做到\(O(1)\)

然后还要修改父亲,那么可以通过修改父亲的父亲的儿子实现,并把父亲打上一个加一标记

然后还需要知道该时刻某个点的具体取值,可以通过父亲身上整体加一的标记和自己身上被儿子打的标记的总和求出

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(G,u) for(int i=G.head[u],v=G.e[i].v;i;i=G.e[i].nx,v=G.e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=5e5+5,P=1000109107;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
struct Gr{struct eg{int v,nx,w;}e[N<<1];int head[N],tot;inline void add(R int u,R int v){e[++tot]={v,head[u],1},head[u]=tot;}inline void init(int u,int v){e[++tot].w=v,head[u]=tot;}
}G,T;
int t1[N],t2[N],son[N],fa[N];
int n,m,res,sum,u,v;
void dfs(int u){go(G,u)if(v!=fa[u]){fa[v]=u,dfs(v);++son[u];}
}
int main(){
//  freopen("testdata.in","r",stdin);freopen("cactus.in","r",stdin);freopen("cactus.out","w",stdout);n=read(),m=read();fp(i,1,n-1)u=read(),v=read(),G.add(u,v),G.add(v,u);dfs(1);fa[1]=n+1,son[n+1]=1;fp(i,1,n+1)if(son[i])T.init(i,son[i]);fp(j,1,m){u=read(),sum=0;go(T,u)++T.e[i].v;if(u>1){int ff=fa[fa[u]],val=t2[fa[u]]+t1[ff],las=0;go(T,ff)if(T.e[i].v==val){if(T.e[i].w>1)--T.e[i].w;else{if(i==T.head[ff])T.head[ff]=T.e[i].nx;else T.e[las].nx=T.e[i].nx;}break;}else las=i;++val;int flag=0;go(T,ff)if(T.e[i].v==val){++T.e[i].w,flag=1;break;}if(!flag)T.add(ff,val);sum=val;}++t1[u],++t2[fa[u]];go(T,u)if(T.e[i].w&1)sum^=T.e[i].v;
//      printf("%d\n",sum);res=add(res,mul(sum,add(mul(j,j),j)));}printf("%d\n",res);return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10224016.html

jzoj5984. 【北大2019冬令营模拟2019.1.1】仙人掌 (分块)相关推荐

  1. jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)

    这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...

  2. JZOJ 5984. 【北大2019冬令营模拟2019.1.1】仙人掌

    Description Input Output Sample Input 5 10 1 2 2 3 2 4 3 5 1 5 2 4 3 5 4 2 3 1 Sample Output 2060 Da ...

  3. jzoj5989. 【北大2019冬令营模拟2019.1.6】Forest (set)

    题面 题解 为了一点小细节卡了一个下午--我都怕我瞎用set把电脑搞炸-- 观察一次\(1\)操作会造成什么影响,比如说把\(A[i]\)从\(x\)改成\(y\): \(D[x]\)会\(-1\), ...

  4. jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)

    题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示 ...

  5. jzoj 5970.【北大2019冬令营模拟12.1】space 莫比乌斯反演

    Description Input Output Sample Input 2 1 2 2 1 1 2 2 1 Sample Output 24 样例解释: Data Constraint 分析: 对 ...

  6. JZOJ[5971]【北大2019冬令营模拟12.1】 party(1s,256MB)

    题目 题目大意 给你一棵树,在树上的某一些节点上面有人,要用最小的步数和,使得这些人靠在一起.所谓靠在一起,即是任意两个人之间的路径上没有空的节点(也就是连在一起). N ≤ 200 N \leq 2 ...

  7. JZOJ 5977. 【清华2019冬令营模拟12.15】堆

    Description Input Output Sample Input 10 10 0 1 1 2 2 4 3 12 2 6 2 15 3 5 3 10 7 7 9 16 2 3 1 10 9 2 ...

  8. 【清华2019冬令营模拟12.8】视野

    计算几何弱渣果然就是一点感觉也没有. 题目大意: 题解: 首先考虑不删怎么做? 肯定要把点给离散,那么现在对于每一小段,要求出是哪条线段最近? 按一个顺序扫过去,每一条线段打一个加入和删除的标记. 由 ...

  9. 2018冬令营模拟测试赛(十八)

    2018冬令营模拟测试赛(十八) [Problem A]Table 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述&qu ...

最新文章

  1. Typora+PicGo图床配置(本地图片-->网络url~博客必备)
  2. python random 随机生成一个数
  3. Vmo前端数据模型设计
  4. Oracle instant client安装与设置 - Windows版,可用WIN7
  5. android JSONObject的使用
  6. python常用的绘图库_Python3绘图库Matplotlib(01)
  7. 容器入门(6) - 获取访问Docker Registry的公钥证书
  8. helperdialect mysql_Mybatis使用pageHelper步骤(动态分页)
  9. 无法启动此程序 因为计算机中丢失hypertrm.dll,开机弹出找不到HYPERTRM.dll
  10. Dev-Cpp_6.0下载
  11. 计算机知识查找,计算机基础知识:如何查找文件
  12. 无需格式化 移动硬盘/U盘上装WinPE、Win7PE图解
  13. 冰蝎各版本工具分析与魔改思路
  14. win2003 php配置,Win2003 PHP环境配置
  15. HTML5七夕情人节表白网页(结婚倒计时) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
  16. 二手物品交易管理系统
  17. 有关冰川的小知识(1)
  18. AEcs4输出是After Effects:Out of memry(16200k requested) (23::40) 什么意思?
  19. mysql5.6 centos_centos部署mysql5.6免安装版
  20. mac 快速关闭访达

热门文章

  1. 《在网页中实现手机验证码登陆代码》
  2. python 爬取数据intraday_使用Python检索Fitbit心率数据
  3. js监听html页面大小变化,JS监听窗口变化实时获取浏览器窗口大小
  4. intellij HTTP状态 404 - 未找到_了解你的业务状态!使用 Nagios 打造专业的业务状态监控...
  5. java word 水印_如何通过Java添加水印到Word文档
  6. Java对图片进行添加水印操作
  7. 在javaScript中,变量名和函数名不能重名
  8. copy与deepcopy、赋值的区别
  9. 基于PHP+MySQL的学生信息管理系统(源码)
  10. 数学建模学习笔记(第三章:量纲分析法,量纲齐次原则)