题面

loj

分析

这道题非常妙啊

对于可保留区间[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颜色的更多相关文章

  1. JXOI2017颜色 解题报告

    JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...

  2. [JXOI2017]颜色 线段树求点对贡献

    [JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...

  3. [BZOJ5011][JXOI2017]颜色

    5011: [Jx2017]颜色 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 84  Solved: 46[Submit][Status][Disc ...

  4. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

  5. BZOJ5011 JXOI2017颜色(主席树)

    相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量.这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧.那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区 ...

  6. 【题解】JXOI2017颜色

    一眼线段树...显然,我们可以考虑最后所留下的区间,那显然这个区间中应当不能存在任何与区间外相同的颜色.这里的转化也是很常用的,我们用 \(nxt[i]\) 表示与 \(i\) 颜色相同的下一个位置在 ...

  7. [JXOI2017]颜色 线段树扫描线 + 单调栈

    ---题面--- 题解: 首先题目要求删除一些颜色,换个说法就是要求保留一些颜色,那么观察到,如果我们设ll[i]和rr[i]分别表示颜色i出现的最左边的那个点和最右边的那个点,那么题目就是在要求我们 ...

  8. BZOJ5011 & 洛谷4065 & LOJ2275:[JXOI2017]颜色——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5011 https://www.luogu.org/problemnew/show/P4065 ht ...

  9. BZOJ5011 [JXOI2017]颜色 【线段树 + 主席树】

    题目链接 BZOJ5011 题解 一定只有我这种智障会用这么奇怪的方法做这道题.. 由题我们知道最后剩余的一定是一个区间,而且区间内的颜色不存在于区间外 所以我们的目的就是为了找到这样的区间的数量 区 ...

随机推荐

  1. Python—包介绍

    包(Package) 当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹, . └── my_proj ├── crm #代码目录 ...

  2. iptables的增删改查

    iptables是linux系统自带的防火墙,功能强大,学习起来需要一段时间,下面是一些习iptables的时候的记录.如果iptables不熟悉的话可以用apf,是一款基于iptables的防火墙, ...

  3. Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...

  4. checkbox的使用总结,判断是否选中

    方法一: if ($("#checkbox-id").get(0).checked) { // do something } 方法二: if($('#checkbox-id').i ...

  5. java程序员一些初中级面试题(数据库部分)

    说出一些数据库优化方面的经验? 1.从JDBC编程的角度讲,用PreparedStatement一般来说比Statement性能高,因为在使用时,SQL语句被预编译并存储在PreparedStatem ...

  6. Tomcat启用GZIP压缩,提升web性能

    一.前言 最近做了个项目,遇到这么一个问题:服务器返回给客户端的json数据量太大(大概65M),在客户端加载了1分多钟才渲染完毕,费时耗流量,用户体验极其不好.后来网上搜优化的方法,就是Http压缩 ...

  7. CIFS 与 SMB 有什么区别?

    CIFS 与 SMB 有什么区别? https://www.getnas.com/2018/11/30/cifs-vs-smb/ 网络协议 一知半解 学习一下挺好的.. 记得 win2019 已经废弃 ...

  8. vue嵌套路由

    父组件  (注:to="/Flow/moban_a"这里不是文件加路径,是父组件路由+子组件路由) 路由配置

  9. fatal: HttpRequestException encountered解决方法

    最近在windows下git push提交就会弹出如下错误: 网上查了一下发现是Github 禁用了TLS v1.0 and v1.1,必须更新Windows的git凭证管理器,才行. https:/ ...

  10. druid 连接Oracle时出现的错误

    转博主https://blog.csdn.net/jiangyu1013/article/details/70237550#commentsedit mysql 更新 SQL 语句 无错误 批量 报错 ...