P3242 [HNOI2015] 接水果(整体二分、扫描线、dfs序)

解析

一道有点毒瘤的题
也是一道感觉真的可以出现在考场上的很综合的题
做的还可以
除了一开始把盘子和水果看反白写了各树套树之外
为什么盘子是水果的子路径啊

由于是做专题爬过来的多次询问区间第k小,想到整体二分
那么重点就是子路径的判定问题
发现,对于一个盘子 (u,v)(u,v)(u,v)
分两种情况:

  1. 一般路径,那么可以被接到的水果 (x,y)(x,y)(x,y) 的x和y必须分别在u和v的子树中,换句话说就是 dfnu≤dfnx≤dfnu+sizu−1&dfnv≤dfny≤dfnv+sizv−1dfn_u\le dfn_x\le dfn_u+siz_u-1 \& dfn_v\le dfn_y\le dfn_v+siz_v-1dfnudfnxdfnu+sizu1&dfnvdfnydfnv+sizv1(对称同理)
  2. 返祖链,假设u是祖先,son是 (u,v)(u,v)(u,v) 上u下方的第一个儿子,此时接到的水果 (x,y)(x,y)(x,y) 必须满足x在son的子树外,y在v的子树内,也就是 (dfnu≤dfnx<dfnson∣∣dfnu>dfnson+sizson−1)&dfnv≤dfny≤dfnv+sizv−1(dfn_u\le dfn_x< dfn_{son}||dfn_u>dfn_{son}+siz_{son}-1) \& dfn_v\le dfn_y\le dfn_v+siz_v-1(dfnudfnx<dfnsondfnu>dfnson+sizson1)&dfnvdfnydfnv+sizv1

