JXOI2017颜色
题面
分析
这道题非常妙啊
对于可保留区间[l, r]
枚举右端点r
考虑l的取值范围有两重约数
记颜色i出现的最右侧位置是\(max_i\) 最左侧位置是\(min_i\)
r前最后一次出现的位置是pre[i]
1.若max[i] > r 则 l > pre[i]
2.若max[i] <= r 则 l 不能取(min[i], max[i] ]
限制一维护一下单调栈就好啦 限制二线段树维护一下
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 3e5 + 5;
const int inf = 0x3f3f3f3f;
int n, a[N], mx[N], mn[N];
long long ans;
int stk[N], top;
struct Seg{
int w[N << 2]; bool flag[N << 2];
void update(int rt){
w[rt] = w[rt << 1] + w[rt << 1 | 1];
}
void pushdown(int rt, int l, int r){
if(!flag[rt]) return ;
int mid = l + ((r - l) >> 1);
w[rt << 1] = mid - l + 1;
w[rt << 1 | 1] = r - mid;
flag[rt << 1] = flag[rt << 1 | 1] = 1;
flag[rt] = 0;
}
void clr(int rt, int l, int r){
w[rt] = flag[rt] = 0;
if(l == r) return ;
int mid = l + ((r - l) >> 1);
clr(rt << 1, l, mid);
clr(rt << 1 | 1, mid + 1, r);
}
void mdf(int rt, int l, int r, int x, int y){
if(l > r) return ;
if(l >= x && r <= y){
w[rt] = r - l + 1; flag[rt] = 1;
return ;
}
pushdown(rt, l, r);
int mid = l + ((r - l) >> 1);
if(x <= mid) mdf(rt << 1, l, mid, x, y);
if(y > mid) mdf(rt << 1 | 1, mid + 1, r, x, y);
update(rt);
}
int qry(int rt, int l, int r, int x, int y){
if(l > r) return 0;
if(l >= x && r <= y) return w[rt];
pushdown(rt, l, r);
int mid = l + ((r - l) >> 1), ret = 0;
if(x <= mid) ret += qry(rt << 1, l, mid, x, y);
if(y > mid) ret += qry(rt << 1 | 1, mid + 1, r, x, y);
return ret;
}
}seg;
int main(){
int T; scanf("%d", &T);
while(T--){
scanf("%d", &n);
seg.clr(1, 1, n);
for(int i = 0; i <= n; ++i) mx[i] = 0, mn[i] = inf;
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
mx[a[i]] = max(mx[a[i]], i);
mn[a[i]] = min(mn[a[i]], i);
}
ans = 0;
top = 0;
mn[0] = mx[0] = 0;
for(int r = 1; r <= n; ++r){
if(r == mx[a[r]] && r > mn[a[r]]){
seg.mdf(1, 1, n, mn[a[r]] + 1, r);
// printf("%d %d\n", mn[a[r]] + 1, r);
}
stk[++top] = r;
while(top && mx[a[stk[top]]] <= r) --top;
//这里维护颜色调了好久 蠢了蠢了 注意那个pre不是单调递增的哦
ans += (r - stk[top] - seg.qry(1, 1, n, stk[top] + 1, r));
//printf("ans = %d %d %d %d %d %d\n", ans, r, stk[top], stk[top] + 1, r, seg.qry(1, 1, n, stk[top] + 1, r));
}
printf("%lld\n", ans);
}
return 0;
}
JXOI2017颜色的更多相关文章
- JXOI2017颜色 解题报告
JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...
- [JXOI2017]颜色 线段树求点对贡献
[JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...
- [BZOJ5011][JXOI2017]颜色
5011: [Jx2017]颜色 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 84 Solved: 46[Submit][Status][Disc ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- BZOJ5011 JXOI2017颜色(主席树)
相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量.这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧.那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区 ...
- 【题解】JXOI2017颜色
一眼线段树...显然,我们可以考虑最后所留下的区间,那显然这个区间中应当不能存在任何与区间外相同的颜色.这里的转化也是很常用的,我们用 \(nxt[i]\) 表示与 \(i\) 颜色相同的下一个位置在 ...
- [JXOI2017]颜色 线段树扫描线 + 单调栈
---题面--- 题解: 首先题目要求删除一些颜色,换个说法就是要求保留一些颜色,那么观察到,如果我们设ll[i]和rr[i]分别表示颜色i出现的最左边的那个点和最右边的那个点,那么题目就是在要求我们 ...
- BZOJ5011 & 洛谷4065 & LOJ2275:[JXOI2017]颜色——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5011 https://www.luogu.org/problemnew/show/P4065 ht ...
- BZOJ5011 [JXOI2017]颜色 【线段树 + 主席树】
题目链接 BZOJ5011 题解 一定只有我这种智障会用这么奇怪的方法做这道题.. 由题我们知道最后剩余的一定是一个区间,而且区间内的颜色不存在于区间外 所以我们的目的就是为了找到这样的区间的数量 区 ...
随机推荐
- matplotlib 入门之Sample plots in Matplotlib
文章目录 Line Plot One figure, a set of subplots Image 展示图片 展示二元正态分布 A sample image Interpolating images ...
- 设计模式——MVC MVP MVVM
了解到Vue是MVVM前端框架, 中午就研究了一下MVVM,但要从MVC开始说起: M(Model):模型,提供数据: V(View):视图,负责显示: C(Controller):控制器,负责逻辑处 ...
- 黑客帝国效果赏析(包含ES6的语法)
首先,看看效果吧. 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- JDK8-新特性-附demo
import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; impor ...
- form-data、x-www-form-urlencoded的区别
form-data可以上传文件格式的,比如mp3.jpg这些:x-www-form-urlencoded不能选择格式文件,只能传key-value这种string格式的内容.
- mysql 5.7:show_compatibility_56
show_compatibility_56 - rudy gao - CSDN博客 https://blog.csdn.net/rudygao/article/details/50403107 [SO ...
- StackWalk64
#include <Windows.h> #define PULONG_PTR ULONG** #define PULONG ULONG* #define ULONG_PTR U ...
- webdriver原理、协议
1.webdriver client的原理是什么? 当测试脚本启动firefox的时候,selenium-webdriver 会首先在新线程中启动firefox浏览器.如果测试脚本指定了firefox ...
- vsconsole
一.安装 npm install vconsole 二. if (process.env.NODE_ENV === `development`) { const { logger } = requir ...
- Azure系列2.1.6 —— BlobProperties
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...