羽未

题目概述


题解

TiwAirOAO\rm\color{black}{T}\color{red}{iwAirOAO}TiwAirOAO:这不就是一个线段树基础练习题吗

首先,对于一个固定的序列 aaa,我们很容易想到一种贪心地求解思路。
我们将一种颜色最左端的点到最右端的点所覆盖的区间看成这种颜色的区间,显然,区间有交的两种颜色必定都要变成同一种颜色。
我们将区间有交的区间看成一个区间连通块,一个区间联通块的点都要变成一种颜色,显然变成该联通块内点数最多的那种颜色是最优的。
我们可以贪心地将所有区间按左端点排序,然后求出所有的区间连通块以及其的点数最多的颜色。
显然,由于我们每次修改最多会给两个区间造成影响,我们可以暴力将这些区间重排。实际上将全部都sort一遍也不会T
时间复杂度O(∣C∣q)O\left(|C|q\right)O(∣C∣q),可以有707070pts。

显然,我们可以用数据结构对上面的过程进行优化。
我们考虑如何维护一个区间连通块。
显然,两个区间联通块区别的地方在于它们相邻处是两个没有共同区间覆盖的点。
我们可以维护哪些相邻的两个点是有共同区间将其覆盖住的。
我们每次颜色区间的改变相当于改变我们区间覆盖的范围。
由于一个点可能同时被多个点覆盖住,不妨维护一个点被多少个区间覆盖住,由于我们每次修改都是进行区间的加减,我们不妨就维护区间内最小值划分整个区间。
显然,一个点不可能被负数个区间所覆盖住,我们要的没有共同区间覆盖的相邻点划分区间,可以看成被000个全进所覆盖的点,该值如果有的话一定是最小的。
对于每个被划分的区间,我们需要维护该区间内的最大值。
相当于我们整个在线段树上维护被最小值划分开来区间的最大值和。
这显然就是个线段树的经典问题了,我们只需要多维护一个前后缀划分最大值就行了。

时间复杂度O((n+q)log⁡n)O\left((n+q)\log\,n\right)O((n+q)logn)。