那么我们把路径 (u,v)(u,v)(u,v) 抽象成二维平面上的一个点 (dfnu,dfnv)(dfn_u,dfn_v)(dfnu,dfnv) ,问题就变成了矩形加单点求和问题
由于本题是静态的,所以可以直接扫描线一个log解决
加上整体二分的log,总复杂度 O(nlog⁡2n)O(n\log^2n)O(nlog2n)
注意数组不要开小!!

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=4e5+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
int n,m,Q;struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}
int pl[N][19],pos[N],siz[N],tim;
void dfs(int x,int f){pl[x][0]=f;for(int k=1;pl[x][k-1];k++) pl[x][k]=pl[pl[x][k-1]][k-1];pos[x]=++tim;siz[x]=1;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs(to,x);siz[x]+=siz[to];}return;
}
inline int Lca(int x,int y,int op){if(pos[x]<=pos[y]&&pos[y]<=pos[x]+siz[x]-1){assert(op);return x;}for(int k=16;k>=0;k--){int o=pl[x][k];if(!o||(pos[o]<=pos[y]&&pos[y]<=pos[o]+siz[o]-1)) continue;x=o;}return op?pl[x][0]:x;
}struct ope{int op;int x,y,k,id;//op=2int h,l,r,w,f;//op=1
}q[N],q1[N],q2[N];
bool cmp1(ope a,ope b){return a.h<b.h;}
bool cmp2(ope a,ope b){return a.x<b.x;}
int w[N],f[N],tot;
inline void add(int p,int w){for(;p<=n;p+=p&-p) f[p]+=w;return;
}
inline int ask(int p){int res(0);for(;p;p-=p&-p) res+=f[p];return res;
}
int ans[N];
void print(ope o){if(o.op==1){printf("  change: h=%d (%d %d) w=%d op=%d\n",o.h,o.l,o.r,o.w,o.f);}else{printf("  ask: x=%d y=%d k=%d id=%d\n",o.x,o.y,o.k,o.id);}
}
void solve(int L,int R,int ql,int qr){//printf("solve: (%d %d) (%d %d)\n",L,R,ql,qr);if(ql>qr) return;if(L==R){for(int i=ql;i<=qr;i++){if(q[i].op==2) ans[q[i].id]=L;}return;}int mid=(L+R)>>1;int l=ql,r=ql;while(q[r].op==1&&r<=qr) ++r;while(r<=qr){while(l<=qr&&q[l].op==1&&q[l].h<=q[r].x){if(q[l].w<=mid){add(q[l].l,q[l].f);add(q[l].r+1,-q[l].f);	//printf("  add:l=%d (%d %d) f=%d\n",l,q[l].l,q[l].r,q[l].f);}++l;}w[q[r].id]+=ask(q[r].y);++r;}int pl=ql,n1(0),n2(0);for(;pl<=qr&&q[pl].op==1;++pl){if(q[pl].w<=mid){q1[++n1]=q[pl];if(pl<l){add(q[pl].l,-q[pl].f);add(q[pl].r+1,q[pl].f);	//printf("  del:pl=%d (%d %d) f=%d\n",pl,q[pl].l,q[pl].r,q[pl].f);}}else q2[++n2]=q[pl];}for(;pl<=qr;pl++){int c=w[q[pl].id];if(c>=q[pl].k) q1[++n1]=q[pl];else{q[pl].k-=c;q2[++n2]=q[pl];}}for(int i=ql;i<=qr;i++){if(q[i].op==2) w[q[i].id]=0;}for(int i=1;i<=n1;i++) q[ql+i-1]=q1[i];for(int i=1;i<=n2;i++) q[ql+n1+i-1]=q2[i];solve(L,mid,ql,ql+n1-1);solve(mid+1,R,ql+n1,qr);return;
}
signed main(){
#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endif//printf("%d\n",(int)sizeof(tr)/1024/1024);memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();Q=read();for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}dfs(1,0);for(int i=1;i<=m;i++){int x=read(),y=read(),w=read(),lca=Lca(x,y,1);//printf("i=%d (%d %d)\n",i,x,y);if(lca!=x) swap(x,y);if(lca==x){int tp=Lca(y,x,0);q[++tot]=(ope){1,0,0,0,0,pos[y],1,pos[tp]-1,w,1};//print(q[tot]);q[++tot]=(ope){1,0,0,0,0,pos[y],pos[tp]+siz[tp],n,w,1};//print(q[tot]);q[++tot]=(ope){1,0,0,0,0,pos[y]+siz[y],1,pos[tp]-1,w,-1};//print(q[tot]);q[++tot]=(ope){1,0,0,0,0,pos[y]+siz[y],pos[tp]+siz[tp],n,w,-1};//print(q[tot]);}		else{q[++tot]=(ope){1,0,0,0,0,pos[y],pos[x],pos[x]+siz[x]-1,w,1};//print(q[tot]);q[++tot]=(ope){1,0,0,0,0,pos[y]+siz[y],pos[x],pos[x]+siz[x]-1,w,-1};//print(q[tot]);}}int pp=tot;for(int i=1;i<=Q;i++){int x=read(),y=read(),k=read();q[++tot]=(ope){2,pos[x],pos[y],k,i,0,0,0,0,0};q[++tot]=(ope){2,pos[y],pos[x],k,i,0,0,0,0,0};}sort(q+1,q+pp+1,cmp1);sort(q+pp+1,q+1+tot,cmp2);solve(0,1e9,1,tot);for(int i=1;i<=Q;i++) printf("%d\n",ans[i]);return 0;
}
/*
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UOJ#748-[UNR #6]机器人表演【dp】

正题 题目链接:https://uoj.ac/problem/748 题目大意 有一个长度为nnn的010101序列&#xff0c;然后ttt次插入一个000和一个111&#xff0c;要求000在111前面&#xff0c;求最终能得到多少种本质不同的串。 1≤n,t≤3001\leq n,t\leq 3001≤n,t≤300 解题思路 我们考虑一个n…

夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation

文章目录做题情况项目报告Uncle Bogdan and Country HappinessGraph ColoringHow Many Paths?Array Differentiation做题情况项目报告 T1,T3T1,T3T1,T3一眼题&#xff0c;在实现上&#xff0c;T3T3T3耗时略长&#xff08;有些情况未考虑到位&#xff09; T4T4T4感觉题&#xf…

Codeforces Round #716 (Div. 2)

Codeforces Round #716 (Div. 2) CodeForces 1514 题号题目知识点难度APerfectly Imperfect ArrayBAND 0, Sum BigCProduct 1 Modulo NDCut and StickEBaby Ehab’s Hyper Apartment

用StyleCop规范团队代码

前言编码风格&#xff0c;每个人都是有不同的特点&#xff0c;风格各异&#xff0c;而且一个人在不同的时期&#xff0c;编码风格的差异也可能是非常大的&#xff0c;好比学生时代&#xff0c;刚工作的时候&#xff0c;工作一段时间后等。在一个团队中&#xff0c;或一个项目中…

CodeForces:103(div1)104(div2)

文章目录前言CF104A BlackjackDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF103A Testing Pants for SadnessDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF103B CthulhuDe…

UOJ#749-[UNR #6]稳健型选手【贪心,分治,主席树】

正题 题目链接:https://uoj.ac/problem/749 题目大意 如果有序列aaa&#xff0c;你每次取走一个数字后然后这个序列最前面的数字会被别人取走&#xff0c;直到序列为空。此时f(a)f(a)f(a)表示你最大能取走的权值和。 给出一个长度为nnn的序列aaa&#xff0c;qqq次询问区间[l…

A. And Then There Were K

A. And Then There Were K 题意&#xff1a; 给你一个n&#xff0c;让你求一个k&#xff0c;使得满足下列式子&#xff1a; n & (n-1) & (n-2) &…&(k) 0 问k最小是多少&#xff1f; 题解&#xff1a; 找规律 比如n的二进制为&#xff1a;1111 那么n-1就是…

一键发布部署vs插件[AntDeploy],让net开发者更幸福

一键发布工具(ant deploy tool)插件下载地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamenainaigu.AntDeploy1.iis一键发布自动部署 (iis deploy support)支持netcore 和 netframework发布 (支持mvc webapi)支持website自动创建ps:需要在windows 服务器上…

数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

普通的下标线段树Count ColorHotelTransformationTree Generator™Count Color POJ2777 查询区间内颜色种类数&#xff0c;观察到颜色种类数只有30&#xff0c;完全可以状压成整型存储&#xff0c;没有必要开30棵线段树 区间内有这颜色就置为111&#xff0c;没有这个颜色就是…

计算几何全家桶

文章目录前言精度点/向量相关表示向量基本运算角度相关向量夹角旋转直线/线段相关表示点与线求点到直线垂足求点关于直线的对称点点与直线的位置关系点与直线的距离线与线直线与直线的位置关系共线与垂直判断线段与线段是否相交求直线与直线的交点角平分线中垂线多边形表示求多…

uoj#750-[UNR #6]小火车【二分,折半,鸽笼原理】

正题 题目链接:https://uoj.ac/problem/750 题目大意 给出nnn个数字和一个ppp&#xff0c;保证2n>p2^n> p2n>p。现在要求一个序列www满足wi∈[−1,1]w_i\in[-1,1]wi​∈[−1,1]&#xff0c;使得∑i1nwiai≡0(modp)\sum_{i1}^nw_ia_i\equiv 0\pmod p∑i1n​wi​ai​≡…

Sequence Pair Weight

Sequence Pair Weight 题意&#xff1a; 一个数组a&#xff0c;其中两个一样的数的贡献为1&#xff0c;问这个数组的所有子串的贡献和是多少? 题解&#xff1a; 举例&#xff1a; 对于[1&#xff0c;2&#xff0c;1&#xff0c;2&#xff0c;1&#xff0c;1&#xff0c;4]…

什么是量子计算机?用一个简单例子来解释

译者&#xff1a;王亮 作者&#xff1a;YK Sugi 原文&#xff1a;http://t.cn/EZAElk0Hi&#xff0c;大家好&#xff01;不久前&#xff0c;我参观了加拿大温哥华的D-Wave Systems公司&#xff0c;这是一家制造前沿量子计算机的公司。我在那里学到了很多关于量子计算机的知识&a…

CodeForces616:Educational Round 5

文章目录前言A Comparing Two Long Integers\text{A Comparing Two Long Integers}A Comparing Two Long IntegersDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeB Dinner with Emma\text{B Dinner with Emma}B Dinner with Emm…

CF1534F2-Falling Sand (Hard Version)

正题 题目链接:https://www.luogu.com.cn/problem/CF1534F2 题目大意 有一个n∗mn*mn∗m个网格&#xff0c;有的网格上有沙子&#xff0c;一个沙子被刷新后会下落到底并且刷新沿途中四周四连通的沙子&#xff0c;你可以选择一些沙子手动刷新。 现在要求第iii列至少有aia_iai…

数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

值域线段树势能线段树扫描线KiKis K-NumberballThe Child and Sequence「雅礼集训 2017 Day1」市场AtlantisKiKi’s K-Number HDU-2852 权值线段树维护插入删除很简单 对于查询大于xxx的第kkk个&#xff0c;可以不用二分&#xff0c;转化一下 先查小于等于xxx的个数cntcntc…

Codeforces Round #721 (Div. 2)

Codeforces Round #721 (Div. 2) 题号题目难度知识点AAnd Then There Were KBPalindrome Game (easy version)CPalindrome Game (hard version)DSequence Pair WeightEMEX TreeFPartition Game

解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

点击上方蓝字关注“汪宇杰博客”最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线&#xff0c;自动部署到Azure App Service以后&#xff0c;.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。查找问题首先&#xff0c;幸好&#xff0c;这是个staging环…

CF1286E-Fedya the Potter Strikes Back【KMP,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/CF1286E 题目大意 定义一个字符串sss的权值为对于每个sL∼Rs1∼R−L1s_{L\sim R}s_{1\sim R-L1}sL∼R​s1∼R−L1​的区间&#xff0c;会产生min⁡iLRwi\min_{iL}^Rw_iminiLR​wi​的贡献。 现在开始时sss为空串&#xff0c…

模板:二维凸包(计算几何)

所谓凸包&#xff0c;就是一个凸出来的包 &#xff08;逃&#xff09; 前言 计算集合的第一课。 关键特征&#xff1a;周长最小。此时一定是凸包。 解析 定义 凸包&#xff1a;在平面上能包含所有给定点的最小凸多边形叫做凸包。 性质&#xff1a;凸包的周长是所有能包含给…