[BZOJ5011][JXOI2017]颜色
5011: [Jx2017]颜色
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 84 Solved: 46
[Submit][Status][Discuss]Description
可怜有一个长度为n的正整数序列Ai,其中相同的正整数代表着相同的颜色。现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去。删除颜色i可以定义为把所有满足Aj=i的位置j都从序列中删去。然而有些时候删去之后,整个序列变成了好几段,可怜不喜欢这样,于是她想要知道有多少种删去颜色的方案使得最后剩下来的序列非空且连续。例如颜色序列{1,2,3,4,5},删除颜色3后序列变成了{1,2}和{4,5}两段,不满足条件。而删除颜色1后序列变成了{2,3,4,5},满足条件。两个方案不同当且仅当至少存在一个颜色i只在其中一个方案中被删去。。Input
第一行输入一个整数T表示数据组数。每组数据第一行输入一个整数n表示数列长度。第二行输入n个整数描述颜色序列。1 ≤ T, ∑ n ≤ 3 × 10^5, 1 ≤ Ai ≤ nOutput
对于每组数据输出一个整数表示答案Sample Input
1
5
1 3 2 4 3Sample Output
6
//满足条件的删颜色方案有 {1}, {1, 3}, {1, 2, 3}, {1, 3, 4}, {2, 3, 4}, ∅HINT
为试题的完整性,下面给出Jxoi2017题面及前两题数据www.lydsy.com/JudgeOnline/upload/jxoi2017.rar
Source
一道不会做的线段树模板题。
https://www.luogu.org/problemnew/solution/P4065
首先发现每个删除方案和结果区间一一对应,所以只要统计合法区间总数即可。
枚举区间右端点i,这时不合法的左端点区间有且仅有:
1.$[1,j]\quad Max_{c_j}>i$
2.$(Min_{c_j},Max_{c_j}]\quad Max_{c_j}\leqslant i$
这样我们先将所有[1,i]全部+1,然后每次撤销不再禁用的点,加上新增的禁用点,然后查询[1,i]内所有不禁用的点即可。
问题是,上哪找支持区间+1,区间-1,查询区间内0的个数的数据结构呢?线段树看上去是无法完成的。
那么我们用栈代替这个过程,这样就只需要支持区间标记和查询区间内标记的数的个数即可,于是这题就变成了线段树模板题。
#include<cstdio>
#include<algorithm>
#define ls (x<<1)
#define rs ((x<<1)|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,inf=0x3f3f3f3f;
ll res;
int n,T,top,mn[N],mx[N],cnt,c[N],v[N<<],cov[N<<];
struct P{ int c,pos; }stk[N]; void push(int x,int L,int R){
if (!cov[x]) return;
int mid=(L+R)>>;
v[ls]=mid-L+; v[rs]=R-mid;
cov[ls]=; cov[rs]=;
} void add(int x,int L,int R,int l,int r){
if (L==l && r==R) { v[x]=r-l+; cov[x]=; return; }
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) add(lson,l,r);
else if (l>mid) add(rson,l,r);
else add(lson,l,mid),add(rson,mid+,r);
v[x]=v[ls]+v[rs];
} int que(int x,int L,int R,int l,int r){
if (L==l && r==R) return v[x];
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) return que(lson,l,r);
else if (l>mid) return que(rson,l,r);
else return que(lson,l,mid)+que(rson,mid+,r);
} int main(){
freopen("bzoj5011.in","r",stdin);
freopen("bzoj5011.out","w",stdout);
for (scanf("%d",&T); T--; ){
scanf("%d",&n); res=; top=;
rep(i,,n) scanf("%d",&c[i]);
rep(i,,n) mn[i]=inf,mx[i]=;
rep(i,,n<<) cov[i]=,v[i]=;
rep(i,,n) mn[c[i]]=min(mn[c[i]],i),mx[c[i]]=max(mx[c[i]],i);
rep(i,,n){
if (i==mx[c[i]] && mx[c[i]]!=mn[c[i]]) add(,,n,mn[c[i]]+,mx[c[i]]);
else stk[++top]=(P){c[i],i};
while (top && mx[stk[top].c]<=i) top--;
int l=((!top)?:stk[top].pos);
if (i!=l) res+=i-l-que(,,n,l+,i);
}
printf("%lld\n",res);
}
return ;
}
[BZOJ5011][JXOI2017]颜色的更多相关文章
- BZOJ5011 JXOI2017颜色(主席树)
相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量.这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧.那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区 ...
- BZOJ5011 [JXOI2017]颜色 【线段树 + 主席树】
题目链接 BZOJ5011 题解 一定只有我这种智障会用这么奇怪的方法做这道题.. 由题我们知道最后剩余的一定是一个区间,而且区间内的颜色不存在于区间外 所以我们的目的就是为了找到这样的区间的数量 区 ...
- JXOI2017颜色 解题报告
JXOI2017颜色 首先记录每个位置上颜色在序列中上次出现的位置 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和 首先倒着扫一遍,对于当前颜 ...
- [JXOI2017]颜色 线段树求点对贡献
[JXOI2017]颜色 题目链接 https://www.luogu.org/problemnew/show/P4065 题目描述 可怜有一个长度为 n 的正整数序列 Ai,其中相同的正整数代表着相 ...
- BZOJ5011 & 洛谷4065 & LOJ2275:[JXOI2017]颜色——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5011 https://www.luogu.org/problemnew/show/P4065 ht ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- JXOI2017颜色
题面 loj 分析 这道题非常妙啊 对于可保留区间[l, r] 枚举右端点r 考虑l的取值范围有两重约数 记颜色i出现的最右侧位置是\(max_i\) 最左侧位置是\(min_i\) r前最后一次出现 ...
- bzoj5011: [Jx2017]颜色
Description 可怜有一个长度为n的正整数序列Ai,其中相同的正整数代表着相同的颜色. 现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去. 删除颜色i可以定义为把所 ...
- 【题解】JXOI2017颜色
一眼线段树...显然,我们可以考虑最后所留下的区间,那显然这个区间中应当不能存在任何与区间外相同的颜色.这里的转化也是很常用的,我们用 \(nxt[i]\) 表示与 \(i\) 颜色相同的下一个位置在 ...
随机推荐
- Shuffle Cards(牛客第三场+splay)
题目: 题意:将1~n的数进行m次操作,每次操作将第pi位到pi+si-1位的数字移到第一位,求最后的排列. 思路:现在还没不会写splay,在知道这是splay模板题后找了一波别人的模板,虽然过了, ...
- MongoDB安装配置及使用
1.安装配置:https://www.cnblogs.com/ymwangel/p/5859453.html 2.使用 from pymongo import MongoClient #连接 conn ...
- No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案
No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏 ...
- git 配置多用户
.ssh 下的 config.txt 内容 # 配置github.com Host github.com HostName github.com IdentityFile ~/.ssh/id_rsa_ ...
- postman测试express restful接口
安装express及postman var express = require('express') var app = express(); var calculation = require('. ...
- webpack版本1与版本2的若干写法区别
2.x的环境遇到类似this._init is not a function的报错. 版本1.x的写法: resolve: { extensions: ['', '.js', '.vue'] }, m ...
- linux子系统的初始化_subsys_initcall()【转】
转自:http://my.oschina.net/u/572632/blog/305492 目录[-] 概述 section的声明 注册 调用 IN BUILDING 概述 内核选项的解析完成之后,各 ...
- FIS3 大白话【一】
1.fis3可以用fis.set进行一些全局的配置,包括忽略文件.文件后缀处理类型.源码过滤等等,用fis3.get可以得到配置信息,详见: http://fis.baidu.com/fis3/doc ...
- 方便大家学习的Node.js教程(一):理解Node.js
理解Node.js 为了理解Node.js是如何工作的,首先你需要理解一些使得Javascript适用于服务器端开发的关键特性.Javascript是一门简单而又灵活的语言,这种灵活性让它能够经受住时 ...
- js获取鼠标的位置
<!doctype html><html><head><meta charset="utf-8"><title>获取鼠标 ...