26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道和一般的分治的不同是左子问题可以用来解决右边的子问题. 今天下午YY了一个离线的分治做法,也不知道叫不叫cdq. Analysis: 对于每一个数字,构成逆序对除了val大小还和被删除的时间del有关,这实际上是一个三维偏序的问题. 一个元素是一个三元组e(pos,val,del),e1和e2对答案…
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3141 题意 一个1到n的排列,每次随机删除一个,问删除前的逆序数 思路 综合考虑,对每个数点,令value为值,pos为位置,time为出现时间(总时间-消失时间),明显是统计value1 > value2, pos1 < pos2, time1 < time2的个…
``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3141 Description You are given a permutation f1,2,3,. . . ,ng. Remove m of them…
题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离散. 首先进行分治,分治的同时归并排序完成离散并计算保存出每个元素和其他元素构成的逆序对iv[i].(据说这叫归并树 初始值将所有iv求和,一个对被算了两次所以除以二. 每次删除元素val就减去val对应的逆序对. 减去iv[val],但是多减去了和之前删掉元素构成的逆序对(这些逆序对已经算过一次)…
[题目链接] UVA11990 [题目大意] 给出一个数列,每次删去一个数,求一个数删去之前整个数列的逆序对数. [题解] 一开始可以用树状数组统计出现的逆序对数量 对于每个删去的数,我们可以用线段树求出它在原序列中的逆序对贡献 在线段树的每个区间有序化数据,就可以二分查找出这个数在每个区间的位置, 这样就处理出了划分出的区间的贡献,先用答案减去这一部分 接下来考虑已经删去部分的容斥,我们发现只要对删去部分再做一次类似的操作, 将这一部分跟当前删去数求一次贡献就是刚才多减去的部分,将这部分的答案…
早期作品,不喜轻喷. LG传送门 序列分治板子题. 切这道题用了好长时间,所以想发篇题解作为纪念 . 首先,我们认真观察题目数据(面向数据做题是个好习惯),发现题目的\(n\)竟然只有\(35\),我们顿时感到打暴力的机会来了: \(2^n\)枚举? 是个好办法. 只可惜我们发现\(2^{35}=34359738368\),并不能过掉所有数据点,于是考虑优化. 分治 考虑把这\(n\)个数分成两组(当然要尽量平均),对两组数据分别实施暴力,并把结果存起来(事实上是可以存下来的:\(2^{18}=…
题目: 题目描述 Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯.在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界.保卫这里的平衡与和谐.在那个时代,平衡是个梦想.因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破.KB决定求助于你,帮助他完成这个梦想. 一串数列即表示一个世界的状态. 平衡是指这串数列以升序排列,而从一串无序数列到有序数列需要通过交换数列中的元素来实现.KB的能量只能交换相邻两个数字.他想知道他最少需要交换几次就能使…
UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这次转移会给其他的元素带来的代价,也就是转移前已经出现但还没结束的元素都会代价+1   预处理每种颜色在两个序列中出现的位置bg[i][0/1]和ed[i][0/1], 计算f[i][j]时同时计算w[i][j]为(i,j)这个状态已经出现还没结束的个数 注意bg要先初始化为INF,计算w: if(b…
Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3767 Description 给你n个数,m次操作 Q x y 询问[x+1,y]有多少个不同的数 M x y 将第x+1个数修改成y Input n…
UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这次转移会给其他的元素带来的代价,也就是转移前已经出现但还没结束的元素都会代价+1   预处理每种颜色在两个序列中出现的位置bg[i][0/1]和ed[i][0/1], 计算f[i][j]时同时计算w[i][j]为(i,j)这个状态已经出现还没结束的个数 注意bg要先初始化为INF,计算w: if(b…
题目链接:https://uva.onlinejudge.org/external/16/1626.pdf 题意: 给定一个字符串,看是否括号匹配,不匹配加括号,加最少的括号使得匹配.输出该结果. 分析: 解题思路和切木棍很类似.d(i,j) i ~ j 要加最少多少括号,他一定等于: 分两种情况,一:[s'],(s'),d(i,j) = d(i+1,j-1):二: d(i,j) = min(d(i,k),d(k+1,j)); 注意: 输入有空行. #include <bits/stdc++.h…
题目链接 题意:给n个数,求交换k次相邻的数之后的最小的逆序数对. 用分治的方法,以前在poj上做过这种题,昨天比赛的时候忘了.... 下面的归并排序还是以前的模板. #include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <cstdlib> #include <algorithm> #define LL __int64 +…
求满足GCD(a,b) = a XOR b; 其中1<=b <=a<=n. 首先做这道题需要知道几个定理: 异或:a XOR b = c 那么 a XOR c = b; 那么我们令GCD(a,b)= c; 这样 a 是  c  倍数.我们可以通过遍历c , 然后通过筛法,把c的倍数晒出当作a.求b如何求呢? 书上提供一种方法是利用a XOR c=b 用 gcd(a,b)=c 验证.但是这个方法是超时的,gcd是logn 级别的 总的时间复杂度,n*(logn)^2.这是我们不能接受的.…
Dynamic len [题目链接]Dynamic len [题目类型]带修莫队 &题解: 莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字. 之后循环离线的时候,先暴力时间指针(oi大佬说的),之后l,和r就随便了.还有要会用vis数组. [时间复杂度]\(O(n^{\frac{5}{3}})\) &代码: #include <cstdio> #include <bitset> #include <iostream> #includ…
题意:询问区间唯一元素个数,单点修改. 分析: 借助Unique snowflakes, Can you answer these queries II的思想,唯一性可以借助元素上一次出现的位置来判断. 对于询问(x,y),只要回答[x,y)区间内,上一次出现位置prv[i] < x的元素数量即可. 对于修改来说,如果原来的a[x]的后继元素存在,则要修改后继的前驱. a[x]修改成y以后,找到x位置前的y出现位置,作为x位置的前驱,并修改x位置以后下一个y的前驱. 寻找前驱后继可以用一个set…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个指针,表示第一个更新左边造成的最小值/最大值的位置. 两个位置共同的左边可以公式算长度,用左边的最值算:两个位置共同的右边可以预处理,处理出 算上长度(相对mid的)的最值乘积求和 与 不算长度的最值乘积求和(都是前缀),把前者加到答案里,后者乘上左边到mid的长度加到答案里即可:两个位置夹着的位置…
题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列式为non-boring.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是否无聊. 分析: 1.记录下每个元素左边和右边最近的与它值相同的元素的位置. 2.如果某个元素在某一序列中只出现过一次,那这个序列中所有包含该元素的子序列都是non-boring,因此只需要研究在这个序列中以该元素为分界线,其左边和右边的子序列是否无聊即可. 3.因为如果单独从左扫或从右扫,最坏情况可能是在…
原题 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 求长度分别为1-n的区间的最大价值. 保证数据随机 因为保证数据随机,所以我们可以考虑用区间的最大值把这个区间分为两个部分,这样答案的贡献就有两种情况. 1.在同一个区间里 2.跨过最大值,在两个区间里 情况1通过递归就变成了情况2,而情况二我们通过two-points来完成.记录l指针和r指针,因为所求为最大值,所以选取l和r指针较大的内个加入,并每次更新答案…
Code: #include<bits/stdc++.h> #define ll long long #define mod 998244353 #define maxn 400000 #define N 100005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; ll qpow(ll base,ll k) { ll tmp=1; while(k) { if(k&1…
Halton序列 在统计学中,Halton序列是用于生成空间中的点的序列,如Monte Carlo模拟的数值方法,虽然这些序列是确定性的,但它们的差异性很低,也就是说,在许多方面看起来是随机的.它们在1960年首次提出,是准随机数列的一个例子.它们概括了一维Van der Corput序列 用于生成\(R^2\)中(0,1)x(0,1)点的Halton序列的例子 Halton数列是以质数为基的确定性方法构造的.举个简单的例子,让我们把Halton序列的一个维度基于2,另一个基于3.为了生成2的序…
几周前搞了搞--有点时间简要整理一下,诸多不足之处还请指出. 有哪些需要理解的地方? 点值表示:对于多项式 \(A(x)\),把 \(n\) 个不同的 \(x\) 代入,会得出 \(n\) 个不同的 \(y\),在坐标系内就是 \(n\) 个不同的点,那么这 \(n\) 个点唯一确定该多项式 为什么引入单位根 \(\omega\) 作为变量 \(x\):若代入一些 \(x\) ,使每个 \(x\) 的若干次方等于 \(1\),就不用做全部的次方运算了 单位根的性质:于是可以分治实现 \(FFT\…
$A$类数据:直接输出$B[l]$,$O(n+m)$.$B$类数据:ST表求区间最小值,$O(n\log n+m)$.$C$类数据:可持久线段树求区间$k$小值,$O((n+m)\log n)$.剩下的数据先用可持久线段树求出$a,b$的实际值,转化为矩形内$B$值的询问.$D$类数据:即求矩形$B$最小值,对序列分治,对于序列$[l,r]$,用扫描线+线段树处理所有经过$mid$的询问,$O(n\log^2n+m\log n)$.$E,F$类数据:即求矩形$B$第$k$小值,可持久化线段树套权…
根号算法 分块 数列分块入门九题(hzwer) 入门题1,2,3,4,5,7 问题:给一段区间打上标记后单点查询 解法:主要是每块维护一些标记,计算答案等,此类分块较为简单 注意:块大小一般为\(\sqrt n\) 复杂度:\(O(n\sqrt n)\) 入门题6 问题:每次朝数列中间插入一个元素,查询第k个元素是什么 解法:块大小超过一定值后暴力重构!采用链表实现 复杂度:\(O(n\sqrt n)\) 入门题8 问题:每次询问一个区间内为\(c​\)的元素个数,并把整个区间改为\(c​\)…
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 (题目链接) 题意 一棵树,求最远的两黑点之间的距离,每次可以将黑点染白或者将白点染黑. Solution 动态树分治,%%%重庆省选AK爷. 点分治的过程是对树块找重心之后分成多个小树块,降低规模分别处理的过程,把链的信息收到其中“最高重心”上,从所有的重心处像分治中的不同子树索取到重心的链,就可以覆盖所有链的信息.动态点分治就像把序列分治变成线段树一样,在分治的架子上加了信息维护,实现树…
Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20309   Accepted: 8524 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. Input The input contains exactly one test cas…
原题: 题意: 给你一个长度为N的正整数组A,对于这个数组的所有子区间,若长度小于k则不管它,若长度大于等于k则取第k大放入数组B 问你B中第M大的数是谁 一眼序列分治,然而没思路 数据结构?能想到从大到小排序,然后小于第i个数的都视为1,用数据结构维护第i个数在多少个区间是第k大 然后就没有然后了…… 序列分治和数据结构自闭了两个小时,最后才想起来试试别的思路 比如DP或二分什么的 终于灵稽一动 答案满足二分单调性 二分的答案m越大,[m+1,n]中的数作为第k大的区间的总数量就越大 那么二分…
BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就不设密码了. 首先,手玩样例可以发现满足条件的区间是不满足单调性的,所以二分左右端点.单调队列.双指针什么的就不可能了. 然后不会了... 不难看出,一段满足要求的区间[L,R],符合\(val_{max}-val_{min}=R-L\),val是数值. 50pts暴力:对val建st表,每次询问枚…
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的时间判断出一个元素在一个区间内是否唯一. 每次从大的序列中找一个唯一元素,包含这个元素的就不用判断了,那么以这个元素为分界线,在分别判断两边的序列. 如果只从一遍找的话,最坏的情况是唯一元素在另一头T(n) = T(n-1)+O(n) >= O(n^2)的. 所以应该从两边开始找,T(n) = 2T…
CDQ分治入门 简介 CDQ分治是一种特别的分治方法,它由CDQ(陈丹琦)神犇于09国家集训队作业中首次提出,因此得名.CDQ分治属于分治的一种.它一般只能处理非强制在线的问题,除此之外这个算法作为某些复杂算法的替代品几乎是没有缺点的. 深入 对于一个数据结构题而言(或者需要运用数据结构的地方),我们无非就是做两件操作,一是修改,二是查询. 对于修改而言,有插入,删除,变更(其实等价于删除再插入)这几种方式. 那么查询的本质是什么呢?我们思考所遇到过的数据结构题,可以发现查询实际上就在做一件事情…
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B堆:每个节点一个,存所有儿子的堆的堆顶.特别地,如果该节点关灯,那么将加入一个0:如果没有元素,堆顶应返回负数. A堆:全局一个,存所有B堆的最大值和最小值之和.特别地,如果B堆不足两个,返回负数. 这样,我们一开始需要关闭所有的等,即对所有点调用一次turn_off.由于堆顶返回的是负数,删除时找…