BZOJ 4867 分块+神tm卡常
思路:
注意到len<=10
查询的时候 就 二分答案 O(sqrt(n))判断
二分的上界要实时根据maxdeep变化才能过
//By SiriusRen
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,op,xx,yy,len,limval,Block,deep[N],cnt,dfn[N],lst[N],maxdep;
int first[N],next[N],v[N],w[N],tot,a[N],pos[N],maxx[N],minn[N],L[N],R[N],tag[N];
unsigned short sum[][];
inline int nextChr() {
static const int siz=<<;
static char buf[siz],*chr=buf+siz;
if(chr==buf+siz)fread(chr=buf,,siz,stdin);
return int(*chr++);
}
inline int read(){
register int r=,c=nextChr();
for(;c<;c=nextChr());
for(;c>;c=nextChr())r=(r<<)+(r<<)+c-;
return r;
}
inline void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){
dfn[x]=++cnt,a[cnt]=deep[x];
for(int i=first[x];~i;i=next[i])
deep[v[i]]=deep[x]+w[i],dfs(v[i]);
lst[x]=cnt;
}
void rebuild(int x){
for(int i=;i<=limval;i++)sum[x][i]=;maxx[x]=;
for(int i=L[x];i<=R[x];i++)sum[x][a[i]]++,maxx[x]=max(maxx[x],a[i]);
for(int i=;i<=maxx[x];i++)sum[x][i]+=sum[x][i-];
}
void build(){
int bs=;limval=n*len/Block;maxdep=;
for(int i=;i<=n;i++)a[i]=a[i]+tag[pos[i]],maxdep=max(maxdep,a[i]);
for(int i=;i<=n;){
bs++,L[bs]=R[bs]=i,maxx[bs]=minn[bs]=a[i];
while(i<=n&&max(maxx[bs],a[i])-min(minn[bs],a[i])<=limval&&R[bs]-L[bs]<=Block)
R[bs]=i,pos[i]=bs,maxx[bs]=max(maxx[bs],a[i]),minn[bs]=min(minn[bs],a[i]),i++;
}
for(int i=;i<=bs;i++){
maxx[i]-=(tag[i]=minn[i]);
for(int j=L[i];j<=R[i];j++)a[j]-=tag[i];
rebuild(i);
}
}
void change(int l,int r,int wei){
if(pos[l]==pos[r]){for(int i=l;i<=r;i++)a[i]+=wei;rebuild(pos[l]);}
else{
for(int i=l;i<=R[pos[l]];i++)a[i]+=wei;rebuild(pos[l]);
for(int i=L[pos[r]];i<=r;i++)a[i]+=wei;rebuild(pos[r]);
for(int i=pos[l]+;i<=pos[r]-;i++)tag[i]+=wei;
}
}
int kth(int l,int r,int wei){
int ans=;
if(pos[l]==pos[r]){for(int i=l;i<=r;i++)ans+=(tag[pos[l]]+a[i]<=wei);}
else{
for(int i=l;i<=R[pos[l]];i++)ans+=(tag[pos[l]]+a[i]<=wei);
for(int i=L[pos[r]];i<=r;i++)ans+=(tag[pos[r]]+a[i]<=wei);
for(int i=pos[l]+;i<=pos[r]-;i++)if(wei>=tag[i])
ans+=sum[i][min(maxx[i],wei-tag[i])];
}return ans;
}
int bsrch(int l,int r,int k){
if(r-l+<k)return -;
int lft=,rit=maxdep,ans=-;
while(lft<=rit){
int mid=(lft+rit)>>;
if(kth(l,r,mid-)+<=k)lft=mid+,ans=mid;
else rit=mid-;
}return ans;
}
int main(){
memset(first,-,sizeof(first));
n=read(),m=read(),len=read(),Block=min(n,(int)sqrt(n));
for(int i=;i<=n;i++)xx=read(),yy=read(),add(xx,i,yy);
dfs(),build();
while(m--){
if(cnt>Block)cnt=,build();
op=read(),xx=read(),yy=read();
if(op==)printf("%d\n",bsrch(dfn[xx],lst[xx],yy));
else limval+=yy,maxdep+=yy,change(dfn[xx],lst[xx],yy),cnt++;
}
}
BZOJ 4867 分块+神tm卡常的更多相关文章
- BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]
BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...
- 【卡常 bitset 分块】loj#6499. 「雅礼集训 2018 Day2」颜色
好不容易算着块大小,裸的分块才能过随机极限数据:然而这题在线的数据都竟然是构造的…… 题目描述 有 $n$ 个数字,第 $i$ 个数字为 $a_i$. 有 $m$ 次询问,每次给出 $k_i$ 个区间 ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常
Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...
- [luogu1972][bzoj1878][SDOI2009]HH的项链【莫队+玄学卡常】
题目大意 静态区间查询不同数的个数. 分析 好了,成功被这道题目拉低了AC率... 打了莫队T飞掉了,真的是飞掉了QwQ. 蒟蒻想不出主席树的做法,就换成了莫队... 很多人都不知道莫队是什么... ...
- BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...
- bzoj3676 [Apio2014]回文串 卡常+SAM+树上倍增
bzoj3676 [Apio2014]回文串 SAM+树上倍增 链接 bzoj luogu 思路 根据manacher可以知道,每次暴力扩展才有可能出现新的回文串. 所以推出本质不同的回文串个数是O( ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- BZOJ 4765(分块+树状数组)
题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...
随机推荐
- MySQL Insert数据量过大导致报错 MySQL server has gone away
接手了同事的项目,其中有一个功能是保存邮件模板(包含图片),同事之前的做法是把图片进行base64编码然后存在mysql数据库中(字段类型为mediumtext)然后保存三张图片(大概400k)的时候 ...
- 09.C语言:预处理(宏定义)、字节序、地址对齐
一.预处理 预处理 gcc -E Hello.c -o hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc ...
- JavaScript 面向对象的编程(一)
面向对象的JS var CheckObject = function(){ this.checkName = function(){ console.log('checkName'); } this. ...
- 【Codeforces 924C】Riverside Curio
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设第i天总共的线数为t[i] 水平线上线数为m[i]是固定的 水平线下的线数设为d[i] 则d[i]+m[i]+1=t[i] 也就是说问题可以 ...
- POJ 3270 置换群问题
题目大意是: 每头牛都有一个对应的值a[i],现在给定一个初始的牛的序列,希望通过两两交换,能够使这些牛按值升序排列,每次交换都会耗费一个 a[i]+a[j] 希望耗费最小,求出这个最小耗费 个人觉得 ...
- ACM数论常用知识完全解读
此版本纯属扯淡....... 一个一个来起.
- spring-boot | 整合通用Mabatis 分页插件PageHelper
Mybatis通用Mapper介绍 Mybatis 通用 Mapper 极其方便的使用 Mybatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询 优点: 通用 Mapper 可以极大的方 ...
- 如何取消codeblocks对msvcr100.dll的依赖?
用VS2010或是codeblocks开发的程序,在开发之外的机器上,可能会提前缺少msvcr100.dll之类的文件. 可以用如何设置,取消其对库文件的依赖. 当然,还要注意创建程序的类型.(补) ...
- C. Star sky 二维前缀和
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- W3School Memcached教程(安装/基本操作/高级操作/命令)
来自W3School的Memcached教程,基本上涵盖了从安装到状态监控的教程. 不过最全的应该是官方提供在GitHub上的Wiki教程,一切的标准都来自官方,参考:https://github.c ...