线段树

BZOJ题目传送门
洛谷题目传送门

对每个颜色记录mx[i]mx[i]mx[i]和mn[i]mn[i]mn[i]表示iii在序列中的最大/最小位置。枚举区间右端点i" role="presentation">iii,设jjj为满足max[c[j]]>i" role="presentation">max[c[j]]>imax[c[j]]>imax[c[j]]>i的最接近jjj的位置。可以发现[ 1,max[c[j]] ]" role="presentation">[ 1,max[c[j]] ][ 1,max[c[j]] ][\ 1,max[c[j]]\ ]是不合法的。并且如果i=mx[c[i]]i=mx[c[i]]i=mx[c[i]],( mn[c[i]],mx[c[i]] ](mn[c[i]],mx[c[i]]](\ mn[c[i]],mx[c[i]]\ ]也是不合法的。那么iii对答案的贡献就是(j,i]" role="presentation">(j,i](j,i](j,i]中未打标记的点的数量。

标记需要支持区间修改和查询,那么线段树就可以了。而jjj用一个栈维护,当i≠mx[c[i]]" role="presentation">i≠mx[c[i]]i≠mx[c[i]]i\not=mx[c[i]]时就把ii<script type="math/tex" id="MathJax-Element-32">i</script>放入栈中,否则一直弹就好了。

代码:

#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 300005
#define F inline
using namespace std;
typedef long long LL;
struct tree{ int l,r,x,f; }t[N<<2];
int n,T,tp,mc,stk[N],mx[N],mn[N],c[N];
LL ans;
F char readc(){static char buf[100000],*l=buf,*r=buf;if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);return l==r?EOF:*l++;
}
F int _read(){int x=0; char ch=readc();while (!isdigit(ch)) ch=readc();while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=readc();return x;
}
F void writec(LL x){ if (x>9) writec(x/10); putchar(x%10+48); }
F void _write(LL x){ writec(x),puts(""); }
void build(int x,int l,int r){t[x]=(tree){l,r,0,0};if (l==r) return; int mid=l+r>>1;build(x<<1,l,mid),build(x<<1|1,mid+1,r);
}
F void pshd(int x){t[x<<1].f=t[x<<1|1].f=1,t[x].f=0;t[x<<1].x=t[x<<1].r-t[x<<1].l+1;t[x<<1|1].x=t[x<<1|1].r-t[x<<1|1].l+1;
}
void mdfy(int x,int l,int r){if (t[x].l>r||t[x].r<l) return;if (t[x].l>=l&&t[x].r<=r){t[x].f=1,t[x].x=t[x].r-t[x].l+1; return;}if (t[x].f) pshd(x);mdfy(x<<1,l,r),mdfy(x<<1|1,l,r);t[x].x=t[x<<1].x+t[x<<1|1].x;
}
int srch(int x,int l,int r){if (t[x].l>r||t[x].r<l) return 0;if (t[x].l>=l&&t[x].r<=r) return t[x].x;if (t[x].f) pshd(x);return srch(x<<1,l,r)+srch(x<<1|1,l,r);
}
int main(){for (T=_read();T;T--){n=_read(),mc=ans=tp=0,build(1,1,n);for (int i=1;i<=n;i++) mc=max(mc,c[i]=_read());for (int i=1;i<=mc;i++) mn[i]=n,mx[i]=0;for (int i=1;i<=n;i++) mn[c[i]]=min(mn[c[i]],i);for (int i=1;i<=n;i++) mx[c[i]]=max(mx[c[i]],i);for (int i=1;i<=n;i++){if (mx[c[i]]==i&&mn[c[i]]!=mx[c[i]])mdfy(1,mn[c[i]]+1,mx[c[i]]);else stk[++tp]=i;for (;tp&&mx[c[stk[tp]]]<=i;tp--);if (i!=stk[tp]) ans+=i-stk[tp]-srch(1,stk[tp]+1,i);}_write(ans);}return 0;
}

