[HNOI2016]网络 树链剖分,堆

[HNOI2016]网络

LG传送门

表示乱搞比正解难想。

整体二分很好想吧。

但是为了好写快乐,我们选择三个\(\log\)的乱搞。

先树剖,线段树套堆维护区间最大值。对于一次修改,如果是插入,就把树上除了这条链的地方加上这个重要度,如果是删除则反之。注意线段树可以标记永久化,这里用的堆是一种(可能)叫懒惰堆的东西,直接看代码都能理解。

//written by newbiechd
#include <cstdio>
#include <cctype>
#include <vector>
#include <queue>
#include <algorithm>
#define R register
#define I inline
#define B 1000000
using namespace std;
const int N = 100003, M = 200003;
char buf[B], *p1, *p2;
I char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, B, stdin), p1 == p2) ? EOF : *p1++; }
I int rd() {R int f = 0;R char c = gc();while (c < 48 || c > 57)c = gc();while (c > 47 && c < 58)f = f * 10 + (c ^ 48), c = gc();return f;
}
int s[N], fa[N], dep[N], siz[N], son[N], dfn[N], top[N], n, tim;
struct road {int x, y;road() {}road(int x, int y) : x(x), y(y) {}
}sta[N];
I int operator < (road a, road b) { return a.x ^ b.x ? a.x < b.x : a.y < b.y; }
struct event {int x, y, z;
}q[M];
struct prique {priority_queue <int> q1, q2;I void push(int x) { q1.push(x); }I void pop(int x) { q2.push(x); }I int top() {while (!q2.empty() && q1.top() == q2.top())q1.pop(), q2.pop();return q1.empty() ? -1 : q1.top();}
}e[N << 2];
vector <int> g[N];
I int max(int x, int y) { return x > y ? x : y; }
I void swap(int &x, int &y) { x ^= y, y ^= x, x ^= y; }
void dfs1(int x, int f) {fa[x] = f, dep[x] = dep[f] + 1, siz[x] = 1;for (R int i = 0, y, m = 0; i < s[x]; ++i)if ((y = g[x][i]) ^ f) {dfs1(y, x), siz[x] += siz[y];if (siz[y] > m)m = siz[y], son[x] = y;}
}
void dfs2(int x, int t) {dfn[x] = ++tim, top[x] = t;if (son[x])dfs2(son[x], t);for (R int i = 0, y; i < s[x]; ++i)if (!dfn[y = g[x][i]])dfs2(y, y);
}
void modify(int k, int l, int r, int x, int y, int z, int opt) {if (x == l && y == r) {opt ? e[k].pop(z) : e[k].push(z);return ;}R int p = k << 1, q = p | 1, m = (l + r) >> 1;if (y <= m)modify(p, l, m, x, y, z, opt);elseif (m < x)modify(q, m + 1, r, x, y, z, opt);elsemodify(p, l, m, x, m, z, opt),modify(q, m + 1, r, m + 1, y, z, opt);
}
int query(int k, int l, int r, int x) {if (l == r)return e[k].top();R int p = k << 1, q = p | 1, m = (l + r) >> 1, o = e[k].top();if (x <= m)return max(o, query(p, l, m, x));elsereturn max(o, query(q, m + 1, r, x));
}
I void insert(int x, int y, int z, int opt) {R int t = 0, i, l = 0;while (top[x] ^ top[y]) {if (dep[top[x]] < dep[top[y]])swap(x, y);sta[++t] = road(dfn[top[x]], dfn[x]), x = fa[top[x]];}if (dep[x] > dep[y])swap(x, y);sta[++t] = road(dfn[x], dfn[y]), sort(sta + 1, sta + t + 1);for (i = 1; i <= t; l = max(l, sta[i++].y))if (l + 1 < sta[i].x)modify(1, 1, n, l + 1, sta[i].x - 1, z, opt);if (l < n)modify(1, 1, n, l + 1, n, z, opt);
}
int main() {R int m, i, x, y, z, opt;n = rd(), m = rd();for (i = 1; i < n; ++i)x = rd(), y = rd(), g[x].push_back(y), g[y].push_back(x);for (i = 1; i <= n; ++i)s[i] = g[i].size();dfs1(1, 0), dfs2(1, 1);for (i = 1; i <= m; ++i) {opt = rd(), x = rd();if (opt == 0)y = rd(), z = rd(), q[i] = (event){x, y, z}, insert(x, y, z, opt);if (opt == 1)insert(q[x].x, q[x].y, q[x].z, opt);if (opt == 2)printf("%d\n", query(1, 1, n, dfn[x]));}return 0;
}