源码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
#define MAXN 200005
#define mkpr make_pair
#define pb push_back
#define fir first
#define sec second
#define lson (rt<<1)
#define rson (rt<<1|1)
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x>9)print(x/10);putchar(x%10+'0');}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int n,q,a[MAXN],b[MAXN<<1],totb,L[MAXN],R[MAXN],val[MAXN],totd;
set<int>s[MAXN];
struct ming{int i,x;}p[MAXN];
struct tann{int l,r,w;}d[MAXN];
struct node{int lmx,rmx,maxx,sum,minn;node(){lmx=rmx=maxx=sum=minn=0;}
};
node merge(node x,node y){node res;res.minn=min(x.minn,y.minn);res.maxx=max(x.maxx,y.maxx);if(x.minn<y.minn)res.lmx=x.lmx,res.rmx=max(x.rmx,y.maxx),res.sum=x.sum;else if(x.minn>y.minn)res.lmx=max(x.maxx,y.lmx),res.rmx=y.rmx,res.sum=y.sum;else res.lmx=x.lmx,res.rmx=y.rmx,res.sum=x.sum+y.sum+max(x.rmx,y.lmx); return res;
}
class SegmentTree{private:int lzy[MAXN<<2];node tr[MAXN<<2];void pushup(int rt){tr[rt]=merge(tr[lson],tr[rson]);}void pushdown(int rt){if(lzy[rt]){lzy[lson]+=lzy[rt];tr[lson].minn+=lzy[rt];lzy[rson]+=lzy[rt];tr[rson].minn+=lzy[rt];lzy[rt]=0;}}public:void modify(int rt,int l,int r,int al,int ar,int aw){if(ar<l||al>ar||l>r||al>ar)return ;if(al<=l&&r<=ar){lzy[rt]+=aw;tr[rt].minn+=aw;return ;}int mid=l+r>>1;pushdown(rt);if(al<=mid)modify(lson,l,mid,al,ar,aw);if(ar>mid)modify(rson,mid+1,r,al,ar,aw);pushup(rt);}void insert(int rt,int l,int r,int ai,int aw){if(l>r||l>ai||r<ai)return ;if(l==r){tr[rt].sum=tr[rt].maxx=aw;tr[rt].lmx=tr[rt].rmx=0;return ;}int mid=l+r>>1;pushdown(rt);if(ai<=mid)insert(lson,l,mid,ai,aw);if(ai>mid)insert(rson,mid+1,r,ai,aw);pushup(rt);}int query(){return (tr[1].minn==0)*(tr[1].lmx+tr[1].rmx+tr[1].sum);}
}T;
int main(){freopen("umi.in","r",stdin);freopen("umi.out","w",stdout);read(n);read(q);for(int i=1;i<=n;i++)read(a[i]),b[++totb]=a[i];for(int i=1;i<=q;i++)read(p[i].i),read(p[i].x),b[++totb]=p[i].x;sort(b+1,b+totb+1);totb=unique(b+1,b+totb+1)-b-1;for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+totb+1,a[i])-b;for(int i=1;i<=q;i++)p[i].x=lower_bound(b+1,b+totb+1,p[i].x)-b;for(int i=1;i<=n;i++)s[a[i]].insert(i),val[a[i]]++;for(int i=1;i<=totb;i++)if(val[i])L[i]=*s[i].begin(),R[i]=*s[i].rbegin();for(int i=1;i<=totb;i++)if(val[i])T.modify(1,1,n,L[i],R[i]-1,1),T.insert(1,1,n,L[i],val[i]);printf("%d\n",n-T.query());for(int i=1;i<=q;i++){int u=a[p[i].i],v=p[i].x;s[u].erase(p[i].i);if(val[u])T.insert(1,1,n,L[u],0);val[u]--;if(L[u]==p[i].i||R[u]==p[i].i){if(val[u]>=0)T.modify(1,1,n,L[u],R[u]-1,-1);if(val[u])L[u]=*s[u].begin(),R[u]=*s[u].rbegin(),T.modify(1,1,n,L[u],R[u]-1,1);}if(val[u])T.insert(1,1,n,L[u],val[u]);if(val[v])T.insert(1,1,n,L[v],0); s[v].insert(p[i].i);val[v]++;if(val[v]==1||L[v]>p[i].i||R[v]<p[i].i){if(val[v]>1)T.modify(1,1,n,L[v],R[v]-1,-1);if(val[v])L[v]=*s[v].begin(),R[v]=*s[v].rbegin(),T.modify(1,1,n,L[v],R[v]-1,1);}if(val[v])T.insert(1,1,n,L[v],val[v]);printf("%d\n",n-T.query());a[p[i].i]=v;}return 0;
}

谢谢!!!

