loj2049 「HNOI2016」网络
好像复杂度来说不是正解……不加谜之优化(下叙)能被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」网络的更多相关文章
- 「HNOI2016」网络 解题报告
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...
- loj#2049. 「HNOI2016」网络(set 树剖 暴力)
题意 题目链接 Sol 下面的代码是\(O(nlog^3n)\)的暴力. 因为从一个点向上只会跳\(logn\)次,所以可以暴力的把未经过的处理出来然后每个点开个multiset维护最大值 #incl ...
- 「HNOI2016」数据结构大毒瘤
真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直 ...
- 「HNOI2016」树 解题报告
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...
- 「HNOI2016」序列 解题报告
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...
- 「HNOI2016」最小公倍数 解题报告
「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...
- loj #2051. 「HNOI2016」序列
#2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na1,a2,⋯,an,记为 a[1: ...
- Linux 小知识翻译 - 「packet」(网络数据包)
用手机接收邮件或者访问网页的时候,一般会说有「packet费用」(这是日本的说法,在中国好像一般都说 “流量费”),即使对网络不太熟悉的人也知道「packet」这个词(这里也是日本的情况). 那么,「 ...
- 【LOJ】#2052. 「HNOI2016」矿区
题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...
随机推荐
- [荐]推荐一个shell学习的网站
最近再用shell脚本,发现一个脚本学习的网站,非常好用,特此推荐一下. shell学习网站链接:http://c.biancheng.net/cpp/shell/
- 【extjs6学习笔记】1.10 初始: 定义类
http://www.extjs-tutorial.com/extjs/define-new-class-in-extjs
- cms-后台eazyui搭建
1.引入eazyUi需要的js 2.布局:上.下.左.中 <%@ page language="java" contentType="text/html; char ...
- LeetCode Find Peak Element 找临时最大值
Status: AcceptedRuntime: 9 ms 题意:给一个数组,用Vector容器装的,要求找到一个临时最高点,可以假设有num[-1]和num[n]两个元素,都是无穷小,那么当只有一个 ...
- php:生成的时间与本地电脑的时间不匹配
如题,在php中我发现在数据库中的时间跟电脑上的时间没有同步 本地时间: 数据库中,生成的时间: 很明显,时分秒是对应不上去的,那么我们只要在php.ini中找到 这里被注释掉了,那我们就改成这样: ...
- 工作流性能优化(敢问activiti有扩展性?)(3)
2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配 ...
- codeforces 600C Make Palindrome
要保证变化次数最少就是出现次数为奇数的相互转化,而且对应字母只改变一次.保证字典序小就是字典序大的字母变成字典序小的字母. 长度n为偶数时候,次数为奇数的有偶数个,按照上面说的搞就好了. n为奇数时, ...
- python_40_通过脚本转换参数实现替换
import sys f=open('yesterday','r',encoding='utf-8') f_new=open('yesterday_update','w',encoding='utf- ...
- 《GPU高性能编程CUDA实战中文》中第四章的julia实验
在整个过程中出现了各种问题,我先将我调试好的真个项目打包,提供下载. /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. ...
- 14.2-ELK 经典用法—企业自定义日志收集切割和mysql模块
本文收录在Linux运维企业架构实战系列 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-02-24 11: ...