[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.pswp.cn/news/395017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395017.shtml
英文地址,請注明出處:http://en.pswp.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…