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 题解 一定只有我这种智障会用这么奇怪的方法做这道题.. 由题我们知道最后剩余的一定是一个区间,而且区间内的颜色不存在于区间外 所以我们的目的就是为了找到这样的区间的数量 区 ...
随机推荐
- p86商空间也是Banach空间
1.为什么要引入Zk? 2.为什么这个等式成立,和为什么要引入uk? 3.为什么为什么等于0? 属于M,则商空间是0元,p128最上面的第二个笔记
- 【问题解决方案】之 Word 公式编辑器 使用小tips
输入空格:shift+Ctrl+space 换行:直接回车.之后在上方菜单栏中选择"在等号处对齐"
- 【Python3练习题 005】输入三个整数x,y,z,请把这三个数由小到大输出
import re x, y, z = re.split(',| |,| ', input('请输入3个数字,用逗号或空格隔开:'))x, y, z = int(x), int(y), int(z) ...
- react-redux异步数据操作
import React, { Component } from 'react'; import './App.css'; import {connect} from 'react-redux'; i ...
- react单组件 渲染页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jQuery ajax解析xml文件demo
解析xml文件,然后将城市列表还原到下拉列表框中:当选择下拉列表框时,在对应的文本框中显示该城市信息. 前端代码: <!doctype html> <html> <hea ...
- 高并发之API接口限流
在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再 ...
- python学习笔记(11)--测验3: Python基础语法(下) (第7周)
斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波 ...
- 使用getopts处理输入参数
在编写shell脚本中,需要输入参数,使用过程中,getopts更加方便.可以很好的处理用户输入的参数和参数值. 参加如下一段脚本: #!/bin/bash while getopts ": ...
- comparable和comparator
Comparable Comparable可以认为是一个内部比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,在compareTo方法中指定具体的比较方法. comp ...