vijos1859[TJOI2014]电源插排】的更多相关文章

题意:小 M 的实验室有很多电源插排.这些插排的编号从 1 到 N,由左向右排成一排.每天早晨,这些插排都是没有被使用的.每当一个学生来到实验室,他就将自己的笔记本电源插到某一个未被使用的插排上.实验室的同学们都很奇怪,他们完成这个过程是这样的:首先,他们找到还没有被使用的插排的最长区间.如果有多个区间长度相同,他们就选择最靠右的那个.然后将自己的电源插到该区间的中间.如果区间长度是偶数,他们同样选择靠右的那个.当一个同学离开实验室时,他会将自己的电源拔出来.数据保证每一个同学来到实验室时,至少…
P3968 [TJOI2014]电源插排 线段树维护最长空区间及左端点位置,这个和$nlongn$的动态最大子序和差不多,就不多解释了 $n$较大哈希优化空间 My complete code: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> using namespace std; typedef long lo…
传送门 网上大部分题解都写得是动态开点线段树,然而像\(MiEcoku\)这么懒惰的显然不会去写线段树... \(\color{green}{solution}\) 我们考虑来点骚操作. 线段树维护的是区间最长连续空段,那么我们能不能单独把空的区间提出来呢?这样就可以 不用线段树了. 对于连续的一段空区间,我们可以用一个\(set\)去维护. 那么空区间的问题解决了,现在怎么求区间内有多少个插排被使用呢? 这...如果没有同学离开,那么随便用一个数据结构就可以维护. 但因为我 们需要支持删除操作…
匹配 给出一个\(n(n\leq80)\)个点对\(n\)个点的带权二分图,求所有最大权匹配的交集. 先求出一个最大权匹配,然后枚举每一条匹配中的边,检验删除该边后是否还能形成最大权匹配.如果能则说明该边不在交集中,否则一定在交集中. 电源插排 一个长度为\(n(n\leq10^9)\)的插排,初始时是空的.进行\(Q(Q\leq10^5)\)次操作,操作有三种: 向整个插排上最大的空区间(相等取最右)的中间(也取右)插上一个插头\(x\). 询问区间\([L,R]\)中有几个插头. 拔出插头\…
5157: [Tjoi2014]上升子序列 题目:传送门 题解: 学一下nlogn的树状数组求最长上生子序列就ok(%爆大佬) 离散化之后,用一个数组记录一下,直接树状数组做 吐槽:妈耶...一开始不会lower_bound 的蒟蒻用手打二分离散化...结果去重了...然后屁颠屁颠的学了lower_bound(很好用!) 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath&…
嘟嘟嘟 一眼看上去像状压dp,然后越想复杂度越不对劲,最后发现和爆搜差不多,索性就写爆搜了,复杂度\(O(\)能过\()\). 别忘了填拼图和回溯的时候只动拼图中是1的部分,不要把\(n * m\)的矩形全改了. #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdlib> #inc…
题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果两个数字的大小相同,完全可以区别他们的大小,以得到更多的贡献. 考虑的 \(a\) 给定的限制,显然对于所有的相同大小的 \(a\) ,前一项 \(a_{p_1}\) 要大于后一项 \(a_{p_2}\),否则一定会产生更长的上升子序列.连边\(p_2\rightarrow p_1\)表示 \(p_…
题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献(即以它上一次出现的位置为最后一个元素的上升子序列数目)统计到答案中. 由于要包含至少两个元素,因此还需要减掉不同数的数目. 时间复杂度 $O(n\log n)$ #include <cstdio> #include <algorithm> #define N 100010 #defin…
传送门 \(\color{green}{solution}\) 贪心 /************************************************************** Problem: 5158 User: MiEcoku Language: C++ Result: Accepted Time:420 ms Memory:5980 kb ****************************************************************/…
这本质上是一个\(dp\) 如果没有"两个上升子序列相同,那么只需要计算一次"这一个性质,那么就很好做了,我们用\(dp[i]\)表示以\(i\)结尾的上升子序列个数,那么就有\(dp[i]=\sum_{j=1}^{i-1}dp[j]\) 这个暴力转移是\(O(n^2)\)的,我们这里可以直接用树状数组来优化,于是就变成了\(O(nlogn)\) 同时由于数字可能非常大,所以需要离散化 之后再来考虑一下如何去重 首先重复的情况肯定是来自于一个之前已经出现过的数,而这个出现的数又将所有之…