AT_jsc2019_final_h Distinct Integers
1.CF1209G2 Into Blocks (hard version)2.「POJ 3744」Scout YYF I3.记录trick4.洛谷P10936 导弹防御塔5.CF1635E Cars6.P87267.CF633G8.CF1436E9.[BJOI2017] 喷式水战改10.「CF407E」k-d-sequence11.「雅礼集训 2017 Day5」珠宝
12.AT_jsc2019_final_h Distinct Integers
13.CF1430G Yet Another DAG Problem14.[2022CCPC广州] B Ayano and sequences15.[2022CCPC广州] Infection16.[2022CCPC广州] XOR Sum题意:给一个长度为
-
将 修改成 -
查询 有多少子区间满足区间内元素两两不相等
先简化问题,求
code:
#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#pragma GCC optimeze(3)
#pragma GCC optimeze(2)
#define PII pair<int, int>
#define pb push_back
#define fi first
#define se second
#define lowbit(x) (x & (-x))
#define inv(x) (qpow(x,mod-2))
#define blong(i) ((i+K-1)/K)
using namespace std;
const int N=5e5+10;
int n,m,a[N],sum[N<<2],mx[N<<2],v[N];
set<int>s[N];
int qu(int p,int l,int r,int v){//查询区间内max(v,前缀最大值)之和
if(l==r)return max(v,mx[p]);
int mid=(l+r)>>1;
if(mx[p<<1]<v)return v*(mid-l+1)+qu(p<<1|1,mid+1,r,v);
return sum[p]-sum[p<<1]+qu(p<<1,l,mid,v);
}
void pushup(int p,int l,int r){
int mid=(l+r)>>1;
mx[p]=max(mx[p<<1],mx[p<<1|1]);
sum[p]=sum[p<<1]+qu(p<<1|1,mid+1,r,mx[p<<1]);
}
void build(int p,int l,int r){
if(l==r){
mx[p]=sum[p]=v[l];return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p,l,r);
}
void change(int x,int p,int s,int t,int k){
if(s==t){
mx[p]=sum[p]=k;return;
}
int mid=(s+t)>>1;
if(mid>=x)change(x,p<<1,s,mid,k);
else change(x,p<<1|1,mid+1,t,k);
pushup(p,s,t);
}
vector<int>P,S,T;
void getl(int l,int r,int p,int s,int t){//将[l,r]分割成线段树上的线段
if(s>=l&&t<=r){
P.pb(p),S.pb(s),T.pb(t);return;
}
int mid=(s+t)>>1;
if(mid>=l)getl(l,r,p<<1,s,mid);
if(mid<r)getl(l,r,p<<1|1,mid+1,t);
}
int query(int l,int r){
P.clear(),S.clear(),T.clear();
getl(l,r,1,1,n);
int ans=0,pre=l-1;
for(int i=0;i<P.size();i++){
ans+=qu(P[i],S[i],T[i],pre);
pre=max(pre,mx[P[i]]);
}
return ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(s[a[i]].size()){
auto it=s[a[i]].end();
it--;
v[i]=(*it);
}
s[a[i]].insert(i);
}
build(1,1,n);
while(m--){
int opt,l,r;cin>>opt>>l>>r;
l++;
if(opt==0){
s[a[l]].erase(l);
auto it=s[a[l]].lower_bound(l);
if(it!=s[a[l]].end()){
if(it==s[a[l]].begin())change(*it,1,1,n,0);
else {
it--;
int x=*it;
it++;
change(*it,1,1,n,x);
}
}
a[l]=r;
s[r].insert(l);
it=s[r].lower_bound(l);
if(it==s[r].begin())change(l,1,1,n,0);
else{
it--;
int u=*it;
it++;
change(*it,1,1,n,u);
}
it++;
if(it!=s[r].end())change(*it,1,1,n,l);
}
else cout<<(l+r)*(r-l+1)/2-query(l,r)<<'\n';
}
return 0;
}
本文作者:Xdik
本文链接:https://www.cnblogs.com/Xdik/p/18718805
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步