热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JXOI2017颜色解题报告

JXOI2017颜色首先记录每个位置上颜色在序列中上次出现的位置开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值&#x

JXOI2017颜色

  • 首先记录每个位置上颜色在序列中上次出现的位置
  • 开两颗线段树,第一棵维护区间最大值,实际上是维护当前必须被删去的颜色的位置的最大值,第二棵则是维护区间和
  • 首先倒着扫一遍,对于当前颜色的后面一个颜色,将其删去,那他的\(pre\)肯定也要删去,将其\(pre\)的位置加入第一棵线段树,对每个位置记一个\(able\),值为当前第一棵线段树中最大值,表示当前点到\(able+1\)这一段区间都是可以的。
  • 初始化第二颗树,\(sum\)值初始设为1,对于每个位置,如果他有前驱,那他与他前驱中这段的颜色不能计入答案,将其全部设为0,统计\(i\)\(able+1\)的值即可。

// luogu-judger-enable-o2
#include
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i&#61;(sign)a;i<&#61;(sign)b;&#43;&#43;i)
#define Fordown(i,a,b) for(register sign i&#61;(sign)a;i>&#61;(sign)b;--i)
const int N&#61;3e5&#43;5;
bool cmax(sign &a,sign b){return (abool cmin(sign &a,sign b){return (a>b)?a&#61;b,1:0;}
templateinline T read()
{T f&#61;1,ans&#61;0;char ch&#61;getchar();while(!isdigit(ch)&&ch!&#61;&#39;-&#39;)ch&#61;getchar();if(ch&#61;&#61;&#39;-&#39;)f&#61;-1,ch&#61;getchar();while(isdigit(ch))ans&#61;(ans<<3)&#43;(ans<<1)&#43;(ch-&#39;0&#39;),ch&#61;getchar();return ans*f;
}
templateinline void write(T x,char y)
{if(x&#61;&#61;0){putchar(&#39;0&#39;);putchar(y);return;}if(x<0){putchar(&#39;-&#39;);x&#61;-x;}static char wr[20];int top&#61;0;for(;x;x/&#61;10)wr[&#43;&#43;top]&#61;x%10&#43;&#39;0&#39;;while(top)putchar(wr[top--]);putchar(y);
}
void file()
{#ifndef ONLINE_JUDGEfreopen("4056.in","r",stdin);freopen("4056.out","w",stdout);#endif
}
#define lson h<<1,l,mid
#define rson h<<1|1,mid&#43;1,r
namespace T1
{int maxn[N<<2];void build(int h,int l,int r){maxn[h]&#61;0;if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;build(lson);build(rson);}void update(int h,int l,int r,int pos,int v){if(l&#61;&#61;r){maxn[h]&#61;v;return;}int mid&#61;(l&#43;r)>>1;if(pos<&#61;mid)update(lson,pos,v);else update(rson,pos,v);maxn[h]&#61;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&#61;h<<1,rs&#61;ls|1;lazy[ls]&#61;lazy[rs]&#61;1;sum[ls]&#61;sum[rs]&#61;0;lazy[h]&#61;0;}void build(int h,int l,int r){sum[h]&#61;1;lazy[h]&#61;0;if(l&#61;&#61;r)return;int mid&#61;(l&#43;r)>>1;build(lson);build(rson);sum[h]&#61;sum[h<<1]&#43;sum[h<<1|1];}void update(int h,int l,int r,int s,int t){if(s<&#61;l&&r<&#61;t){sum[h]&#61;0;lazy[h]&#61;1;return;}push_down(h);int mid&#61;(l&#43;r)>>1;if(s<&#61;mid)update(lson,s,t);if(mid>1;if(s<&#61;mid)res&#61;query(lson,s,t);if(mid}
ll ans;
int n,m,a[N];
int pos[N],pre[N],able[N];
void input()
{n&#61;read();For(i,1,n){a[i]&#61;read();cmax(m,a[i]);pre[i]&#61;pos[a[i]];pos[a[i]]&#61;i;}
}
void init()
{m&#61;0;ans&#61;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}
int main()
{file();int T&#61;read();while(T--){init();input();work();}return 0;
}

转:https://www.cnblogs.com/dengyixuan/p/8340355.html



推荐阅读
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 796.[APIO2012]派遣在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为Master。 ... [详细]
  • P2765魔术球问题这道题的思路实在是太罕见了,所以发一篇blog从某一新放入的球开始看起1.放入原来的柱子上2.放入新的柱子并将每个点进行拆点࿰ ... [详细]
  • 我试图在默认的pythonIDE中收集一些unicode原始输入,据我所知,它应该很简单:craw_input()日本語p ... [详细]
  •   并查集是一种群众喜闻乐见的数据结构,其复杂度是数据结构中最奇葩的之一了,Tarjan证明其为阿克曼函数的反函数,在可以想象(不全面的解释啊)的范围内小于等于3。。。我们就把它当做O(1)吧。下面通 ... [详细]
  • C语言函数的定义及其含义
    本文目录一览:1、C语言函数的特点及其定义?2 ... [详细]
  • 捕获图像,用KMPlayer很容易实现。编码,用了强大的maltab生成3000多张用于播放的字符文本。图像的标号为1(1) ... [详细]
author-avatar
mmmm的海角_771
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有