好像复杂度来说不是正解……不加谜之优化(下叙)能被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. Hibernate数据库的操作

    参考网址: https://www.cnblogs.com/jack1995/p/6952704.html 1.最简单的查询 List<Special> specials = (List& ...

  2. 服网LNMP集群-1.0.5

    平台: arm 类型: ARM 模板 软件包: haproxy linux mysql nginx application server arm basic software fuwang infra ...

  3. TFS看板规则

    就绪板列 准入条件 需求已完成交付 需求交付过程中的问题已全部解决 当前迭代需求所产生的BUG必须放入该列 之前迭代遗留的BUG 工作内容 需求实现概要设计 BUG确认 任务拆分 任务工作量估算(单位 ...

  4. IOS NSBundle使用(访问文件夹)

    NSBundle的相关信息 1.一个NSBundle代表一个文件夹,利用NSBundle能访问对应的文件夹 2.利用mainBundle就可以访问软件资源包中的任何资源 3.模拟器应用程序的安装路径: ...

  5. mysql 疑难问题-django

    1不能存储中文 问题解决1: 确认表设计时,字段name_vn字符集是utf8,改成utf8后可以存储中文

  6. JS获取本地文件并且解析文件内容(XML,TXT)

    $(function(){ $("body").on("change", "#file", function (event) { uploa ...

  7. Jmeter命令行参数

    一.在linux中,使用非gui的方式执行jmeter.若需更改参数,必须先编辑jmx文件,找到对应的变量进行修改,比较麻烦.因此,可以参数化一些常用的变量,直接在Jmeter命令行进行设置 二.参数 ...

  8. komodo-edit

    sudo add-apt-repository ppa:mystic-mirage/komodo-edit sudo apt-get update sudo apt-get install komod ...

  9. iOS常用第三方类库 Xcode插件

    第三方类库(github地址): 1.AFNetworking 网络数据     https://github.com/AFNetworking/AFNetworking 2.SDWebImage 图 ...

  10. 32-3题:LeetCode103. Binary Tree Zigzag Level Order Traversal锯齿形层次遍历/之字形打印二叉树

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...