COGS 2479. [HZOI 2016] 偏序 (CDQ套CDQ)】的更多相关文章

传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的数据,1<=n<=50000,保证所有的ai.bi.ci分别组成三个1~n的排列. $CDQ$分治套$CDQ$分治也不是很难嘛 对于本题,设四维$a,b,c,d$ $Sort\ at\ a$ $CDQ(l,r)$ $\quad CDQ(l,mid)$ $\quad CDQ(mid+1,r)$ $\…
传送门 解题思路 四维偏序问题,模仿三维偏序,第一维排序,第二维CDQ,最后剩下二元组,发现没办法处理,就继续嵌套CDQ分治.首先把二元组的左右两边分别打上不同的标记,因为统计答案时只统计左边对右边的影响,然后再进行一个CDQ解决第三维,最后用树状数组解决最后一维. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; ; ;…
传送门 思路: 就是cdq套cdq的模板题 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100005; struct node { int d1, d2, d3, d4, part; }a[N], b[N], d[N]; int n, ans; int c[N]; int lowbit(int x) {return x & (-x);} void add(int x,…
前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N(N<=20000)个有序四元组(a,b,c,d),求对于每一个四元组(a,b,c,d),有多少个四元组(a2,b2,c2,d2)满足a2<a && b2<b && c2<c && d2<d.        不需要太多思考,就能得到一…
题目链接 思路 四维偏序 \(CDQ\)套\(CDQ\),第一维默认有序.第二维用第一个\(CDQ\)变成有序的.并且对每个点标记上第一维属于左边还是右边.第二个\(CDQ\)处理第三维,注意两个\(CDQ\)不能用同一个数组,否则第二维就变成无序的了.最后一维用个树状数组统计答案. 代码 /* * @Author: wxyww * @Date: 2019-02-16 16:39:12 * @Last Modified time: 2019-02-17 08:18:59 */ #include<…
COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj,di<dj的i,j对数有多少? a,b,c,d均为1~n的排列,即不会有i,j使得ai=aj or bi=bj or ci=cj or di=dj. 题目是离线的,cdq分治可以很好的解决这一类问题.cdq套cdq套cdq再加个bit就行了. 第一层的cdq处理a,保证a有序, 第二层在第一层的基础上处…
题意:现在给定空空的三维平面,有加点操作和询问立方体点数. 思路:考虑CDQ套CDQ.复杂度是O(NlogN*logN*logN),可以过此题. 具体的,这是一个四维偏序问题,4维分别是(times,x,y,z):我们知道cdq可以求出t<=T,x=X,y<=Y,在套一层就可以z<=Z了.那么一个立方体,我们拆为8个点来容斥. 然后现在的问题就是,求出(0,0,0)到(x,y,z)的点数. 第一维T已经默认排序了,我们先对X分治. 把所有问题分成两块,并且把左边这块标记o=-1,右边的标…
题意:Q次操作,三维空间内 每个星星对应一个坐标,查询以(x1,y1,z1) (x2,y2,z2)为左下顶点 .右上顶点的立方体内的星星的个数. 注意Q的范围为50000,显然离散化之后用三维BIT会MLE. 我们可以用一次CDQ把三维变成二维,变成二维之后就有很多做法了,树套树,不会树套树的话还可以继续CDQ由二维变成一维,,变成一维了就好做了,,最基本的数据结构题目了.. 不得不说.CDQ真的很神奇. 下面做法就是CDQ套CDQ套树状数组. #include <cstdio> #inclu…
对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: \(a_{l} < a_{l+1} < ... < a_r => (a_l,a_{l+1},...,a_{mid}) \text{都小于} (a_{mid+1},a{mid+2},...,a_r)\) 然后我们就知道这时候左边所有的点都一定小于右边的点 在四维偏序的算法中,那就是左边的…
大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k(k<=n-1),求原图的一个生成树,使得其中至少包含k条一级边且最大的边权值尽量小. [HZOI 2016]公路修建2 和上一题基本一样,但是求出的不一定是生成树(也就是说可以有多于n-1条边,只要让图连通即可),在此前提下仍然使得其中至少包含k条一级边且最大的边权值尽量小. 解法: 两题均可以使用…
2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 给定一棵有n个节点的有根树,根节点为1,每个节点有一个权值wi,求 即求所有无序节点对的LCA的权值之和. 树的节点编号为1~n,LCA表示两节点的最近公共祖先,即在它们的所有公共祖先中离根节点最远的节点. [输入格式] 第一行一个整数n,表示节点数. 第二行n个正整数,表示每个点的权值.…
2199. [HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多,人也很多,一次活动有n个学生参与投票,现已知一名参赛选手票数超过半数,求其参赛号(参赛号随机) [输入格式] 第一行一个整数n 第二行n个整数Ni 代表第i个学生所投选手的参赛号 [输出格式] 超过半数选手的参赛号 [样例输入] 10 5 1 2 5 5 2 3 5 5 5 [样例输出] 5 [提示…
2485. [HZOI 2016]从零开始的序列 ★★   输入文件:sky_seq.in   输出文件:sky_seq.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 这个名字只是吸引你们这些死宅过来的.跟题目没关系. 现在Sky_miner给你一个序列,定义f(x)为(所有长度为x的区间中的最小值)的最大值. 要求输出f(1) .. f(n) 1 <= n <= 2*10^5 [输入格式] 第一行一个正整数n,含义如题 第二行共n个整数,为给定的序列,每一个…
时间限制:1 s   内存限制:128 MB [题目描述] 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix2+Bix+Ci(x∈N∗).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). [输入格式] 第一行输入两个正整数n和m. 以下n行每行三个正整数,其中第i行的三个数分别为Ai.Bi和Ci.输入数据保证Ai<=10,Bi<=100,Ci<=10000. [输出格式] 输出将这n个函数所有可以生成的函数值排序后的前m个元素.…
2419. [HZOI 2016]公路修建2 ★☆   输入文件:hzoi_road2.in   输出文件:hzoi_road2.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨在建立OI island的交通系统.OI island有n个旅游景点,不妨将它们从1到n标号.现在,OI…
2416. [HZOI 2016]公路修建 ★☆   输入文件:hzoi_road.in   输出文件:hzoi_road.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨在建立OI island的交通系统.OI island有n个旅游景点,不妨将它们从1到n标号.现在,OIER…
2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 给定一棵有n个节点的有根树,根节点为1,每个节点有一个权值wi,求 即求所有无序节点对的LCA的权值之和. 树的节点编号为1~n,LCA表示两节点的最近公共祖先,即在它们的所有公共祖先中离根节点最远的节点. [输入格式] 第一行一个整数n,表示节点数. 第二行n个正整数,表示每个点的权值.…
2632. [HZOI 2016] 数列操作d ★★★   输入文件:segment.in   输出文件:segment.out   简单对比时间限制:3 s   内存限制:512 MB [题目描述] 一个长度为n的序列,一开始序列数的权值都是0,有m次操作 支持两种操作: 1 L R x,给区间[L,R]内位置为pos的数加上(pos-L)*x 0 L R,查询区间[L,R]内的权值和 最终答案对109+7取模. [输入格式] 第一行两个数n,m,表示序列长度和操作次数 接下来m行,每行描述一…
题目传送门 题意:在一个星空中,按着时间会出现一些点,现在john想知道,在某个时间内有多少个星星是的坐标是满足条件的.(x1<=x<=x2, y1 <= y <= y2, z1 <= z <= z2).题解:先简化问题,如果我们就统计出现所有 x <= x2 , y <= y2, z <= z2的点的话,这就是一个4维偏序题. 对于这个统计点数来说, 我们先按照题目给定点的顺序来进行CDQ, 这样在CDQ内只有左边的添加点会对右边的询问点产生影响,然…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好了 实现代码: #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; ; int ans[M],c[M]; struct node { int x,y,z; int kind,id; node(){} no…
题目大意: 给定一个有n个元素的数组,有m个操作,分为两种,分别是询问第k个x的下标和把下标为x的数修改为k. 题目设置了强制在线,故无法预先得知所有操作数. 思路: 有三种思路. 第一种:平衡树 by std(也就是我) 为每一个数建一个平衡树,平衡树中储存的是这个数出现的每个下标,则询问操作对应名次树的查询k小数操作,单点修改直接维护一个数组记录每个位置上的值,把原来的数对应的下标从平衡树里删除,再把新数的平衡树中加入这个下标即可. 实现时开一个从int到平衡树的map,这样预处理复杂度O(…
我们可以发现所有的操作当中,只有坐标的增加,没有坐标的减少. 所以我们可以发现这么一个简单的事实,一条鱼一旦出了渔网,那么它就不可能再回来. 但是目前这并没有什么卵用. 我们可以把询问一个矩阵当中的鱼的数量转化为分别求这个矩阵的四个角的左下角的鱼的数量.又因为我们发现x和y的坐标是独立的,所以我们可以分别维护. 维护这个东西本人使用的线段树,在这里维护了八颗线段树. 然后在维护的过程中,八颗线段树应该是两两配对维护的,也就是x坐标和y坐标应该一同维护,因为我们维护的是某一个点的左下角的点的数量,…
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话dp貌似就比较麻烦了. 我们考虑一般树形dp都是怎样的,一般的树形dp,都是因为子树上的f值可以无后效的转移到根节点上,并且子树的f值与父亲无关,如果我们按照上述定义,那么就会发现这需要两遍dfs来解决,并且细节不少. 但是两遍dfs我并不会QAQ 所以我们考虑转换一种定义,设f[x][k]表示在以x…
题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序,然后按顺序构建BST即可.注意不能加平衡,因为这样会改变树的先序遍历. 期望复杂度O(nlogn)(排序和构建),考虑极端情况下树可能是一个链,最坏情况复杂度O(n2). 2.暴力2 直接构建Treap,但遇到是链的情况仍然是O(n2). 考虑将节点顺序打乱后进行建树,常数大大减小,但由于链状树的深度为n…
笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来建树:我们可以先排序K然后一个个插入,那么我们都是最右端,横容易被卡,那么我们不从上到下,我们从下到上,用栈维护,那就把时间复杂度从O(n^2)降到O(n),具体过程见下图从图一到图二就是这么一个过程,我们在把K为13的点插入时要找到一个合适的位置,上比他大,下比他小(假设大根堆) 下面见代码 #i…
[题目描述] 一个长度为n的序列,一开始序列数的权值都是0,有m次操作 支持两种操作, 1 L R x,给区间[L,R]内,第一个数加x,第二个数加2^2⋅x,第三个数加3^2⋅x...第R-L+1个数加(R−L+1)^2⋅x 2 L R 查询区间[L,R]内的权值和 每次询问的答案对264取模 [输入格式] 第一行两个数n,m,表示序列长度和操作次数 接下来m行,每行描述一个操作,有如下两种情况: 1 L R x,给区间[L,R]内,第一个数加x,第二个数加2^2⋅x,第三个数加3^2⋅x..…
[题意] 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于30%的数据,n<=5000. 对于100%的数据,1<=n<=50000(原题写错了哈哈),保证所有的ai.bi.ci分别组成三个1~n的排列. [解法] 标题已经说了这是偏序,读完题,这就是个四维偏序模板题(位置一维,a,b,c剩下三维). 解法多多,我用的是CDQ树套树(树套树写的树状数组套替…
思路: 此题显然是CDQ套CDQ套树套树 (然而我懒) 想用一种奇怪的姿势卡过去 就出现了以下解法 5w*5w/8的bitset hiahiahia 但是空间会爆怎么办啊- 折半~ 变成5w*2.5w/8完美卡过去 时间会慢很多么 并没有~~完全可以过 甚至比某些姿势不好的树套树快hiahiahia 代码是不是很短~ //By SiriusRen #include <bitset> #include <cstdio> #include <algorithm> using…
传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /* mail: mleautomaton@foxmail.com author: MLEAutoMaton This Code is made by MLEAutoMaton */ #include<stdio.h> #include<stdlib.h> #include<string.h> #inclu…
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种特殊的分治方法,在 OI 界初见于陈丹琦 2008 年的集训队作业中,因此被称为 CDQ 分治. CDQ分治是将操作分治,用于解决"修改独立,允许离线"的问题.本质为按时间分治. 可以用CDQ的题目必须满足: 1.修改与询问互相独立,且修改之间互不影响 2.允许离线 那么我们将操作序列分为…