【HNOI2015】接水果【整体二分】【DFS序】【双区间转矩形】【扫描线】【树状数组】

传送门

题意:给定一个nnn个点的树,定义一个“盘子”为一个给定权值的路径,一个“水果”为一条路径,一个盘子可以接到水果当且仅当盘子的路径是水果的子路径。给出所有盘子和水果,对于每个水果求可以接它的盘子中第kik_iki小的权值。

n≤4×105n\leq 4\times10^5n4×105

显然这种奇奇怪怪的第kkk小考虑整体二分

给盘子按权值排序,对于一个盘子和水果的区间,要计算出每个水果可以被区间内多少个盘子接住。

根据惯用套路,把一条路径抽象成按 DFS 为坐标的点,一个盘子可以接的是一个或两个矩形中的水果。

无脑扫描线即可。因为是区间修改单点查询,可以差分后树状数组。

复杂度O(能过)O(能过)O()

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#define MAXN 100005
#define MAXM 200005 
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
struct edge{int u,v;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt;
void addnode(int u,int v)
{e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt;
}
int dfn[MAXN],ed[MAXN],dep[MAXN],fa[MAXN][16],tim;
void dfs(int u)
{for (int i=1;i<16;i++) fa[u][i]=fa[fa[u][i-1]][i-1];dfn[u]=++tim;for (int i=head[u];i;i=nxt[i])if (!dfn[e[i].v])dep[e[i].v]=dep[u]+1,fa[e[i].v][0]=u,dfs(e[i].v);ed[u]=tim;
}
int n,p,q;
int ans[MAXN];
struct Pan{int a,b,c;}pan[MAXN];
struct fruit{int u,v,k,id;}fru[MAXN],L[MAXN],R[MAXN];
inline bool operator <(const Pan& x,const Pan& y){return x.c<y.c;}
struct node{int type,x,l,r,id;}lis[MAXM];
//trangle: +-1,x,yl,yr
//point: 0,x,y,k
inline bool operator <(const node& a,const node& b)
{if (a.x==b.x) return (unsigned)a.type>(unsigned)b.type;return a.x<b.x;
}
struct BIT
{int s[MAXN];inline int lowbit(const int& x){return x&-x;}inline void modify(int x,int v){for (;x<=n;s[x]+=v,x+=lowbit(x));}inline int query(int x,int ans=0){for (;x;ans+=s[x],x-=lowbit(x));return ans;}
}bit;
void solve(int l,int r,int vl,int vr)
{if (l>r||vl>vr) return;if (vl==vr){for (int i=l;i<=r;i++) ans[fru[i].id]=pan[vl].c;return;}int vmid=(vl+vr)>>1;int tot=0;for (int i=vl;i<=vmid;i++){int u=pan[i].a,v=pan[i].b;if (dfn[v]<=ed[u]){int t=dep[v]-dep[u]-1;u=v;for (int i=0;(1<<i)<=t;i++)	if (t&(1<<i)) u=fa[u][i];lis[++tot]=(node){1,1,dfn[v],ed[v],0};lis[++tot]=(node){-1,dfn[u],dfn[v],ed[v],0};lis[++tot]=(node){1,dfn[v],ed[u]+1,n,0};lis[++tot]=(node){-1,ed[v]+1,ed[u]+1,n,0};}else{lis[++tot]=(node){1,dfn[u],dfn[v],ed[v],0};lis[++tot]=(node){-1,ed[u]+1,dfn[v],ed[v],0};}}for (int i=l;i<=r;i++) lis[++tot]=(node){0,dfn[fru[i].u],dfn[fru[i].v],fru[i].k,i};sort(lis+1,lis+tot+1);int lcnt=0,rcnt=0;for (int i=1;i<=tot;i++){if (lis[i].type) bit.modify(lis[i].l,lis[i].type),bit.modify(lis[i].r+1,-lis[i].type);else{int k=bit.query(lis[i].l);if (lis[i].r<=k) L[++lcnt]=fru[lis[i].id];else fru[lis[i].id].k-=k,R[++rcnt]=fru[lis[i].id];}}for (int i=l;i<=l+lcnt-1;i++) fru[i]=L[i-l+1];for (int i=l+lcnt;i<=r;i++) fru[i]=R[i-l-lcnt+1];solve(l,l+lcnt-1,vl,vmid);solve(l+lcnt,r,vmid+1,vr);
}
int main()
{n=read(),p=read(),q=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();addnode(u,v),addnode(v,u);}dep[1]=1,dfs(1);for (int i=1;i<=p;i++) {pan[i].a=read(),pan[i].b=read(),pan[i].c=read();if (dfn[pan[i].a]>dfn[pan[i].b]) swap(pan[i].a,pan[i].b);}sort(pan+1,pan+p+1);for (int i=1;i<=q;i++){fru[i].u=read(),fru[i].v=read(),fru[i].k=read(),fru[i].id=i;if (dfn[fru[i].u]>dfn[fru[i].v]) swap(fru[i].u,fru[i].v);}solve(1,q,1,p);for (int i=1;i<=q;i++) printf("%d\n",ans[i]);return 0;
}

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

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