BZOJ5011 [Jx2017]颜色(洛谷P4065)相关推荐

  1. 广度优先搜索——填涂颜色(洛谷 P1162)

    题目选自洛谷P1162 首先讲一下思路:根据题意,当找到第一个1时,其右下必然是圈内的0,那么只要从这个0开始广搜寻找联通块就可以了.(因为圈只有一个,那么当找到第一个1之后便要打断循环,很重要!) ...

  2. P1162 填图颜色 洛谷(BFS的简单应用)

    题目描述 由数字 0 0 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 1 1 构成,围圈时只走上下左右 4 4 4 个方向.现要求把闭合圈内的所有空间都填写成 2 2 2.例如: 6 × ...

  3. 洛谷Latex数学公式大全

    本文转载于 https://www.luogu.com.cn/blog/IowaBattleship/latex-gong-shi-tai-quan 转载请在文章页面明显位置注明出处. PS:资料来源 ...

  4. 洛谷 P1162填图颜色

    洛谷 P1162填图颜色 题目链接 #include <bits/stdc++.h> using namespace std; int xx[] = {0, -1, 0, 1}; int ...

  5. 洛谷P3939 数颜色 vector乱搞

    洛谷P3939 数颜色 标签 vector乱搞 简明题意 给一个序列(n <= 3e5),现需要你支持两种操作. 询问区间[L,R]中有多少个值为x的数 交换第k和k+1个数 思路 首先,这题需 ...

  6. 洛谷P2057 【SHOI2007】善意的投票

    洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...

  7. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  8. 洛谷 P1558 色板游戏

    传送门:洛谷 P1558 色板游戏 算法分析:观察到数据范围:\(1\leq T\leq 30\) ,考虑使用二进制来进行状态压缩 将颜色\(x\)表示为 \(1<<(x-1)\) 即 \ ...

  9. 洛谷p3392计算机教育新社会,洛谷-P3392 涂国旗

    洛谷-P3392 涂国旗 某国法律规定,只要一个由 (N imes M) 个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏--) 从最上方若干行(至少一行)的格子全部是白色的: 接下来若干 ...

最新文章

  1. 深度学习调参tricks总结!
  2. Android中使用Canvas和Paint绘制一个安卓机器人
  3. bread是可数还是不可数_​面包bread是可数名词还是不可数
  4. 小白如何入门Mybatis?这里有答案
  5. Linux使用imagemagick的convert命令压缩图片、节省服务器空间
  6. Android之系统服务-WindowManager
  7. C++中堆和栈的完全解析
  8. linux shell中的eval命令
  9. ntp时间同步服务器配置
  10. 1014.QxORM移植
  11. spring-boot(2)--环境搭建
  12. 接口测试——测试用例执行
  13. hdu 1818 It's not a Bug, It's a Feature!(位运算+bfs优先队列)
  14. js-JavaScript高级程序设计学习笔记2
  15. windows无法格式化u盘_u盘无法格式化的解决教程 好东西,以后优盘不怕坏了
  16. 推荐系统本质与网易严选实践
  17. 解决win10笔记本电脑Wifi频繁自动断开
  18. CTF 内存取证 USB流量分析
  19. Pytorch Tutorial 学习笔记(六)模型部署
  20. 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》

热门文章

  1. 《软件方法》第二章 自测题
  2. 怎么让termux运行Java_在安卓手机上通过 Termux 运行编译/运行 .NET 应用
  3. 动漫,简史早期的日本动画
  4. css设置元素抛物线,CSS3 抛物线波动(Parabola Wave)
  5. rk3328摄像头监控
  6. excel怎么拆分表格之按照关键词拆分表格数据
  7. 逍遥模拟器代理Charles与Burpsuite联动
  8. 如何同时对多个 Word 的内容进行批量替换
  9. 看看下边的问题你能够回答出来多少?
  10. 适合微信小程序作品的极简番茄时钟