其实我觉得写正解的大佬们没必要diss我们这种只会乱搞的小蒟蒻啊这个乱搞的思路也挺精巧的

转载于:https://www.cnblogs.com/cj-chd/p/10453387.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python压缩文件为zip-python 压缩文件为zip后删除原文件

压缩.log 文件为zip后删除原文件 需要注意&#xff1a;本人作为小白&#xff0c;该脚本需要和.log在一起&#xff0c;后面有时间需要改正。 #!/usr/local/python/bin/python #-*-codingutf8 -*- import time import os import sys import zipfile N 7 #设置删除多少天前的文件…

css text-align-last设置末尾文本对齐方式

text-align-last&#xff1a;auto | start | end | left | right | center | justify auto&#xff1a; 无特殊对齐方式。 left&#xff1a; 内容左对齐。 center&#xff1a; 内容居中对齐。 right&#xff1a; 内容右对齐。 justify&#xff1a; 内容两端对齐。 start&#x…

后端开发除了编码还要做什么_每个开发人员都应掌握的基本技能(除了编码)

后端开发除了编码还要做什么Whether you are learning to code, looking for a new job, or just want to improve your skills as a developer, you need to master the essential tools of team collaboration. These are as important as knowing how to code.无论您是学习编…

Python中的defaultdict方法

字典&#xff08;dictionary&#xff09;是Python中一种常用的数据类型。不同于其他由数字索引的序列&#xff0c;字典是用"键"&#xff08;key&#xff09;来索引的。通常表示为dict(key: val, ...)&#xff0c;有以下特征&#xff1a; 键可以是任何不可变&#xff…

git撤销commit 并保存之前的修改

撤销并保留修改 参数 –soft # 先进行commit &#xff0c;之后后悔啦$ git commit -am "对首篇报告研究员字段改为author_name"执行git log $ git logcommit 3d6788f577faba5e1d408e372031c81beee79749Author: yous <yous.com>Date: Thu Dec 14 10:08:36 2017 …

php替换中文,PHP中文替换

//定义编码header( Content-Type:text/html;charsetutf-8 );$wordsarray(我,你,他);$content"测一测我是不是违禁词";$bannedgenerateRegularExpression($words);//检查违禁词$res_bannedcheck_words($banned,$content);write_html($content,$res_banned);/*** descr…

secoclient隧道保活超时或协商超时_推荐:承德市隧道led大屏厂家电话【联丰智慧科技】...

通过为大型隧道施工建设搭建全覆盖式的定位&#xff0c;可以有效施工的效率、项目现场的保障能力。安装隧道门禁能解决哪些问题&#xff1f;近年来&#xff0c;我国交通建设正处于高速发展的阶段&#xff0c;在交通建设中&#xff0c;工程安防工作也越发受到&#xff0c;越来越…

JavaScript Essentials:如何为循环而烦恼

by Zell Liew由Zell Liew JavaScript Essentials&#xff1a;如何为循环而烦恼 (JavaScript Essentials: how to wrap your head around for loops) Let’s say you want to run a function, bounceBall, four times. How would you do it? Like this?假设您要运行一次功能b…

python中的类的成员变量以及property函数

1 python类的各种变量 1.1 全局变量 在类外定义的变量。 1.2 类变量 定义在类里面&#xff0c;所有的函数外面的变量。这个变量只有一份&#xff0c;是所有的对象共有的。在类外用“类.”来引用。 1.3 实例变量 用self.xxx在类的任何函数中定义的变量就是实例变量。在类内用“s…

C++常用的系统函数

