JXOI2017颜色

  • 首先记录每个位置上颜色在序列中上次出现的位置
  • 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和
  • 首先倒着扫一遍,对于当前颜色的后面一个颜色,将其删去,那他的\(pre\)肯定也要删去,将其\(pre\)的位置加入第一棵线段树,对每个位置记一个\(able\),值为当前第一棵线段树中最大值,表示当前点到\(able+1\)这一段区间都是可以的。
  • 初始化第二颗树,\(sum\)值初始设为1,对于每个位置,如果他有前驱,那他与他前驱中这段的颜色不能计入答案,将其全部设为0,统计\(i\)到\(able+1\)的值即可。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=3e5+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>inline T read()
{
T f=1,ans=0;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>inline void write(T x,char y)
{
if(x==0)
{
putchar('0');putchar(y);
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("4056.in","r",stdin);
freopen("4056.out","w",stdout);
#endif
}
#define lson h<<1,l,mid
#define rson h<<1|1,mid+1,r
namespace T1
{
int maxn[N<<2];
void build(int h,int l,int r)
{
maxn[h]=0;
if(l==r)return;
int mid=(l+r)>>1;
build(lson);build(rson);
}
void update(int h,int l,int r,int pos,int v)
{
if(l==r)
{
maxn[h]=v;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)update(lson,pos,v);
else update(rson,pos,v);
maxn[h]=max(maxn[h<<1],maxn[h<<1|1]);
}
}
namespace T2
{
int sum[N<<2],lazy[N<<2];
void push_down(int h)
{
if(!lazy[h])return;
int ls=h<<1,rs=ls|1;
lazy[ls]=lazy[rs]=1;
sum[ls]=sum[rs]=0;
lazy[h]=0;
}
void build(int h,int l,int r)
{
sum[h]=1;lazy[h]=0;
if(l==r)return;
int mid=(l+r)>>1;
build(lson);build(rson);
sum[h]=sum[h<<1]+sum[h<<1|1];
}
void update(int h,int l,int r,int s,int t)
{
if(s<=l&&r<=t)
{
sum[h]=0;lazy[h]=1;
return;
}
push_down(h);
int mid=(l+r)>>1;
if(s<=mid)update(lson,s,t);
if(mid<t)update(rson,s,t);
sum[h]=sum[h<<1]+sum[h<<1|1];
}
int query(int h,int l,int r,int s,int t)
{
if(s<=l&&r<=t)return sum[h];
push_down(h);
int res=0,mid=(l+r)>>1;
if(s<=mid)res=query(lson,s,t);
if(mid<t)res+=query(rson,s,t);
sum[h]=sum[h<<1]+sum[h<<1|1];
return res;
}
}
ll ans;
int n,m,a[N];
int pos[N],pre[N],able[N];
void input()
{
n=read<int>();
For(i,1,n)
{
a[i]=read<int>();cmax(m,a[i]);
pre[i]=pos[a[i]];pos[a[i]]=i;
}
}
void init()
{
m=0;ans=0;
memset(pos,0,sizeof pos);
memset(able,0,sizeof able);
memset(pre,0,sizeof pre);
}
void work()
{
T1::build(1,1,m);
T2::build(1,1,n);
Fordown(i,n,1)
{
if(i<n)T1::update(1,1,m,a[i+1],pre[i+1]);
able[i]=T1::maxn[1];
}
For(i,1,n)
{
if(pre[i])T2::update(1,1,n,pre[i]+1,i);
if(able[i]+1<=i)ans+=T2::query(1,1,n,able[i]+1,i);
}
write(ans,'\n');
}
int main()
{
file();
int T=read<int>();
while(T--)
{
init();
input();
work();
}
return 0;
}

JXOI2017颜色 解题报告的更多相关文章

  1. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  2. [CQOI2009] 叶子的颜色 解题报告(树形DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1304 Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为 ...

  3. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  4. NOIP2017普及组解题报告

    刚参加完NOIP2017普及,只考了210,于是心生不爽,写下了这篇解题报告...(逃 第一次写博,望dalao们多多指导啊(膜 第一题score,学完helloworld的人也应该都会吧,之前好多人 ...

  5. GX/GZOI2019 day2 解题报告

    GX/GZOI2019 day2 解题报告 题目链接 逼死强迫症 旅行者 旧词 t1 逼死强迫症 显然地,记 \(f(i)\) 为长度为 \(i\) 的木板的答案,可得: \(\\\) \[f(i)= ...

  6. Codeforces 524 解题报告

    打的很快乐的一次比赛hiahiahia, 才A掉4题rating就涨了100+ 距离比赛\(3\)天了, 由于博主实在太颓, 又补掉了\(E\)题, 到现在才发解题报告 A. 语法题, 读入输出就行了 ...

  7. HDU 4303 Hourai Jeweled 解题报告

    HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...

  8. ACM-ICPC 2017 Asia HongKong 解题报告

    ACM-ICPC 2017 Asia HongKong 解题报告 任意门:https://nanti.jisuanke.com/?kw=ACM-ICPC%202017%20Asia%20HongKon ...

  9. USACO Section1.1 Broken Necklace 解题报告

    beads解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

随机推荐

  1. MiZ702学习笔记8——让MiZ702变身PC的方法

    首先你需要一个安装好的linux系统,这里我用的是Ubuntu的虚拟机.VMWare的话,选择较高版本的成功率会高些(当然根据自己电脑的配置进行选择). 打开Ubuntu的虚拟机,找到一个叫做Disk ...

  2. flask登录注册简单的例子

    1.主程序 # app.py # Auther: hhh5460 # Time: 2018/10/05 # Address: DongGuan YueHua from functools import ...

  3. grunt-inline:一个资源内嵌插件

    一.插件简介 将引用的外部资源,如js.css.img等,内嵌到引用它们的文件里去. 二.使用场景 在项目中,出于某些原因,有的时候我们需要将一些资源,比如js脚本内嵌到页面中去.比如我们的html页 ...

  4. python3 subprocess模块

    当我们在执行python程序的时候想要执行系统shell可以使用subprocess,这时可以新起一个进程来执行系统的shell命令,python3常用的有subprocess.run()和subpr ...

  5. PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)

    题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...

  6. Centos6.5下进行PHP版本升级

    http://blog.csdn.net/aliveqf/article/details/70444387

  7. M2 Daily SCRUM要求

    每个人的工作 (有work item 的ID):昨天已完成的工作,今天计划完成的工作:工作中遇到的困难. 燃尽图 照片 每人的代码/文档签入记录(不能每天都在 “研讨”, 但是没有代码签入) 如实报告 ...

  8. 读书笔记(chapter5)

    系统调用 5.1与内核通信 1.系统调用在用户空间进程和硬件设备之间添加一个中间层.作用有三个:它为用户空间提供了一种硬件的抽象接口:系统调用保证了系统的稳定和安全:系统调用是用户空间访问内核的唯一手 ...

  9. 软工团队(hello world)组员介绍

    姜中希:喜欢编程,善于交际. 周盼超:喜欢编程. 王昭博:思路比较清晰,可以明确开发步骤. 刘洪阳:思想笔记广泛,可以把很多有关联的东西结合起来. 刘双勃:喜欢编程,踏实,比较容易坚持.

  10. ”数学口袋精灵“第二个Sprint计划---第二天

    “数学口袋精灵”第二个Sprint计划----第二天进度 任务分配: 冯美欣:欢迎界面的音效 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:完善算法代码的设计 进度:   冯美欣:找到了几个音乐 ...