思路:

注意到len<=10

按照权值max-min<=sqrt(n)*len 分块
记一下前缀和  每修改sqrt(n)次以后重新分块
 
修改的时候整块打标记  两边重构
(这题常数卡得要死   找同学要来fread才过)

查询的时候 就 二分答案 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卡常的更多相关文章

  1. BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]

    BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...

  2. 【卡常 bitset 分块】loj#6499. 「雅礼集训 2018 Day2」颜色

    好不容易算着块大小,裸的分块才能过随机极限数据:然而这题在线的数据都竟然是构造的…… 题目描述 有 $n$ 个数字,第 $i$ 个数字为 $a_i$. 有 $m$ 次询问,每次给出 $k_i$ 个区间 ...

  3. 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)

    洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...

  4. BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常

    Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...

  5. [luogu1972][bzoj1878][SDOI2009]HH的项链【莫队+玄学卡常】

    题目大意 静态区间查询不同数的个数. 分析 好了,成功被这道题目拉低了AC率... 打了莫队T飞掉了,真的是飞掉了QwQ. 蒟蒻想不出主席树的做法,就换成了莫队... 很多人都不知道莫队是什么... ...

  6. BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...

  7. bzoj3676 [Apio2014]回文串 卡常+SAM+树上倍增

    bzoj3676 [Apio2014]回文串 SAM+树上倍增 链接 bzoj luogu 思路 根据manacher可以知道,每次暴力扩展才有可能出现新的回文串. 所以推出本质不同的回文串个数是O( ...

  8. [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)

    题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0​(n) be the number of positive diviso ...

  9. BZOJ 4765(分块+树状数组)

    题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...

随机推荐

  1. 利用tempalte.js模版引擎渲染页面,作对应的数据处理

    需要启个服务 需引入jquery.js和template.js <!DOCTYPE html> <html lang="en"> <head> ...

  2. [luoguP2782] 友好城市(DP)

    传送门 转化成 lis 后 n2 搞就行 ——代码 #include <cstdio> #include <iostream> #include <algorithm&g ...

  3. spoj 375 树链剖分模板

    /* 只是一道树链刨分的入门题,作为模板用. */ #include<stdio.h> #include<string.h> #include<iostream> ...

  4. 20180705关于mysql binlog的解析方式

    来自:https://blog.csdn.net/u012985132/article/details/74964366/ 关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高.本篇就来 ...

  5. SIGSEGV 和 SIGBUS & gdb看汇编

    参考这篇文章: http://blog.chinaunix.net/uid-24599332-id-2122898.html SIGBUS和SIGSEGV也许是我们在平时遇到的次数最多的两个内存错误信 ...

  6. 为什么使用do{}while(0)?

    近期学习Cocos2d-x,看到不少使用do{}while(0)的宏定义,如: #define CC_SAFE_DELETE(p) do { delete (p); (p) = nullptr; } ...

  7. 黑马程序猿——JAVA基础——IO流

    ----------android培训.java培训.java学习型技术博客.期待与您交流!------------  一. 一.IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数 ...

  8. Socket 长连接 短连接 心跳 JAVA SOCKET编程

    简单解释就是: 短连接:建立连接,发送数据包.关闭连接 长连接:建立连接.发送数据包,发送心跳包,发送数据包,发送心跳包.发送心跳包. ..... 所以又频繁的数据收发的话.短连接会频繁创建TCP连接 ...

  9. NYOJ 330 一个简单的数学题【数学题】

    /* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...

  10. linux主机名 hostname

    1 ip地址.主机名和域名 ip地址是计算机在网络中的身份,这个是毋庸置疑的. 但是,在公网中呢?ip地址不好记忆,那么就用域名. 同样,在局域网中呢?ip地址同样不好记忆,那么就用主机名了. 2 主 ...