相关文章

程序员修神之路--做好分库分表其实很难之一

点击上方“蓝字”带你去看小星星菜哥&#xff0c;领导让我开发新系统了这么说领导对你还是挺信任的呀~必须的&#xff0c;为了设计好这个新系统&#xff0c;数据库设计我花了好多心思呢做一个系统我觉得不应该从数据库入手&#xff0c;应该从设计业务模型开始&#xff0c;先不说…

【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】

题意&#xff1a;给定nnn和ddd&#xff0c;构造或判断无法构造一棵二叉树使得所有点的深度&#xff08;定义为到根距离&#xff09;之和为ddd。 n,d≤5000n,d\leq 5000n,d≤5000 显然可以算出有解的ddd的下界和上界&#xff0c;分别是完全二叉树和链的情况。下面会证明在这个范…

Office 365开发者的前端必备课程

这篇文章其实不仅仅是写给Office 365开发者的&#xff0c;但对于广大的Office 365开发者来说确实相当重要的。这里提到的Office 365开发者&#xff0c;包括了Office Add-ins&#xff0c;SharePoint Add-ins&#xff0c;Microsoft Graph&#xff0c;Microsoft Teams的开发者。我…

【CF1338C】Perfect Triples【位运算】【构造】

传送门 题意&#xff1a;有一序列SSS由下列方式生成&#xff1a; 找到字典序最小的正整数(a,b,c)(a,b,c)(a,b,c)&#xff0c;满足a,b,ca,b,ca,b,c不在SSS中且a⊕b⊕c0a\oplus b\oplus c0a⊕b⊕c0,其中⊕\oplus⊕为异或将a,b,ca,b,ca,b,c加入SSS重复第一步 TTT组数据&#xff…

.NET开发框架(五)-IIS上部署ASP.NET Core项目教程

在之前教程中&#xff0c;我们分享了框架的功能与视频演示介绍(文尾底部提供往期教程快捷链接)系列教程&#xff1a;从初学者到架构师的一步步蜕变本篇经验将和大家介绍如何在IIS上部署ASP.NET Core项目&#xff0c;希望对初学.NET CORE的童靴入门有所帮助&#xff01;1、打开V…

P4146 序列终结者 平衡树 + lazy维护

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 平衡树裸题&#xff0c;直接维护俩lazylazylazy就行了。 需要注意的是&#xff0c;只有儿子节点存在的时候才能更新&#xff0c;不然更新到000号节点之后&#xff0c;给000号点加上了奇怪的…

.NET开发框架(四)-服务器IIS实践教程

前三篇教程中&#xff0c;我们分享了框架的功能与视频演示介绍(文尾底部提供往期教程快捷链接)&#xff0c;今天开始我们进入实践教程&#xff0c;从0开始教学&#xff0c;让你从新手到架构师之兑变&#xff0c;目前已经重置了一台服务器&#xff0c;从安装与配置各组件开始学习…

【十二省联考2019】异或粽子【01Trie】【堆】【前k大套路】

题意&#xff1a;给定长度为nnn的序列aaa&#xff0c;求前kkk大的区间异或和之和。 n≤5105,k≤min⁡(n(n−1)2,2105),ai<232n\leq 5\times 10^5,k\leq \min(\frac{n(n-1)}2,2\times10^5),a_i<2^{32}n≤5105,k≤min(2n(n−1)​,2105),ai​<232 原来省选题这么裸&…

.NET Core IdentityServer4实战 第六章-Consent授权页

