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 ≤ n

Output

对于每组数据输出一个整数表示答案

Sample Input

1
5
1 3 2 4 3

Sample Output

6
//满足条件的删颜色方案有 {1}, {1, 3}, {1, 2, 3}, {1, 3, 4}, {2, 3, 4}, ∅

HINT

为试题的完整性,下面给出Jxoi2017题面及前两题数据www.lydsy.com/JudgeOnline/upload/jxoi2017.rar

Source

[Submit][Status][Discuss]

一道不会做的线段树模板题。

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]颜色的更多相关文章

  1. BZOJ5011 JXOI2017颜色(主席树)

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

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

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

  3. JXOI2017颜色 解题报告

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

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

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

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

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

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

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

  7. JXOI2017颜色

    题面 loj 分析 这道题非常妙啊 对于可保留区间[l, r] 枚举右端点r 考虑l的取值范围有两重约数 记颜色i出现的最右侧位置是\(max_i\) 最左侧位置是\(min_i\) r前最后一次出现 ...

  8. bzoj5011: [Jx2017]颜色

    Description 可怜有一个长度为n的正整数序列Ai,其中相同的正整数代表着相同的颜色. 现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去. 删除颜色i可以定义为把所 ...

  9. 【题解】JXOI2017颜色

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

随机推荐

  1. NGINX: Primary script unknown

    参考: [ StackExchange ] 这里的解决方式应该是你排查了所有原因依然无法解决问题. SELINUX 更改 selinux 配置 chcon -R -t httpd_sys_conten ...

  2. Spring 与 Quartz 动态配置(数漫江湖)

    因为项目的需求,需要有动态配置计划任务的功能.本文在 Quartz JobBean 中获取配置的 Quartz cronExpression 时间表达式及 Spring Bean 的对象名.方法名并运 ...

  3. 大聊Python----协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  4. Low-overhead enhancement of reliability of journaled file system using solid state storage and de-duplication

    A mechanism is provided in a data processing system for reliable asynchronous solid-state device bas ...

  5. C++之参数总结

    函数的形参为函数提供了已命名的局部存储空间,它是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化,而形参的 初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用 ...

  6. selenium===splinter模块和selenium异曲同工

    学习文档: http://splinter.readthedocs.io/en/latest/ 安装以后用它来实现163邮箱的登陆操作:*和selenium一样,splinter同样需要对frame进 ...

  7. python mysql插入数据遇到的错误

    1.数据插入的时候报错:not enough arguments for format string,大概意思就是说没有足够的参数格式化字符串. 我的数据库插入方法是这样的 def add_data( ...

  8. xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance(xsi:schemaLocation详解)

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"中xsi的意思是 :本xml文件中要用到某些来自xsi代表的“http:/ ...

  9. 【洛谷P3651】展翅翱翔之时

    难以吐槽出题人的中二病…… 这题有点类似ZJOI2008 骑士,先跑树上的,最后拆环即可. #include<bits/stdc++.h> #define N 100005 typedef ...

  10. 设计模式之笔记--桥接模式(Bridge)

    桥接模式(Bridge) 定义 桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化. 类图 描述 Abstraction:定义抽象部分的接口,通常在这个接口里面要维护一个实 ...