这个题目就是特别裸啊,很明显就是先树链剖分,然后在线段树每个节点上维护两个堆,来维护插入和删除,查询的时候就暴力查就好了。

似乎很简单啊,我竟然在luogu上1A了,结果交到bzoj上MLE,看过讨论后把找重儿子改成大于等于就A了。。

不过我感觉这样是假的啊,一条链在线段树上有\(\log^2n\)段,每个暴力插的话就是\(O(n\log^3n)\)啊,但是还跑的挺快的,这卡的也太不满了吧。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (y=max(x,y))
using namespace std;typedef long long ll;
const int Maxn=410000;int to[Maxn],nxt[Maxn],first[Maxn],tot=1;
int tl[Maxn],tr[Maxn],u[Maxn],v[Maxn],w[Maxn];
int dep[Maxn],fa[Maxn],ran[Maxn],top[Maxn],son[Maxn];
int n,m,x,y,opt,cnt;
priority_queue<int> t[Maxn][2];struct node{int l,r;
}s[Maxn];inline void add(int u,int v) {to[tot]=v;nxt[tot]=first[u];first[u]=tot++;to[tot]=u;nxt[tot]=first[v];first[v]=tot++;
}int dfs1(int root) {int siz=1,sizm=0;for(int i=first[root];i;i=nxt[i])if(!dep[to[i]]) {dep[to[i]]=dep[root]+1;fa[to[i]]=root;int temp=dfs1(to[i]);siz+=temp;if(temp>=sizm) {sizm=temp;son[root]=to[i];}}return siz;
}void dfs2(int root,int topp) {top[root]=topp;ran[root]=++cnt;if(son[root]) dfs2(son[root],topp);for(int i=first[root];i;i=nxt[i])if(!ran[to[i]]) dfs2(to[i],to[i]);
}void build(int root,int l,int r) {tl[root]=l,tr[root]=r;int mid=l+r>>1;if(l==r) return;build(root<<1,l,mid);build((root<<1)|1,mid+1,r);
}int gettop(int root) {while(!t[root][1].empty()&&t[root][0].top()==t[root][1].top()) t[root][1].pop(),t[root][0].pop();return t[root][0].empty()?-1:t[root][0].top();
}int query(int root,int x) {int l=tl[root],r=tr[root];int mid=l+r>>1;int ans=gettop(root);if(l==r) return ans;if(x<=mid) return max(ans,query(root<<1,x));else return max(ans,query((root<<1)|1,x));
}void add(int root,int l,int r,int opt,int x) {int lc=tl[root],rc=tr[root];int mid=lc+rc>>1;if(l<=lc&&r>=rc) {t[root][opt].push(x);return ;}if(l<=mid) add(root<<1,l,r,opt,x);if(r>mid) add((root<<1)|1,l,r,opt,x);
}int cmp(node a,node b) {return a.l<b.l;
}void change(int x,int y,int w,int opt) {int topp=0;while(top[x]!=top[y]) {if(dep[top[x]]<dep[top[y]]) swap(x,y);s[++topp]=(node){ran[top[x]],ran[x]};x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);s[++topp]=(node){ran[x],ran[y]};sort(s+1,s+topp+1,cmp);int zhy=0;for(int i=1;i<=topp;zhy=s[i++].r)if(zhy+1<s[i].l) add(1,zhy+1,s[i].l-1,opt,w);if(zhy<n) add(1,zhy+1,n,opt,w);
}int main() {
//  freopen("test.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<n;i++) {scanf("%d%d",&x,&y);add(x,y);}dep[1]=1;dfs1(1),dfs2(1,1);build(1,1,n);for(int i=1;i<=m;i++) {scanf("%d",&opt);if(opt==2) {scanf("%d",&x);printf("%d\n",query(1,ran[x]));}else if(opt==1) {scanf("%d",&x);change(u[x],v[x],w[x],opt);}else {scanf("%d%d%d",&u[i],&v[i],&w[i]);change(u[i],v[i],w[i],opt);}}return 0;
}

转载于:https://www.cnblogs.com/shanxieng/p/10155379.html

