题面

传送门

题解

转化为\(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. DataTable记录

    DataTable dt2 = dt.Copy();//复制结构和数据 //复制结构,不要数据 DataTable dt2 = new DataTable(); for (int i = 0; i & ...

  2. vbs执行系统命令

    首先说明一下,我的所有代码都是vbscript,jscript我没有研究过,不过我想也差不多. 关于最基础的语法比如变量的申明,分支,循环,函数的调用,等等这些我就不讲了,不懂得自己看一下. 1.我们 ...

  3. KMP算法,查询匹配串的个数

    想不到时隔两年回来重新学习KMP算法还是那么难,不过理解了大概,把例程贴上来,如果是求数量只需要加个count变量记录即可. #include"stdio.h" #include& ...

  4. Oracle GoldenGate 一、介绍和安装

    1 说明 1.1 下载和文档说明 下载地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html 我 ...

  5. Jenkins 邮箱配置及问题解决

    Failed to send out e-mail javax.mail.MessagingException: Could not connect to SMTP host: smtp.rytong ...

  6. 是什么优化让 .NET Core 性能飙升?(转)

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~ .NET Core(开放源代码,跨平台,x-copy可部署等)有许多令人兴奋的方面,其中最值得称赞的就是其性能了. 感谢所有社区 ...

  7. pyhon 去除列表中重复元素

    Python set() 函数 描述 set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法 set 语法: class set([iterabl ...

  8. jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

  9. .NET基础 (21)ASP NET应用开发

    ASP.NET中的WebForm相关的内容其实有点儿过时了,但在很多的老项目中还是WebForm的,这些都是遗留问题,新上的项目基本上都用MVC了,在微软最新的 ASP.NET 的版本中已经默认使用M ...

  10. C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作

    文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了 ...