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 题解 一定只有我这种智障会用这么奇怪的方法做这道题.. 由题我们知道最后剩余的一定是一个区间,而且区间内的颜色不存在于区间外 所以我们的目的就是为了找到这样的区间的数量 区 ...
随机推荐
- 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
曼哈顿距离只计算水平或垂直距离,有维度的限制.另一方面,欧氏距离可用于任何空间的距离计算问题. 因为,数据点可以存在于任何空间,欧氏距离是更可行的选择.例如:想象一下国际象棋棋盘,象或车所 做的移动是 ...
- socket流程
- Python之异常处理(执行python文件时传入参数)
使用sys模块 使用sys模块里的argv参数,用来保存参数值 import sys #sys.argv的作用是获取到运行python文件时,传入的参数 #默认如果运行python文件不传参数,arg ...
- 【kindle笔记】之 《黑客微百科》-2018-6-17
前段时间复习六级的时候,从图书馆看到一本书,然后带回来了.今天开始读.今天是2018年6月17日. 严格来讲,一本不算kindle笔记的笔记,不过广义的啃豆笔记了解一下.哈哈. 首页说到的黑客理念是: ...
- 07-nodejs中npm的使用
NPM是什么? 简单的说,npm就是JavaScript的包管理工具.类似Java语法中的maven,gradle,python中的pip. 安装 傻瓜式的安装. 第一步:打开https://node ...
- SpringMVC controller 时间 T
Spring MVC 之 处理Date类型 - carl.zhao的专栏 - CSDN博客https://blog.csdn.net/u012410733/article/details/727730 ...
- 前端开发之jQuery库
使用jquery开发的时候,如果我们不想使用自己的jquery文件,那么可以引用现成的地址.方便日常开发使用 jquery-2.0以上版本 (注!不再支持IE 6/7/8) jquery-2.0.0百 ...
- Nginx三部曲(2)性能
我们会告诉你 Nginx 如何工作及其背后的理念,还有如何优化以加快应用的性能,如何安装启动和保持运行. 这个教程有三个部分: 基本概念 —— 这部分需要去了解 Nginx 的一些指令和使用场景,继承 ...
- md5加密通过URL传给后台
首先要把你要用的md5库引入 这个技术其实挺简单的,咋们直接贴上代码(这个是项目上的) sign = hex_md5("type="+type&"userId=& ...
- JSON for-in 遍历
(代码均以js代码示例) 1.可以使用 for-in 来循环对象的属性,使用中括号([])来访问属性的值: 这中方法便于一些在不确定有属性的情况下使用. var myObj = { "nam ...