好像复杂度来说不是正解……不加谜之优化(下叙)能被loj上的加强数据卡

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int n, m, hea[100005], cnt, uu[200005], fa[100005], siz[100005], son[100005], idx;
int dfn[100005], top[100005], opt, vv[200005], ww[200005], dep[100005], xx, ans;
struct Edge{
int too, nxt;
}edge[200005], lian[100005];
struct SGTNode{
vector<int> vec1, vec2;
void insert(int x){
vec1.push_back(x);
push_heap(vec1.begin(), vec1.end());
}
void shanchu(int x){
vec2.push_back(x);
push_heap(vec2.begin(), vec2.end());
}
int getTop(){
while(true){
if(!vec1.size()) return -1;
if(!vec2.size()) return vec1[0];
if(vec1[0]==vec2[0]){
pop_heap(vec1.begin(), vec1.end());
vec1.pop_back();
pop_heap(vec2.begin(), vec2.end());
vec2.pop_back();
}
else return vec1[0];
}
}
};
struct SGT{
SGTNode nd[400005];
void update(int o, int l, int r, int x, int y, int w){
if(l>=x && r<=y){
if(opt==0) nd[o].insert(w);
else nd[o].shanchu(w);
}
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(x<=mid) update(lson, l, mid, x, y, w);
if(mid<y) update(rson, mid+1, r, x, y, w);
}
}
void query(int o, int l, int r, int x){
ans = max(ans, nd[o].getTop());
if(l==r) ;
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(x<=mid) query(lson, l, mid, x);
else query(rson, mid+1, r, x);
}
}
}sgt;
bool cmp(const Edge &u, const Edge &v){
return u.too<v.too;
}
void add_edge(int fro, int too){
edge[++cnt].nxt = hea[fro];
edge[cnt].too = too;
hea[fro] = cnt;
}
void dfs1(int x, int f){
fa[x] = f;
dep[x] = dep[f] + 1;
siz[x] = 1;
int maxSon=-1;
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(t!=f){
dfs1(t, x);
siz[x] += siz[t];
if(siz[t]>=maxSon){//就是这里,要写\geq……
maxSon = siz[t];
son[x] = t;
}
}
}
}
void dfs2(int x, int topf){
dfn[x] = ++idx;
top[x] = topf;
if(!son[x]) return ;
dfs2(son[x], topf);
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(t!=fa[x] && t!=son[x])
dfs2(t, t);
}
}
void rangeUpdate(int u, int v, int w){
int faq=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u, v);
lian[++faq] = (Edge){dfn[top[u]], dfn[u]};
u = fa[top[u]];
}
if(dep[u]>dep[v]) swap(u, v);
lian[++faq] = (Edge){dfn[u], dfn[v]};
sort(lian+1, lian+1+faq, cmp);
int lst=0;
for(int i=1; i<=faq; i++){
if(lst+1<=lian[i].too-1)
sgt.update(1, 1, n, lst+1, lian[i].too-1, w);
lst = lian[i].nxt;
}
if(lst+1<=n)
sgt.update(1, 1, n, lst+1, n, w);
}
int main(){
cin>>n>>m;
for(int i=1; i<n; i++){
scanf("%d %d", &xx, &ans);
add_edge(xx, ans);
add_edge(ans, xx);
}
dfs1(1, 0);
dfs2(1, 1);
for(int i=1; i<=m; i++){
scanf("%d", &opt);
if(opt==0){
scanf("%d %d %d", &uu[i], &vv[i], &ww[i]);
rangeUpdate(uu[i], vv[i], ww[i]);
}
else if(opt==1){
scanf("%d", &xx);
rangeUpdate(uu[xx], vv[xx], ww[xx]);
}
else{
scanf("%d", &xx);
ans = -1;
sgt.query(1, 1, n, dfn[xx]);
printf("%d\n", ans);
}
}
return 0;
}

loj2049 「HNOI2016」网络的更多相关文章

  1. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  2. loj#2049. 「HNOI2016」网络(set 树剖 暴力)

    题意 题目链接 Sol 下面的代码是\(O(nlog^3n)\)的暴力. 因为从一个点向上只会跳\(logn\)次,所以可以暴力的把未经过的处理出来然后每个点开个multiset维护最大值 #incl ...

  3. 「HNOI2016」数据结构大毒瘤

    真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直 ...

  4. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  5. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  6. 「HNOI2016」最小公倍数 解题报告

    「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...

  7. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  8. Linux 小知识翻译 - 「packet」(网络数据包)

    用手机接收邮件或者访问网页的时候,一般会说有「packet费用」(这是日本的说法,在中国好像一般都说 “流量费”),即使对网络不太熟悉的人也知道「packet」这个词(这里也是日本的情况). 那么,「 ...

  9. 【LOJ】#2052. 「HNOI2016」矿区

    题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...

随机推荐

  1. Spring MVC的高级配置

    1.文件上传配置 文件上传是项目中常用的一个功能,Spring MVC通过配置一个MultipartResolver来上传文件. 在Spring的控制器中,通过MultipartFile file 来 ...

  2. iOS - 协议实现的例子

    在实际开发中,协议的应用非常广泛,以下是实际应用的例子. 1.协议的定义: myProtocolDelegate.h // // myProtocolDelegate.h // zlwPlayerAp ...

  3. Flexbox与Grid属性比较

    网格容器(container)属性 网格项目(item)属性 Flex容器(container)属性 Flex项目(item)属性

  4. #linux 命令使用 cp -未完结版

    下载了sublime 解压之后,想把文件夹放到opt目录,这里用命令cp将其复制过来 johnny@johnny-pc:~$ sudo cp -r ~/下载/Sublime_2.0.2 /opt/ [ ...

  5. RAC基本使用

    @interface ViewController () @property (weak, nonatomic) IBOutlet lwRedView *redView; @property (wea ...

  6. python_51_函数返回值1

    def test1(): '只执行return以前的' print('test1返回值为0 ') return 0 print('这句不会被执行的') x=test1() print(x)#值为0 d ...

  7. 重学css3(概览)

    css3新特性概览: 1.强大的选择器 2.半透明度效果的实现 3.多栏布局 4.多背景图 5.文字阴影 6.开放字体类型 7.圆角 8.边框图片 9.盒子阴影 10.媒体查询 浏览器内核又可以分成两 ...

  8. IDEA搭建Maven 的聚合项目

    今天突然想把自己学习在eclipse上的maven聚合项目搭建到IDEA上,结果IDEA有太多的配置步骤,导致失败了很多次,终于在网上找到了一篇博客 https://blog.csdn.net/for ...

  9. Java poi 导出Excel并下载到客户端

    Maven配置,包含了其他文件格式的依赖,就全贴出来了 <dependency> <groupId>org.apache.poi</groupId> <art ...

  10. centos下 将(jgp、png)图片转换成webp格式

    由于项目要求需要将jpg.png类型的图片  转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透 ...