BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!
真是道好题。。。感到灵魂的升华。。。
按dfs序建树状数组,拿前缀和去求解散块;
按点的标号分块,分成一个个区间,记录区间子树和 的 总和。。。
具体地,需要记录每个点u修改后,对每一个块i的贡献,记为t[u][i]
计算思路:dfs时,每到一个新的点,就让++c[其所在块],为了记录每个块中的点出现过几次,就相当于记录这个点 被每一块中的点 包含了几次 , 然后for一遍,记录t[u][i]=c[i]
当修改一个点时,这个块的和+=这个点u对块i的贡献*这个点的变化量,即sum[i]+=t[u][i]*(v-a[u]);
- #include<cstdio>
- #include<iostream>
- #include<cmath>
- #define ll unsigned long long
- #define R register ll
- using namespace std;
- const int N=;
- inline ll g() {
- R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
- do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
- }
- int n,m,q,T,cnt,num,rt;
- int vr[N<<],nxt[N<<],a[N],fir[N],dfn[N],l[N],r[N],c[],t[N][],pos[N];
- ll w[N],sum[];
- inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
- inline int lbt(int x) {return x&-x;}
- inline void inc(int pos,ll d) {for(;pos<=n;pos+=lbt(pos)) w[pos]+=d;}
- inline ll query(int pos) { R ret=;
- for(;pos;pos-=lbt(pos))
- ret+=w[pos]; return ret;
- }
- void dfs(int u) { l[u]=++num,++c[pos[u]]; inc(num,a[u]);
- for(R i=;i<=pos[n];++i) t[u][i]=c[i];
- for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
- if(l[v]) continue; dfs(v);
- } r[u]=num,--c[pos[u]];
- }
- signed main() {
- n=g(),q=g(); T=sqrt(n); m=(n%T)?n/T+:n/T;
- for(R i=;i<=n;++i) a[i]=g(); for(R i=;i<=n;++i) pos[i]=(i-)/T+;
- for(R i=,u,v;i<=n;++i) {u=g(),v=g(); if(!u) rt=v; else add(u,v),add(v,u);}
- dfs(rt);
- for(R i=;i<=pos[n];++i) for(R j=(i-)*T+,lim=min(i*T,(ll)n);j<=lim;++j) sum[i]+=query(r[j])-query(l[j]-);
- for(R i=;i<=q;++i) {
- R k=g(),u=g(),v=g();
- if(k&) {
- inc(l[u],v-a[u]);
- for(R i=;i<=pos[n];++i) sum[i]+=1ull*t[u][i]*(v-a[u]);
- a[u]=v;
- } else { R ret=;
- if(pos[u]==pos[v]) for(R i=u;i<=v;++i) ret+=query(r[i])-query(l[i]-);
- else {
- for(R i=u;i<=pos[u]*T;++i) ret+=query(r[i])-query(l[i]-);
- for(R i=(pos[v]-)*T+;i<=v;++i) ret+=query(r[i])-query(l[i]-);
- } for(R i=pos[u]+;i<pos[v];++i) ret+=sum[i]; printf("%llu\n",ret);
- }
- }
- }
这题真神仙。。2019.04.23
BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!的更多相关文章
- bzoj 4765 普通计算姬 dfs序 + 分块
题目链接 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些.普通计算机能计算数列区间和,而普通计算姬能 ...
- 2018.06.30 BZOJ4765: 普通计算姬(dfs序+分块+树状数组)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Description "奋战三星期,造台计算机".小G响应号召,花了三小时 ...
- BZOJ 2819: Nim dfs序维护树状数组,倍增
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...
- BZOJ 4999: This Problem Is Too Simple! DFS序+LCA+树状数组+离线
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) , ...
- BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)
本来还想链剖的,结果才发现能直接树状数组的= = 记录遍历到达点与退出点的时间,然后一开始每个到达时间+1,退出时间-1,置为公路就-1,+1,询问直接点1到该点到达时间求和就行了- - CODE: ...
- HDU 6203 ping ping ping(dfs序+LCA+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意: n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连 ...
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
- POJ 2763 Housewife Wind(DFS序+LCA+树状数组)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 11419 Accepted: 3140 D ...
- 【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)
题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作: 1:将X号点的点权修改为Y 2:查询X到Y的路径上第K大的点权 n,q<=80000 a[i]<=10^8 思路: ...
随机推荐
- dubbo+zookeeper+dubboadmin环境搭建
4.环境搭建 4.1.zookeeper注册中心的配置安装(在windows平台下,Linux类似,见官方文档)(Redis注册中心安装,简易注册中心安装,简易监控中心安装,见官方文档) 下载zook ...
- python之模块(在命令行当中使用pip install 模块来进行模块的安装)
模块:在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位. 在我们编程的时候我们如果将所有的文件都放在那个py文件中,我们的py文件会很大,这样也很不好 ...
- adb device offline 解决办法
当电脑中的豌豆荚之类的应用打开的状态下 adb devices 显示连接状态 关闭手机助手之后,adb devices总显示 device offline 后来发现sdk platform-tool ...
- 3-2 zk客户端连接关闭服务端,查看znode
使用ZooKeeper官方提供的Client来连接.路径类似的结构. 连接到我们的门户HOST. quota属于zookeeper.quota是子节点,zookeeper是父节点.quota其实是一个 ...
- 使用Java2D改善API的绘制效果
---------------siwuxie095 工程名:TestSwingPaintAPI 包名:com.siwuxie095.swingp ...
- java web前端发送请求的4种方式
表单 action, 链接href,js 绑定按钮 ajax绑定标签 <h1>通过表单提交参数</h1> <form action="/day46_v1/Ser ...
- 面试题:hibernate 第二天 快照 session oid 有用
## Hibernate第二天 ## ### 回顾与反馈 ### Hibernate第一天 1)一种思想 : ORM OM(数据库表与实体类之间的映射) RM 2)一个项目 : CRM 客户关系管理系 ...
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-002插入排序法(Insertion sort)
一.介绍 1.时间和空间复杂度 运行过程 2.特点: (1)对于已排序或接近排好的数据,速度很快 (2)对于部分排好序的输入,速度快 二.代码 package algorithms.elementar ...
- 1、awk打开多个文件的方法
转载:http://www.cnblogs.com/Berryxiong/p/6209324.html 1.当awk读取的文件只有两个的时候,比较常用的有三种方法(1)awk 'NR==FNR{... ...
- beforeFilter()
在控制器每个动作之前执行,可以方便地检查有效的会话,或者检查用户的权限. function beforeFilter() { parent::beforeFilter(); if(empty($thi ...