[海军国际项目办公室]羽未相关推荐

  1. [CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林

    Mr. Kitayuta vs. Bamboos 迷途竹林事实上就是经TiwAirOAO\color{red}{TiwAirOAO}TiwAirOAO巨佬扩大数据范围强化后的版本.真的是强化了吗 不过 ...

  2. [海军国际项目办公室]猪国杀

    猪国杀 题解 为什么总有**出题人喜欢用一些毒瘤题的题目名字来命名题目呀. 看到这种题一般很容易想到通过 d p dp dp来进行转移吧. 我们先考虑一下如果我们要选牌的话怎么选才能让我们获得的牌尽量 ...

  3. [hdu6757]Hunting Monsters/[海军国际项目办公室]能量产业革命

    Hunting Monsters 题解 实际上两道题的做法没什么区别,只是问的方式不大一样 不过hdu上的数据好像不完整,scanf可以过,read就过不了了 首先如果我们得确定我们以怎样的顺序选择我 ...

  4. a3国际服服务器未响应,A3幸存者国际服

    A3幸存者国际服是一款充满魔幻气息的角色扮演游戏,玩家在这里能够体验到非常精彩的战斗,玩家在开始游戏时将会被传送的只有30人的战斗,玩家在这里只有之后生存下来的才能够获得胜利,这里还有着超多模式供玩家 ...

  5. [渝粤教育] 西南科技大学 畜牧概论 在线考试复习资料

    畜牧概论--在线考试复习资料 一.单选题 1.色氨酸在动物体内可转变为下列那一种维生素. A.烟酸 B.叶酸 C.泛酸 D.生物素 2.根据蛋白质中的平均蛋含量可知,1克氮能合成粗蛋白质多少克. A. ...

  6. 天猫双十一神话恐终结

    2011年双十一大促,天猫商城创造了单日33.6亿的促销奇迹,是2010年同日交易额的近4倍.今年双十一即将来临,淘宝还能再创奇迹吗?何玺认为,淘宝双十一的神话恐终结,理由如下. 一.电商促销年消费被 ...

  7. 机器人 陆梅东_机器人知识与实践比赛获奖 - 上海徐汇区青少年活动中心

    机器人知识与实践比赛获奖 - 上海徐汇区青少年活动中心 2005上海市青少年"西南位育杯" 2005上海市青少年"西南位育杯"机器人知识与实践比赛获奖名单汇总 ...

  8. 解决Webview加载不完全导致部分js无效

    问题出现 有两种情况: 一种情况是打开activity时webview开始加载页面,但是发现加载了一部分后就停止了,余下的一直不再加载.但是当关闭这个activity时发现webview又继续加载了. ...

  9. 书论20 袁昂《古今书评》

    [原文]  王右军书如谢家子弟,纵復不端正者,爽爽有一种风气. 王子敬书如河.洛间少年,虽皆充悦,而举体沓拖,殊不可耐. 羊欣书如大家婢为年人,虽处其位,而举止羞涩,终不似真. 徐淮南书如南冈士大夫, ...

最新文章

  1. jquery 吐司_jquery – 更改toastr通知的positionclass
  2. IDEA中PlantUML的使用
  3. 一份邀请函引发的中国芯片新猜想
  4. ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function、sigmoid、softmax、ReLU等)求导函数等代码实现之详细攻略
  5. 这些新技术你们都知道吗?成功收获美团,小米安卓offer
  6. 关于tomcat Post 数据参数的问题
  7. byte数组转byte数组 java_Java中文件与字节数组转换
  8. IoC框架,依赖注入
  9. python 闭包和装饰器
  10. 基于socket的即时通信系统的设计与实现
  11. 小程序分销的规则是怎样的?
  12. 回复 程序员如何做SOHO接私单
  13. 陶瓷纤维毯行业调研报告 - 市场现状分析与发展前景预测
  14. Java:珠穆朗玛峰
  15. HTML5期末大作业:电影票务网站设计——电影票务网站整套(24页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  16. JDBC操作数据库——resultset的操作小窍门
  17. When you want to give up, remember why you started.
  18. hdu 2086 A1 = ?(递推)
  19. 创业实践案例课程答案
  20. DL之DSSD:DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

热门文章

  1. c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc
  2. yii框架PHP项目,yii框架项目怎么部署
  3. 中文短文本的实体链指
  4. 计算机B的IP地址是,一个B类IP地址172.16.1.0,划分八个子网,计算分配各子网有效地址和最大计算机数...
  5. linux网络编程-很全的
  6. 国家标准《汽车行驶记录仪》(征求意见稿) GB19056 编制说明
  7. ubuntu install ai k8s kubeadm
  8. 百度前端技术学院 第四天整理
  9. python 读写ini文件
  10. java 千分之一的概率_概率是多少?打造师经验总结,大概千分之一