题目大意:略 洛谷传送门 和 [CQOI2015]动态逆序对 这道题一样的思路 一开始的序列视为$n$次插入操作 把每次交换操作看成四次操作,删除$x$,删除$y$,加入$x$,加入$y$ 把每次操作都看成一个三元组 $<x,w,t>$ 操作位置,权值,以及操作时间 变成了一道三维偏序裸题 外层按操作时间$t$升序,回溯时按操作位置$x$排序 处理左区间对右区间的影响时,正反两次树状数组求逆序对即可 #include <vector> #include <cstdio>…
题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等于右侧 而$c_{i}$这一维需要用权值树状数组维护 归并排序时,已知左侧右侧两个指针分别是$i,j$ 如果$b_{i} \leq bj$,将左侧已经遍历过的三元组的$c_{i}$推入树状数组,然后$i++$ 如果$b_{i}>bj$,那么右侧能取到的贡献就是树状数组内$\leq c_{j}$的三元…
题目大意: 洛谷传送门 这明明是一道KD-Tree,CDQ分治是TLE的做法 化简式子,$|x1-x2|-|y1-y2|=(x1+y1)-(x2+y2)$ 而$CDQ$分治只能解决$x1 \leq x2,y1 \leq y2$的情况 把每次插入操作都相当于一个三元组$<x,y,t>$,权值是$x+y$.这就是一个三维偏序问题,用树状数组维护最大值即可 所以通过坐标变换,跑$4$次$CDQ$就行了? 没错,你会像我一样T得飞起 #include <cstdio> #include &…
题目大意: 洛谷传送门 三维偏序裸题.. 每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $ 询问操作拆成$4$个容斥 接下来就是$CDQ$了,外层按t排序,回溯时按$x$排序,用树状数组处理$y$这一维即可 #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #define N1 201000 #define M1…
题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数量,再统计每次删除元素时,减少的逆序对数量 然后就是三维偏序裸题了吧,第一维时间,第二维操作位置,第三维权值,用树状数组维护即可 由于逆序对可以在被删除元素的前面或者后面,所以在归并时需要正反遍历各统计一次 #include <vector> #include <cstdio> #in…
2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1310  Solved: 517[Submit][Status][Discuss] Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观.设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:…
链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay <= by, az <= bz}, a的数量, 求0-(n-1)个数有多少个点满足 思路: 三维偏序, CDQ分治, 听说过, 一直想学, 先写板子题, 二维偏序就属性减到连个,搞一下. CDQ的思想就是先对第一维排序, 左边的可以给有变贡献, 在分治下去, 同时对第二维排序, 将可用的点的第三维用数据…
大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 这时对第二维排序,又变成动态一维数点 树状数组屠之 (不妨再cdq一次变成零维数点,也就是询问一个询问之前有几次修改)(手动滑稽) 另外因为x y z都相同时互相产生影响,特判掉 来上个又臭又长的代码 #include <bits/stdc++.h> using namespace std; st…
Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的偏序是三个值都小于等于它的值的元素的个数,对于\([0, n)\)的每个值\(i\),求偏序为\(i\)的元素个数. 题解 这道题我使用的是CDQ分治. 这道题有三个维度,每个维度都要对应一个数据结构/算法,来逐个击破. 首先,按照\(a\)从小到大把所有元素排序,保证\(a\)从小到大. 然后,对于第二维…
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数. Input 输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数.以下n行每行包含一个1到n之间的正整数,即初始排列.以下m行每行一个正整数,依次为每次删除的元素. Output 输出包含m行…
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 思路: 可以将这道题看成倒着插入,这样就可以转化成求逆序对数,用CDQ分治降维,正反用树状数组求两遍逆序对就好了. 这道题还可以用在线的树套树或者可持久化线段树来写.. 实现代码: #include<bits/stdc++.h> using namespace std; #define ll long long ; struct node{ int t,x,y; int kind,…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们直接按照从小到大排序就可以了,然后就开始处理第二维,第二维的话我们通过cdq来维护,然后第三维通过树状数组维护就可以了. 刚开始做CDQ的问题,个人觉得CDQ处理的就是把一整个大的问题转换成多个子问题进行求解,然后很重要的一个的地方就是解决前面一个子问题对后面的问题的影响. AC代码: #inclu…
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[j]<=minv[i]&&maxv[j]<=a[i])//序列只会变换一次 dp[i]=max{dp[j]+1}; 转移要满足两个条件:\(a[j]<=minv[i]\ \&\&\ maxv[j]<=a[i]\) 一个二维偏序问题,CDQ.树套树都可以.…
题目链接 传送门 思路 这个题在\(BZOJ\)上有个二维平面的版本(\(BZOJ2716\)天使玩偶),不过是权限题因此就不附带链接了,我也只是在算法进阶指南上看到过,那个题的写法是\(CDQ\),然后比赛开始半个小时我就开始写\(CDQ\),\(T\)了之后冷静分析发现复杂度我少算了个\(log\),\(CDQ\)写这题的复杂度是\(nlog^3(n)\),然后就没思路了. 赛后看\(qls\)说用三维\(bit\)可以过后试了一下\(T\)了,然后发现\(qls\)的代码当时跑了\(937…
BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. 记\(s_i\)表示前缀和(\(s_0\)=0).假设当前是第\(k\)位,我们要统计区间和在第\(k\)位为\(1\)的区间有多少个(或是奇偶性). 枚举区间右端点\(i\),然后我们要统计有多少个\(s_i-s_j\)在第\(k\)位为\(1\). 当\(s_i\)第\(k\)位为\(1\)时:…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f . 但有重复,所以再开一个树状数组 g 记录上一层重心的含自己的那棵子树里各种距离的点值和. 查询的时候如果上一层的重心有贡献,就加上它的 f 的对应范围,再减去这一层的 g 的对应范围.这两个范围是一样的,因为这一层的 g 也是相对上一层重心的距离. 修改的时候枚举每层,改一下这一层的 f 和下一…
题目大意:略 洛谷传送门 这道题在洛谷上数据比较强 貌似这个题比较常见的写法是树状数组套主席树,动态修改 我写的是整体二分 一开始的序列全都视为插入 对于修改操作,把它拆分成插入和删除两个操作 像$CDQ$分治一样,用结构体记录操作的位置,修改的权值等 假设为需要处理的询问分配了一个答案$mid$ 查询区间第$K$小,我们只需要查询区间内权值为$[l,mid]$的数有几个 每次插入/删除,都看这次操作修改的权值是否$\in[l,mid]$ 如果是,说明这个它对答案有贡献,在它在原序列的位置上$+…
A.Laptop 链接:https://ac.nowcoder.com/acm/contest/16/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷. 但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩. 拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔…
3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status][Discuss] Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. Input 输入包含多组数据.    输入的第一行一个整数Q表示测试点内的数据…
1452: [JSOI2009]Count Description Input Output Sample Input Sample Output 1 2 HINT Source 题解:设定C[101][N][N] 树状数组上价值为val的lowbit数组 //meek ///#include<bits/stdc++.h> #include <iostream> #include <cstdio> #include <cmath> #include <…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1452 题意:给出一个数字矩阵(矩阵中任何时候的数字均为[1,100]),两种操作:(1)修改某个位置的数字:(2)求某个子矩阵中某个数字的个数. 思路:二维树状数组的操作看起来跟一维的差不多,只是循环改为两重而已.主要操作有:(1)增加某个位置的值:(2)询问[1,1,x,y]子矩阵的和.利用(2)操作以及区间的减法操作我们能求出任意一个子矩阵的数字和.这道题用a[i][x][y]来记…
1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析:NIM游戏这有介绍. 题目简单描述:修改节点权值,询问路径异或和. 这个不就是dfs序维护树状数组吗? 以下借用niuox学长的一幅dfs序的图 所以答案就是ask(st[x]) ^ ask(st[y]) ^ a[lca(x,y)] (lca(x,y)节点到根节点路径上所有的点值异或两次后值为0,所…
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1012 题意:维护一个数列,开始时没有数值,之后会有两种操作, Q L :查询数列末k位的最大值: A n:上一次查询的结果加上n添加到数列的末尾:第一次添加时,认为t = 0; Sample Input 5 100 A 96 Q 1 A 97 Q 1 Q 2 Sample Output 96 93 96 思路:保留输入的原值和用树状数组处理过的mx[i];其中mx[i]所管辖的范…
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Status] Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. Input 第一行N,M接下来M行,每行形如1 a b c或2 a b…
标题效果:一些珠子项链.珠具有不同的颜色.我们问了很多次有多少种不同的颜色有过一段范围. 思考:这个问题让我学会聪明的离线实践.按左端点排序问题.加工出来的位置每种颜色首次出现.每一种颜色的下一次出现的位置.然后,1至cnt周期,这里有一个问题的左端点是当前节点,就处理他的答案.方法是前缀合,能够用树状数组.然后把这个颜色的下一个出现的位置+1. 这样做就避免了一种颜色在询问中被处理两次. CODE: #include <cstdio> #include <cstring> #in…
1棵树的话, 点分治+你喜欢的数据结构(树状数组/线段树/平衡树)就可以秒掉, O(N log^2 N). 假如是环套树, 先去掉环上1条边, 然后O(N log^2 N)处理树(同上); 然后再O(N log N)计算经过删掉边的路径数(在环上扫一遍, 数据结构维护). ------------------------------------------------------------------------- #include<cstdio> #include<cctype>…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1103 [题目大意] 给出一棵树,每条边的经过代价为1,现在告诉你有些路不需要代价了, 以A x y形式给出,表示x到y的路不再需要代价,同时还有查询操作W x, 查询1到x的路径需要多少代价. [题解] 我们对树做一遍dfs,保存得到的dfs序,我们发现如果对dfs序列进行操作, 对同一个点在进入位置设置1,出点位置设置-1, 那么查询1到x的代价就是dfs序到x入点位置的前缀和.…
题解:首先,单点修改求区间和可以用树状数组实现,因为开平方很耗时间,所以在这个方面可以优化,我们知道,开平方开几次之后数字就会等于1 ,所以,用数组记录下一个应该开的数,每次直接跳到下一个不是1的数字进行开平方,至于这个数组,可以用并查集维护. #include <cstdio> #include <cmath> #include <iostream> using namespace std; typedef long long LL; LL c[100005]; in…
http://www.lydsy.com/JudgeOnline/problem.php?id=4765 很nice的一道题啊(可能是因为卡了n久终于做出来了 题意就是给你一棵带点权的有根树,sum(i)表示以i为根的这颗子树中所有节点的权值和.有两种操作,一种是修改某个点的权值,另一种是给出l,r,求sum(l)+sum(l+1)...+sum(r). 首先考虑一个简单的问题,如果单求其中一个sum(i),我们可以怎样做. 很明显我们画个图,我们可以看到每个点打上dfs序之后,每个sum就变成…
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=3192 题解: 首先每次一定是来回移动直到最大的到顶上. 所以我们可以将第两个堆的堆顶接起来形成一个队列. 然后相当于中间一个象征两堆分界的指针在来回移动. 用树状数组维护一下区间内删除了几个点. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; ; ll ans,n,m,tr[maxn],mx;…