网络管理 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门. 为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络. 该网络的结构由N个路由器和N-1条高速光缆组成. 每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络. 该网络结…
题面 bzoj luogu 所有事件按时间排序 按值划分下放 把每一个修改 改成一个删除一个插入 对于一个查询 直接查这个段区间有多少合法点 如果查询值大于等于目标值 进入左区间 如果一个查询无解 那么它要求第k大无解 k > 路径长 用lca维护即可 #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #…
[BZOJ1146]网络管理(整体二分) 题面 良心洛谷,有BZOJ权限题 题解 要看树套树的戳这里 毕竟是:智商不够数据结构来补 所以, 我们来当一回智商够的选手 听说主席树的题目大部分都可以整体二分 这题丢进去整体二分就行了 只需要查询树上贡献的前缀和 但是,对于这种带修改的 不能够直接修改 每一个修改操作必须拆成两个: 一个删掉原来的修改,一个加入现在的修改 否则就会重复计算贡献从而\(gg\) #include<iostream> #include<cstdio> #inc…
传送门 题意简述:给一棵树,支持单点修改,询问路径上两点间第kkk大值. 思路: 读懂题之后立马可以想到序列上带修区间kkk大数的整体二分做法,就是用一个bitbitbit来支持查值. 那么这个题把树状数组放到树上用树链剖分维护一下即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!…
其实也没啥好说的 用树状数组可以O(logn)的查询 套一层整体二分就可以做到O(nlngn) 最后用树链剖分让序列上树 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; inline int read() { ,f=,ch=getchar(); ;}ch=getchar();} +ch-';ch=getchar();}…
一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) // luogu-judger-enable-o2 #include <bits/stdc++.h> #define lowbit(x) ((x)&(-(x))) using namespace std; const int maxn=80000+10; const int lim=1e…
题目传送门 题意:求树上路径可修改的第k大值是多少. 题解:CDQ整体二分+树刨. 每一个位置上的数都会有一段持续区间 根据CDQ拆的思维,可以将这个数拆成出现的时间点和消失的时间点. 然后通过整体二分第k大思路 + 树炮询问路径上出现点的个数就好了. 说一下整体二分的思路. 先假设第k大的值是mid, 然后按照时间顺序,出现一个数<=mid标记这个数的位置为1, 消失一个数<=mid,标记这个数的位置为0. 然后对于询问来说,询问路径上的值, 与 k进行比较, 如果 值 >= k则说明…
这题的复杂度可以到达惊人的\(\log^4\)据说还能跑过去(差点没吓死我 直接二分+树剖树套树(\(n \log^4 n\)) 一个\(\log\)也不少的4\(\log\) 但是我有个\(\log^3\)的树剖上面整体二分+线段树的做法 不过据说有个\(\log\)做法,我不会,反正我菜就是了 然后的话 就直接考虑个消除贡献-然而并不需要排序 权值线段树 就可以了 每次添加修改就 if(! op) { int y = read() , z = read() ; Q[++ tot] = { 0…
这点东西前前后后拖了好几个星期才学会……还是自己太菜啊. Cdq分治的思想是:把问题序列分割成左右两个,先单独处理左边,再处理左边对右边的影响,再单独处理右边.这样可以消去数据结构上的一个log,降低编码复杂度. 整体二分:当一个询问的答案满足二分性质时,我们可以按照答案的大小分割整个查询和修改序列.每次把序列分成互不相同的两部分.这样能把数据结构的二分拿出来,降低编码复杂度. 说白了,就是当你懒得写树套树或者惨遭卡内存时候的骗分办法. 好了,上例题吧: BZOJ2683: 二维单点加,矩形查.…
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn #define inf 0x3f3f3f3f using namespace std; +,maxm=+; int n,m,a[maxn],ans[max…