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
Data Constraint
Solution
考虑暴力的根号算法,先将原树定为一颗有根树。
修改时先考虑其子节点,可以发现不同的权值最多有 m \sqrt m m 种(最坏情况是 1 , 2 , 3 , 4 … … 1,2,3,4…… 1,2,3,4……)
于是我们用一个链表存每个点的儿子节点不同种类的值及该值的个数。
对儿子节点的修改就是 O ( m ) O(\sqrt m) O(m ) 的。
那么修改它的父亲节点,我们只需找其父亲的父亲,再改儿子就可以了。
这里涉及到如何 O ( 1 ) O(1) O(1) 快速查询一个点的现时权值,这个打两个标记就可以了:
若修改点是 x x x ,那么我们令 t a g 1 [ x ] + + , t a g 2 [ f a [ x ] ] + + tag1[x]++ , tag2[fa[x]]++ tag1[x]++,tag2[fa[x]]++ ,来表示修改情况。
那么一个点 y y y 的现时权值就是 t a g 1 [ f a [ y ] ] + t a g 2 [ y ] tag1[fa[y]]+tag2[y] tag1[fa[y]]+tag2[y] 。
于是我们也能在 O ( m ) O(\sqrt m) O(m ) 的复杂度内完成其父亲节点的修改。
这个算法的时间复杂度上限为 O ( m m ) O(m\sqrt m) O(mm ) ,但实际上远达不到上限。
Code
#include<cstdio>
#include<cctype>
using namespace std;
typedef long long LL;
const int N=5e5+5,M=N*80,mo=1000109107;
int tot,sum;
int first[N],nex[N<<1],en[N<<1];
int first1[N],nex1[M],en1[M],w[M];
int fa[N],son[N],t1[N],t2[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline void insert(int x,int y)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;
}
void dfs(int x)
{for(int i=first[x];i;i=nex[i])if(en[i]^fa[x]){fa[en[i]]=x;son[x]++;dfs(en[i]);}
}
int main()
{freopen("cactus.in","r",stdin);freopen("cactus.out","w",stdout);int n=read(),m=read();for(int i=1;i<n;i++){int x=read(),y=read();insert(x,y);insert(y,x);}dfs(1);fa[1]=n+1;son[n+1]=1;tot=0;for(int i=1;i<=n+1;i++){nex1[++tot]=first1[i];first1[i]=tot;en1[tot]=0;w[tot]=son[i];}for(int j=1;j<=m;j++){int x=read();for(int i=first1[x];i;i=nex1[i]) en1[i]++;int ans=0;if(x>1){int y=fa[fa[x]],num=t2[fa[x]]+t1[y];for(int i=first1[y],last=0;i;last=i,i=nex1[i])if(en1[i]==num){if(w[i]>1){w[i]--;break;}if(i==first1[y]){first1[y]=nex1[i];}else{nex1[last]=nex1[i];}break;}num++;bool pd=false;for(int i=first1[y];i;i=nex1[i])if(en1[i]==num){w[i]++;pd=true;break;}if(!pd){nex1[++tot]=first1[y];first1[y]=tot;en1[tot]=num;w[tot]=1;}ans=num;}t1[x]++;t2[fa[x]]++;for(int i=first1[x];i;i=nex1[i])if(w[i]&1) ans^=en1[i];ans=ans*((LL)j*j%mo+j)%mo;sum=(sum+ans)%mo;}printf("%d",sum);return 0;
}
JZOJ 5984. 【北大2019冬令营模拟2019.1.1】仙人掌相关推荐
- jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)
这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...
- jzoj5984. 【北大2019冬令营模拟2019.1.1】仙人掌 (分块)
题面 题解 数据结构做傻了.jpg 考虑每一个节点,它的儿子的取值最多只有\(O(\sqrt {m})\)种,那么可以用一个双向链表维护儿子的所有取值以及该取值的个数,那么对儿子节点修改一个值就是\( ...
- jzoj5989. 【北大2019冬令营模拟2019.1.6】Forest (set)
题面 题解 为了一点小细节卡了一个下午--我都怕我瞎用set把电脑搞炸-- 观察一次\(1\)操作会造成什么影响,比如说把\(A[i]\)从\(x\)改成\(y\): \(D[x]\)会\(-1\), ...
- jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)
题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示 ...
- 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 分析: 对 ...
- JZOJ[5971]【北大2019冬令营模拟12.1】 party(1s,256MB)
题目 题目大意 给你一棵树,在树上的某一些节点上面有人,要用最小的步数和,使得这些人靠在一起.所谓靠在一起,即是任意两个人之间的路径上没有空的节点(也就是连在一起). N ≤ 200 N \leq 2 ...
- 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 ...
- 【JZOJ 6079】【GDOI2019模拟2019.3.23】染色问题
Description m≤n+5,k,n≤105m\leq n+5,k,n\leq10^5m≤n+5,k,n≤105 Solution 1 这个图只有5条返祖边所以才能做, 先把所有有返祖边的点拿出 ...
- 【清华2019冬令营模拟12.8】视野
计算几何弱渣果然就是一点感觉也没有. 题目大意: 题解: 首先考虑不删怎么做? 肯定要把点给离散,那么现在对于每一小段,要求出是哪条线段最近? 按一个顺序扫过去,每一条线段打一个加入和删除的标记. 由 ...
最新文章
- 网络协议OSI、TCP/IP协议、Socket套接字和第三方AsyncSock的使用等解析
- 网站推广专员浅析网站推广运营如何提升企业网站转化率?
- linux 某个文件打不开了,linux操作系统下,exe文件为什么打不开?
- JS性能--DOM编程之重排与重绘
- 【Java】类加载过程
- IOS学习笔记二十NSSet和NSMutableSet
- npm 安装less插件_node+npm+webpack+less安装
- dictionary 用linQ排序
- SpringBoot从入门到精通教程
- 回顾---对教师提出的5个问题的回答及个人感悟
- windows server 2008 大量拷贝后释放内存
- Silverlight5 RC调用Win32API
- 平面直角坐标系中的旋转公式_【初中数学大招流】从平面几何到解析几何
- 汇编语言程序设计-钱晓捷(第五版)第三章-汇编语言程序格式
- 轻松调用Google翻译
- redis集群异常 — redis.clients.jedis.exceptions.JedisConnectionException: no reachable node in cluster
- 太吓人了,dub编译,编译phobos
- 2021年中式面点师(中级)最新解析及中式面点师(中级)模拟考试题库
- C++数组连接求能被7整除的数
- 使用vs2015打开以前版本的.sln工程不兼容的问题