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 思路: ...
随机推荐
- hadoop-2.6.0.tar.gz + spark-1.6.1-bin-hadoop2.6.tgz + zeppelin-0.5.6-incubating-bin-all.tgz(master、slave1和slave2)(博主推荐)(图文详解)
不多说,直接上干货! 我这里,采取的是CentOS6.5,当然大家也可以在ubuntu 16.04系统里,这些都是小事 CentOS 6.5的安装详解 hadoop-2.6.0.tar.gz + sp ...
- centos7虚拟机桥接上网(DHCP)
centos设置成自动获取ip地址方式(DHCP) 1.打开终端查看网卡信息 #ifconfigifcfg-enp0s3lovirbro 2.编辑文件#vim /etc/sysconfig/netwo ...
- Java界面设计
---------------siwuxie095 Java SE(Java Standard Edition) 即 Java 标准版, 一般也 ...
- 阿里云、宝塔、wordpress建站
1 阿里云 购买一个学生机就行啦 2 宝塔 2.1 更改阿里云的镜像 技巧01:先关掉阿里云之前的镜像 技巧02:到镜像市场中寻找宝塔的镜像资源 2.2 配置安全组 宝塔的控制面板需要开通端口 888 ...
- 30-盐水(分段dfs)
链接:https://www.nowcoder.com/acm/contest/94/K来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 131072K,其他语言2621 ...
- 业务逻辑: Quartz的整合应用
1. 请谈一下你对Quartz的理解 思路:根据他解决的什么问题方面去阐述 2. 完成quartz和spring的整合应用 思路:触发时间.任务调度工程 步骤: 1. 创建maven工程,并导入qua ...
- vray学习笔记(4)混合材质是个什么东西
看下定义: The Blend material lets you mix two materials on a single side of the surface. Blend material材 ...
- Redis应用(django)
自定义使用redis 创建url 定义单例模式连接池 import redis # 连接池 POOL = redis.ConnectionPool(host='10.211.55.4', port=6 ...
- python运算优先级
运算符优先级(下面的优先级高) 运算符 描述 lambda Lambda表达式 or 布尔“或” and 布尔“与” not x 布尔“非” in not in 成员测试 is ...
- Delphi xe6 android Popup控件的使用
1.拖放Label.button和popup控件到form 2.在structure将button1和label1拖到popup1上,然后调整布局就可以 Popup有几个重要的属性: 1.Placem ...