Luogu 2839 [国家集训队]middle】的更多相关文章

感觉这题挺好的. 首先对于中位数最大有一个很经典的处理方法就是二分,每次二分一个数组中的下标$mid$,然后我们把$mid$代回到原来的数组中检查,如果一个数$a_{i} \geq mid$,那么就把$s_{i}$记为$1$,否则把$s_{i}$记为$-1$,然后对$s_{i}$跑一遍前缀和,观察是否有一个区间的和不小于$0$. 读清楚题意之后发现在这题中,如果要对一个长度为偶数(记为$n$)的序列求中位数,那么答案为排好序的数组中下标为$n / 2 + 1$的元素.(下标从$1$开始),不同的…
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数. 其中a<b<c<d.位置也从0开始标号.我会使用一些方式强制你在线. Input 第一行序列长度n.接下来n行按顺序给出a中的数. 接下来一行Q.然后Q行每行a,b,c,d,我们令上个询问的答案是x(如果这是第一个询问则x=0). 令数组…
题目 首先我们考虑解决中位数一类问题的常用手段:二分\(mid\),将大于等于它的设为\(1\),小于它的设为\(−1\),判断区间和是否\(\ge0\). 对于询问\(a,b,c,d\),二分完\(mid\)后,我们需要判断\([a,b]\)的最大后缀和\(+[c,d]\)的最大前缀和\(+(b,c)\)的和是否\(\ge0\). 因为中位数一定是序列中出现过的数,所以我们可以排序后二分第\(mid\)大. 考虑使用主席树维护区间和区间最大后缀和区间最大前缀和. 最开始先把所有数设为\(1\)…
[国家集训队]middle 主席树的想法感觉挺妙的,但是这题数据范围这么小,直接分块草过去不就好了吗 二分是要二分的,把\(<x\)置\(-1\),\(\ge x\)的置\(1\),于是我们需要取一个\(\ge 0\)的区间 对询问\(a,b,c,d\),其中\([b,c]\)是必选的,\([a,b-1]\)取后缀最大和,\([c+1,d]\)取前缀最大和 我们直接分块,对每个块的每个答案\(x\)维护一个块内和,前缀最大和和后缀最大和就可以了 然后询问的时候暴力跳块就好了 复杂度\(O(n\s…
[国家集训队]middle 题目 解法 开\(n\)颗线段树,将第\(i\)颗线段树中大于等于第\(i\)小的数权值赋为1,其他的则为-1,对于每个区间维护一个区间和,最大前缀和,最大后缀和. 然后二分答案,查询二分到的答案对应线段树. \(设s=[a,b-1]的最大后缀和+[b,c]的区间和+[c+1,d]的最大前缀和\) 若\(s\geq 0\),则答案可能更大,否则答案必须变小,仔细想想为什么. 这样不断二分即可. 考虑到开不下那么多线段树,而若排序后相邻线段树维护的序列只有一个元素不同,…
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9')c = getchar(); while(c <= '9' && c >= '0') x = x * 10 +…
P2839 [国家集训队]middle 好妙的题啊,,,, 首先二分一个答案k,把数列里>=k的数置为1,=0就是k>=中位数,<0就是k<中位数 数列的最大和很好求哇 左边的最大后缀+中间+右边的最大前缀 主席树搞搞 完事了 // It is made by XZZ #include<cstdio> #include<algorithm> #define il inline #define rg register #define vd void #defi…
题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等权边则更新出 > 和 = 最小值等价,那么不会更新到 = 情况, 因为等价,那么处理时只需看做把等价的黑白两边交换即可 需要每次直接减去 增量 * need 的价值 代码 #include<cstdio> #include<algorithm> const int maxn =…
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 100100 #define inf 1e9+7 using namespace std; IL int gi(){ RG int data = 0 , m = 1; RG char ch = 0; while(ch != '-' && (ch<'0' || ch > '9')) c…
[LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\(0\),则答案可以更大,反之亦然. 对于这个题,我们只要维护出\([b+1,c-1]\)之间二分答案后的和,\([a,b]\)的最大右段和,\([c,d]\)的最大左段和,判断这三项加起来是否大于零即可. 我们维护这三项和的话,按照权值为前缀,建主席树就行了. 代码 #include <iostre…