luogu 模拟题 赤夜
来源:互联网 发布:大连东芝医疗知乎 编辑:程序博客网 时间:2024/05/19 14:01
做法一:对于每一个点的修改,顺序改变一下是不会影响结果的。我们离线做,可以一个点一个点的修改。
(还是过不了啊,仍然T)qwq。
做法二:
我们尽量把实际的操作搞成标记,不操作,以降低复杂度。
我们用三个数组实现。
pushup[x]表示x周围的点对x的影响,tag[x]记录的是x这个点操作的次数,sontag[x]表示的是x所有的儿子节点的操作次数。
那么修改时:
查询时:
分别是自己上面操作时产生的和,父亲每操作一次自己的和就会+2(父亲和自己个占1),爷爷每操作一次自己会+1(只有父亲的1),加上父亲的其他儿子每操作一次就会使父亲+1,父亲又在x周围。
总的来说就是操作自己的贡献+操作其他点对自己产生的贡献。
时间复杂度O(n+m)。
需要读入优化。
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define LL long longusing namespace std;const int N=1e5+77;int n,m,siz[N],f[N];LL ans,pushup[N],tag[N],sontag[N];long long read(){ long long res = 0; char ch = 0; while (ch < '0' || ch > '9') ch = getchar(); while (ch >= '0' && ch <= '9') { res = res * 10 + ch - '0'; ch = getchar(); } return res;}int main(){ freopen("sample.in","r",stdin); freopen("sample.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) siz[i]++; for(int x,i=2;i<=n;i++) { x=read(); f[i]=x; siz[i]++;siz[x]++; } for(int x,i=1;i<=m;i++) { x=read(); pushup[x]+=siz[x]; pushup[f[x]]+=2; pushup[f[f[x]]]+=1; tag[x]++; sontag[f[x]]++; LL s=0; s+=pushup[x]+2*tag[f[x]]+tag[f[f[x]]]+sontag[f[x]]-tag[x]; ans+=s; } printf("%lld\n",ans); return 0;}
阅读全文
0 0
- luogu 模拟题 赤夜
- luogu 模拟题 青蛙叫
- [luogu模拟赛] 11.1
- [luogu模拟赛] 11.2
- luogu 1088 火星人(模拟)
- Luogu考前模拟Round2总结
- Luogu CON1041 NOIP模拟赛一试提示
- luogu试练场の简单的模拟
- Luogu-P2527 (模拟出单调队列)
- luogu #2527 Panda的烦恼(模拟)
- luogu March签到题
- luogu 基础题
- luogu P3601 签到题
- Luogu CON1041 NOIP模拟赛一试题解
- 【模拟】Luogu P1518 两只塔姆沃思牛(The Tamworth Two)
- Luogu 1311(dp/模拟)(NOIP 2011)
- Luogu P1563 [NOIP2016]玩具谜题
- NOIp2009TG T2/Luogu P1072 Hankson的趣味题 解题报告
- 对QString字符串截取之mid操作
- 设计模式的学习
- exports与module.exports、export与export default的关系
- loading图标
- 关于Oracle默认用户名system密码不正确登录不上解决方案
- luogu 模拟题 赤夜
- 随便写写
- mysql插入表中的中文显示为乱码或问号的解决方法
- 由伦敦领军的欧洲顶级数据中心市场蓬勃发展
- session机制详解以及session的相关应用
- MVC,MVP 和 MVVM详解
- 动态设置TextView边框颜色
- hive-2.1.1安装指南
- 阿里巴巴风鸣:做技术Leader要有危机意识