「HNOI2016」矿区】的更多相关文章

题面 传送门 题解 总算会平面图转对偶图了-- 首先我们把无向边拆成两条单向边,这样的话每条边都属于一个面.然后把以每一个点为起点的边按极角排序,那么对于一条边\((u,v)\),我们在所有以\(v\)为起点的边中找到\((v,u)\)的前缀,这条边就是\((u,v)\)的下一条边了.不断重复这个过程直到找到的区域封闭为止 建好对偶图之后,我们对于每一个点,算出这个点所代表的区域的面积.对于无界域(就是外围无限的那个面),它的面积会是一个负数.那么我们找到这个无界域代表的节点之后,以它为根,求出…
题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 首先我们把一条边拆成两条有向边,每个点的出边按照弧度排序 显然,相邻的两条边一定夹着一个域 我们从一个没有找到所在域的边(这里的边是有方向的,一条边的域我定义为这条边逆时针方向的多边形),然后到了目标节点后,我们把这条边变成目标节点的出边来二分一下这条边顺时针第一条边是什么边,这样因为平面图是联通的…
学习一发平面图的姿势--ref #include <algorithm> #include <iostream> #include <cstdio> #include <vector> #include <cmath> using namespace std; typedef long long ll; int n, m, k, cnt, uu, vv, nxt[1200005], bel[1200005], belcnt, rot, fa[12…
https://loj.ac/problem/2052 题解 平面图转对偶图.. 首先我们转的话需要给所有的平面标号,然后找到每条边看看他们隔开了哪两个平面. 做法就是对每个点维护它的所有排好序的出边,然后对于每一条有序边找到它的一条后继边. 如果一直找下去,就会找到一个平面,依次标号就好了. 我们转好了对偶图,\(dfs\)出对偶图的一颗生成树,然后对于一次询问,它肯定是切出了树上的一些联通块. 所以我们讨论一下每一条边的方向算一下答案就好了. 代码 #include<bits/stdc++.…
真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直接维护一定是 \(O(n\log^3 n)\) 的,所以我当时选择了用 \(LCT\) 维护树上路径,跑起来比树剖可能都慢... 其实路径加单点查可以直接在 \(dfs\) 序上弄树状数组的,虽然也是 \(O(n\log^2 n)\) 的,但是肯定能通过此题... \(Code\ Below:\)…
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写的. 大值思路是对每个子树维护成一个大节点,存一些根啊,深度啊,到大节点根距离啊,节点编号范围啊之类的信息. 然后发现维护相对节点标号大小是个区间第k大,得对dfs序建一颗主席树 然后每次询问倍增跳一跳,讨论个几种情况之类的. ps:别吐槽名字 Code: #include <cstdio> #i…
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的,但注意它是单调的 于是每个点假装向左边第一个小于它的位置连边,就可以处理出前缀和一样的东西,然后预处理后也是\(O(1)\)的 Code: #include <cstdio> #include <cctype> #include <algorithm> #include…
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这个路径条数等于大于当前答案的所有路径条数,那么这个答案是不行的. 关于链修改单点询问,可以树状数组维护dfs序,然后每次修改链去差分修改 然后把二分答案拿到整体二分上去就可以了 Code: #include <cstdio> #include <cctype> #include <…
「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要去离线搞一下,考虑定期重构. 具体的,先把边按\(a\)排序,然后每\(S\)分一块. 处理每一块时,把前面所有块的边和权值在这个块内的询问放在一起按\(b\)排序,这个可以用类似归并的思路\(O(n)\)完成. 然后遍历这个排序后的东西,用带权并查集维护联通性. 具体的,如果是边,就在并查集里面加…
#2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1:n] a[1 \colon n]a[1:n].类似地,a[l:r] a[l \colon r]a[l:r](1≤l≤r≤N 1 \leq l \leq r \leq N1≤l≤r≤N)是指序列:al,al+1,⋯,ar−1,ar a_{l}, a_{l+1}, \cdots ,a_{r-1}, a_…