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) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...
随机推荐
- iQuery stop()
jQuery stop() 方法 jQuery stop() 方法用于停止动画或效果,在它们完成之前. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. 语法 $ ...
- C# Dictionary的遍历
foreach (KeyValuePair<string, string> kvp in dic) { Console.WriteLine("key:{0},value:{1}& ...
- javascript的Array.prototype.map()和jQuery的jQuery.map()
两个方法都可以根据现有数组创建新数组,但在使用过程中发现有些不同之处 以下面这个数据为例: var numbers = [1, 3, 4, 6, 9]; 1. 对undefined和null的处理 a ...
- linux打开文件数测试
/proc/sys/kernel/threads-max 系统最大线程数量 /proc/sys/vm/max_map_count 限制一个进程可以拥有的VMA(虚拟内存区域)的数量 /proc/sys ...
- The 12th Zhejiang Provincial Collegiate Programming Contest - I Earthstone Keeper浙江省赛
题目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5501 思路:DFS,用了递归就溢出,所以可能得用非递归的. ...
- IOS UIActivityIndicatorView动画
● 是一个旋转进度轮,可以用来告知用户有一个操作正在进行中,一般 用initWithActivityIndicatorStyle初始化 ● 方法解析: ● - (void)startAnimating ...
- 【洛谷3527】[POI2011] MET-Meteors(树状数组+整体二分)
点此看题面 大致题意: 一颗星球被分为\(M\)份,分别属于\(N\)个国家,有\(K\)场陨石雨,第\(i\)个国家希望收集\(P_i\)颗陨石,问其至少要在第几次陨石雨后才能达到目标. 关于整体二 ...
- 增强的格式化字符串format函数
http://blog.csdn.net/handsomekang/article/details/9183303 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓 ...
- Nginx学习记录(一)
1. 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支 ...
- 操作AD时出现 Access denied error
CommitChanges General Access denied error in Active Directory 1.首先检查AD账户是否具有操作AD的访问权限 2.若用C#类操作AD,还要 ...