BZOJ 4538: [Hnoi2016]网络相关推荐

  1. 4538: [Hnoi2016]网络

    4538: [Hnoi2016]网络 链接 分析: 整体二分. 对于一次操作,可以二分一个答案mid,判断权值大于mid的路径是否全部经过这个点.如果是 ,那么这次询问的答案在[l,mid-1]之间, ...

  2. P3250 [HNOI2016]网络(整体二分)

    P3250 [HNOI2016]网络 给定一棵树,有三种操作: 给定u,v,wu, v, wu,v,w,表示u,vu, vu,v路径上有一个重要度为www的请求, 给定ttt,第ttt个发生的请求结束 ...

  3. P3250 [HNOI2016]网络(利用堆建线段树 + 树剖)

    P3250 [HNOI2016]网络 做法有点神奇!!!利用堆作为节点建立一颗线段树,用堆维护线段树上点的信息. 说说查询操作,我们的目的是要查询,没有经过这个点的事件最大值,考虑如何维护. 我们定义 ...

  4. [HNOI2016]网络(树链剖分+线段树+大根堆)

    [HNOI2016]网络 problem solution 另辟蹊径,不把交互请求赋在新增路径上,反而把交互请求赋在树上除去该请求路径覆盖点的其它点上 显然,路径问题树剖是非常可以的. 那么一个点上的 ...

  5. [HNOI2016]网络 树链剖分,堆

    [HNOI2016]网络 LG传送门 表示乱搞比正解难想. 整体二分很好想吧. 但是为了好写快乐,我们选择三个\(\log\)的乱搞. 先树剖,线段树套堆维护区间最大值.对于一次修改,如果是插入,就把 ...

  6. [BZOJ 3931][CQOI2015]网络吞吐量(SPFA+网络流)

    Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择 ...

  7. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  8. BZOJ 3931 CQOI2015 网络吞吐量 Dijkstra+网络流

    题目大意见http://pan.baidu.com/s/1o6zajc2 用Dijkstra跑出最短路图,然后拆点跑网络流即可 这水题我TM还WA了两次是不是省选要滚粗了 #include <c ...

  9. linux下sqlserver端口号,登陆sqlserver及修改端口号 (转)

    在一台计算机上面同时安装两个sql server数据库实例,第一次安装默认为机器名,端口号为1433 1.如果不知道服务器名,却想登陆的话可以直接输入127.0.0.1登陆之后,在新建查询中输入:SE ...

最新文章

  1. 2008 R2 辅域安装和卸载(加域、退域及组策略的测试)
  2. viewflipper动画切换屏幕
  3. BeautifulSoup_第二节
  4. nginx反代理服务器
  5. 亲情奉献一些搜集的网站
  6. CentOS中使用Docker来部署Tomcat
  7. Understanding Clouds from Satellite Images的kernel调研+肉眼识别每种云朵示例
  8. Redis与Memcache的区别
  9. 喵哈哈村小学上课啦(欧拉函数)
  10. helperdialect mysql_Mybatis使用pageHelper步骤(动态分页)
  11. 【精品软件】AE这套神级扩展终于支持2021了,AE脚本-Motion Factory 完整五套解锁版
  12. 代码设置环境变量QProcess类
  13. 使用 Visio 绘制卷积示意图
  14. css文字背景蒙版_使用CSS创建蒙版的背景效果
  15. 【嵌入式系统】STM32时钟系统+时钟配置函数解析
  16. 思科packet tracer 配置两个不同网段的pc通过两个路由器连接
  17. 模拟IIC——关于模拟IIC的IO口的配置选取推挽输出还是开漏输出,以及是否需要更改IO口输入输出模式和是否需要对IO配置上拉
  18. react中使用lazy函数进行路由懒加载
  19. 分析Perm()函数功能、代码、时间复杂度
  20. JAVA中的deflate压缩实现

热门文章

  1. Python 之 sorted()排序详解 适用于任意可迭代对象比如列表,字典等
  2. Python之基本数据类型set常用基本方法简述
  3. 写一个Windows上的守护进程(4)日志其余
  4. sqlite connect 在eclipse 我ctrl的时候报错
  5. JAVA视频系列,学习JAVA常遇到的问题,连载【方法篇】。
  6. java开发环境以及数据类型
  7. jmeter脚本增强
  8. 计算机显微视觉相关概念,机器视觉的概念及常见应用
  9. 极光推送 java 绑定别名_极光推送-别名篇
  10. 【C语言】指针进阶 - 指针数组 数组指针 数组指针传参 函数指针 指向函数指针数组的指针