数学<math.h>&#xff1a; 1 三角函数 double sin (double); double cos (double); double tan (double); 2 反三角函数 double asin (double); 结果介于[-PI/2, PI/2] double acos (double); 结果介于[0, PI] double atan (double); 反正切(主值), 结果介于[-PI/2, PI/2…

网页特效java代码,美化网页常用特效代码

1&#xff0e;让文字不停地滚动&#xff1c;MARQUEE&#xff1e;滚动文字&#xff1c;/MARQUEE&#xff1e;2&#xff0e;记录并显示网页的最后修改时间&#xff1c;script languageJavaScript&#xff1e;document.write("最后更新时间: " document.lastModified …

作业,两次实验

实验一&#xff1a; 1 编程打印5行的倒三角形&#xff0c;第一行打印9个*&#xff0c;第二行7个*&#xff0c;……第5行打印1个* #include<stdio.h>int main(){printf("*********\n *******\n *****\n ***\n *\n");return 0;} 总结 注意换行以及位置的…

javaweb和ajax使用查询出来的数据做下拉菜单_区块链浏览器实用指南篇:利用链上数据把握减半行情...

进入2020年&#xff0c;加密货币市场最热的话题当属“减半”了。在减半行情的推动下&#xff0c;以BTC为首的减半币种展现出了极强的上行趋势。如何抓住这一波行情&#xff0c;评估正确时机&#xff1f;当然&#xff0c;这个问题的答案可以说是争议纷纷&#xff0c;但有一个参考…

纯函数式编程语言_纯功能编程语言如何改变您的生活。

纯函数式编程语言by Andrea Zanin由Andrea Zanin 纯功能编程语言如何改变您的生活。 (How a purely functional programming language can change your life.) I believe everyone should learn Haskell, even if you won’t use it in your work. It’s beautiful, and it ch…

Win10 教育版

Windows 10 版本 1607 引入了专为 K-12 机构的特有需求而设计的两个版本&#xff1a;Windows 10 专业教育版和 Windows 10 教育版。 这些版本为不断发展的 K-12 教育 IT 环境提供特定于教育的默认设置。Windows 10 专业教育版Windows 10 专业教育版基于 Windows 10 专业版的商业…

java中的排序方法,Java中的排序比较方式:自然排序和比较器排序

这里所说到的Java中的排序并不是指插入排序、希尔排序、归并排序等具体的排序算法。而是指执行这些排序算法时&#xff0c;比较两个对象“大小”的比较操作。我们很容易理解整型的 i>j 这样的比较方式&#xff0c;但当我们对多个对象进行排序时&#xff0c;如何比较两个对象…

ImageView缩放选项

ImageView.ScaleType 将图片边界缩放到所在view边界时的缩放选项。 Options for scaling the bounds of an image to the bounds of this view. 不同选项含义 CENTER 居中&#xff0c;不缩放。 Center the image in the view, but perform no scaling. CENTER_CROP 居中&#x…

css命名_CSS命名约定将节省您的调试时间

css命名I have heard lots of developers say they hate CSS. In my experience, this comes as a result of not taking the time to learn CSS.我听到很多开发人员说他们讨厌CSS。 以我的经验&#xff0c;这是因为没有花时间学习CSS。 Korean ??韩文?? 알림: 한국인 독…

电脑删除快捷键_可能是知乎最有用的 Windows 快捷键学习指南。

在任何地方搜索“快捷键的使用”&#xff0c;你都能找到无数的列表清单。但你应该不会专门去对照一个个的表单&#xff0c;企图把所有快捷键全部掌握吧&#xff1f;经过三年左右的总结和视频制作&#xff0c;Topbook 大概产出了 20 支左右的快捷键、快捷操作及应用等相关的视频…

java自动依照日期建表,脚本根据一个表中的日期字段填充每月汇总表

你想在这里做两件事 . 我假设您正在使用Oracle(因为您正在使用Java) .首先&#xff0c;您希望对每个用户的每日交易进行分组 .创建一个名为 tempTable 的临时表 .使用 to_char(currentdate, yyyy/mm/dd) 对它们进行分组 .INSERT INTO tempTableSELECTuserid,resourceid,doc_nam…