题面

传送门

题解

转化为\(dfs\)序之后就变成一个区间加,区间查询\(k\)小值的问题了,这显然只能分块了

然而我们分块之后需要在块内排序,然后二分\(k\)小值并在块内二分小于它的元素……一个根号两个\(\log\)很悬啊……

每次操作的值加上的值不超过\(len\)一看就有阴谋

因为每次加上的值很小,我们分块的时候保证一个块内的最大值和最小值之差不超过某个常数,这样我们就可以做一个前缀和了,之后二分的时候不需要再在块内二分,可以减少一个\(\log\)

还有就是可能要定期重构块,具体细节可以看代码

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
inline int getop(){R char ch;while((ch=getc())>'9'||ch<'0');return ch-'0';}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5,M=405;
struct eg{int v,nx,w;}e[N];int head[N],tot;
inline void add(R int u,R int v,R int w){e[++tot]={v,head[u],w},head[u]=tot;}
int ls[N],rs[N],a[N],rt[N],tag[M<<1],bg[M<<1],ed[M<<1],bot[M<<1],top[M<<1];
int sum[M<<1][M*40],tmp1[M<<1],tmp2[M*80],cnt1,cnt2,cur,als,cnt,n,m,L,mxl,tim;
void build(int id){
int mx=-inf,mn=inf;
fp(i,bg[id],ed[id])cmax(mx,a[i]),cmin(mn,a[i]);
bot[id]=mn,top[id]=mx;
memset(sum[id],0,(mx-mn+1)<<2);
fp(i,bg[id],ed[id])++sum[id][a[i]-mn];
fp(i,1,mx-mn)sum[id][i]+=sum[id][i-1];
}
void build(){
fp(i,1,n)a[i]+=tag[rt[i]];
memset(tag,0,(cnt+1)<<2),memset(bg,0,(cnt+1)<<2);
cnt=1,als=0;
int mx=a[1],mn=a[1],len=0;
fp(i,1,n){
++len,rt[i]=cnt;
if(!bg[cnt])bg[cnt]=i;
ed[cnt]=i;
cmax(mx,a[i+1]),cmin(mn,a[i+1]);
if(mx-mn+1>=L*mxl||len>=L||i==n){
build(cnt),++cnt;
len=0,mn=mx=a[i+1];
}
}
--cnt;
}
void dfs(int u,int len){
ls[u]=++tim,a[tim]=len,cmax(cur,len);
go(u)dfs(v,len+e[i].w);
rs[u]=tim;
}
void update(int l,int r,int id,int k){
fp(i,l,r)a[i]+=k;fp(i,bg[id],ed[id])a[i]+=tag[id];
tag[id]=0;build(id);
}
void update(int l,int r,int k){
cur+=k;
for(R int i=l;i<=r;i=ed[rt[i]]+1){
if(i==bg[rt[i]]&&ed[rt[i]]<=r)tag[rt[i]]+=k;
else update(i,min(ed[rt[i]],r),rt[i],k);
}
}
int calc(int ck,int k){
int res=0;
fp(i,1,cnt1){
if(ck<tag[tmp1[i]]+bot[tmp1[i]])continue;
if(ck>=tag[tmp1[i]]+top[tmp1[i]]){
res+=ed[tmp1[i]]-bg[tmp1[i]]+1;
continue;
}
res+=sum[tmp1[i]][ck-tag[tmp1[i]]-bot[tmp1[i]]];
}
if(res>=k)return true;
fp(i,1,cnt2)res+=(tmp2[i]<=ck);
return res>=k;
}
int query(int k){
int l=0,r=cur,mid,ans=0;
while(l<=r){
mid=(l+r)>>1;
calc(mid,k)?(ans=mid,r=mid-1):l=mid+1;
}
return ans;
}
void query(int l,int r,int t,int k){fp(i,l,r)tmp2[++cnt2]=a[i]+t;}
int query(int l,int r,int k){
cnt1=cnt2=0;
for(R int i=l;i<=r;i=ed[rt[i]]+1){
if(i==bg[rt[i]]&&ed[rt[i]]<=r)tmp1[++cnt1]=rt[i];
else query(i,min(r,ed[rt[i]]),tag[rt[i]],k);
}
return query(k);
}
int main(){
// freopen("testdata.in","r",stdin);
// freopen("testdata.out","w",stdout);
n=read(),m=read(),mxl=read(),L=sqrt(n+0.5);
for(R int i=2,fa,w;i<=n;++i)fa=read(),w=read(),add(fa,i,w);
dfs(1,0),build();
int op,x,y;
while(m--){
op=getop(),x=read(),y=read();
if(op==1)print((rs[x]-ls[x]+1<y)?-1:query(ls[x],rs[x],y));
else{
update(ls[x],rs[x],y),++als;
if(als>=L*3)build();
}
}
return Ot(),0;
}

LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)的更多相关文章

  1. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  2. [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]

    题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...

  3. LOJ#6045. 「雅礼集训 2017 Day8」价(最小割)

    题面 传送门 题解 首先先把所有权值取个相反数来求最大收益,因为最小收益很奇怪 然后建图如下:\(S\to\)药,容量\(\inf+p_i\),药\(\to\)药材,容量\(\inf\),药材\(\t ...

  4. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  5. 【思维题 最大权闭合子图】loj#6045. 「雅礼集训 2017 Day8」价

    又是经典模型的好题目 题目描述 人类智慧之神 zhangzj 最近有点胖,所以要减肥,他买了 NN 种减肥药,发现每种减肥药使用了若干种药材,总共正好有 NN 种不同的药材. 经过他的人脑实验,他发现 ...

  6. LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)

    题面传送门 一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到? 首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部 ...

  7. loj6046 「雅礼集训 2017 Day8」爷

    https://loj.ac/problem/6046 最近遇到几个分块题,我发现我一遇到分块题就死活构造不出来 不对,明明是,遇到数据结构题,就死活构造不出来. 所以我就找了几个分块题做做. 其实分 ...

  8. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  9. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

随机推荐

  1. VMware Workstation 虚拟机的服务启动项

  2. Android开发之通过包管理器获取安装应用信息

    最近在自己写一个APP,有一个模块需要获取手机应用的一些信息.坑还是有,但都基本踩过了,自己把他实现了出来,实现方法还是很需要掌握的.底部弹出的对话框中四个选项的实现不多做说明,主要讲讲如何获取这些安 ...

  3. Python all() 函数

    Python all() 函数  Python 内置函数 描述 all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False. ...

  4. 105. Construct Binary Tree from Preorder and Inorder Traversal (Tree; DFS)

    Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...

  5. 稀疏矩阵乘法 · Sparse Matrix Multiplication

    [抄题]: 给定两个 稀疏矩阵 A 和 B,返回AB的结果.您可以假设A的列数等于B的行数. [暴力解法]: 时间分析: 空间分析: [思维问题]: [一句话思路]: 如果为零则不相乘,优化常数的复杂 ...

  6. 解题报告-603. Consecutive Available Seats

    Several friends at a cinema ticket office would like to reserve consecutive available seats. Can you ...

  7. [mysql]设置Ubuntu上的MySQL可以远程访问

    今天在win10上用django连接安装在Ubuntu上的MySQL上,始终提示错误(can not connect mysql),但是在Ubuntu上访问是没有问题的.于是开始查找原因: 1. 33 ...

  8. PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类

    摘要 分型是计算生物学的一个新兴领域,在临床决策和生物医学科学中有着重要的应用. 虽然机器学习技术在许多生物医学应用中显示出巨大的潜力,但它们在分型中的用途尚未完全理解. 在本文中,我们研究了基于聚类 ...

  9. jquery相对定位(包含find的使用 find相当于后代选择器)$("选择器1","选择器2")

  10. 访问localhost的phpmyadmin出现访问被拒绝

    原因是:没有配置MySQL数据库密码. 1.打开D:\wamp\apps\phpmyadmin x.xx找到config.inc.php. 修改并保存: $cfg['Servers'][$i]['us ...