在identityServer4中登陆页面只要是成功了&#xff0c;就会注册一个Cookie在服务器资源上&#xff0c;像现在大部分的网站第三方授权&#xff0c;都是经过一个页面&#xff0c;然后选需要的功能&#xff0c;IdentityServer4也给我们提供了&#xff0c;只要你登陆成功,就会跳转到…

Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的串&#xff0c;包含a,b,c,?a,b,c,?a,b,c,?四种字符&#xff0c;其中???可以变成为a,b,ca,b,ca,b,c的任意一种&#xff0c;让你求abcabcabc子序列出现的次数。 思路&#xff1a; …

【十二省联考】春节十二响【贪心】【堆】【启发式合并】

传送门 题意&#xff1a;给一棵nnn个点带点权的树&#xff0c;要求把点分成若干部分&#xff0c;有祖孙关系的点不能在同一部分。求每个部分最大值 的和 的最小值。 n≤2105n \leq 2\times 10^5n≤2105 由链的部分得到启发&#xff0c;每个点用一个堆来维护&#xff0c;合并两…

GitHub的CI实践(xUnit / OpenCover /Appveyor / Coveralls.net)

最近利用业余时间实现.ner core 版本的 casbin &#xff0c;即 Casbin.NET。之前的CI都使用的是公司搭建的jenkins和gitlab-runner&#xff0c;对开源社区的工具链并不是很熟悉&#xff0c;在casbin的原作者(hsluoyz )的“要求”下&#xff0c;只能被迫在项目的README.md加入下…

P4847 银河英雄传说V2 非旋treap

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 让我们分析一下题目需要实现什么操作&#xff1a; (1)(1)(1)将某个序列放到某个的后面&#xff0c;也就是合并两个序列。 (2)(2)(2)将一个序列从某处断开。 (3)(3)(3)查询某个序列的一段和…

【NOI online 2】游戏【二项式反演】【树上背包】

题意&#xff1a;一棵n2mn2mn2m个点的树&#xff0c;mmm个白点和mmm个黑点。对于k∈[0,n]k\in [0,n]k∈[0,n]&#xff0c;求出 把点黑白两两配对使得恰好有kkk对点有祖孙关系 的方案数 模998244353998244353998244353。 n≤5000n \leq 5000n≤5000 见到恰好考虑容斥&#xff0…

小白开学Asp.Net Core 《五》

小白开学Asp.Net Core《五》—— 使用.Net Core MVC Filter一、简介今天在项目&#xff08;https://github.com/AjuPrince/Aju.Carefree&#xff09;做登陆权限时&#xff0c;用到了Filter&#xff0c;现将Filer的使用做以下记录。二、Filter 简介Filter俗称过滤器&#xff0c;…

P5217 贫穷 平衡树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 本来是不想写数据结构了&#xff0c;因为明天打蓝桥了&#xff0c;想放松一下&#xff0c;但是看到这个题感觉写起来挺简单的&#xff0c;就试了试&#xff0c;结果… 首先看一下他的操作…

高性能微服务网关.NETCore客户端Kong.Net开源发布

前言项目地址&#xff1a;https://github.com/lianggx/Kong.Net你的支持使我们更加强大&#xff0c;请单击 star 让更多的 .NETCore 认识它。拥抱开源的脚步&#xff0c;我们从来都是一直在路上&#xff1b;.NETCore作为后起之秀&#xff0c;带给我们太多的惊喜和感动&#xff…

【CF923E】Perpetual Subtraction【生成函数】【积分推式子】【NTT卷积】

题意&#xff1a;有一个整数x∈[0,n]x\in[0,n]x∈[0,n]&#xff0c;取iii的概率为pip_ipi​。执行mmm次操作&#xff0c;每次把xxx等概率变成[0,x][0,x][0,x]中的一个整数&#xff0c;求操作完后等于每个数的概率。模998244353998244353998244353。 n≤105,m≤1018n\leq 10^5,m…

使用Jenkins部署.Net Core遇到的几个坑

一、相关环境和版本搞过CI/CD的同学一定吃过不少苦头&#xff0c;或者说遇到不少坑&#xff0c;但是对自动化的执着住挡不了前进的步伐&#xff0c;如果你缺少了运维这一块知识&#xff0c;那么你的流水线总是不那么完美&#xff0c;本文记录的是自己躺过的坑&#xff0c;希望对…

Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个灯&#xff0c;每次可以打开一个灯&#xff0c;当连续的kkk个灯有至少两个灯开着的时候停止&#xff0c;问最终期望能打开多少灯。 思路&#xff1a; 由于不想打latexlatexlatex&#xff0c;所以…