首页 > 其他分享 >CF1423G Growing flowers题解

CF1423G Growing flowers题解

时间:2024-01-28 11:44:24浏览次数:26  
标签:node set iterator 题解 ll itb ita Growing flowers

考虑每种颜色的贡献,用总数 \(n-k+1\) 减去没有贡献到的(极长连续段长度为 \(len\) 时),贡献为 \(\max(len-k+1,0)\),所以考虑用 \(\text{ODT}\) 维护所有颜色的连续段。
具体的,维护一个大的 \(ODT\) 存储所有连续段,再对每个颜色存储自己的连续段,用 \(\text{BIT}\) 维护每个长度的极长连续段的长度总和以及出现次数。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
struct node{
	ll l;ll r;ll c;
	inline bool operator < (const node &t)const{
		return l<t.l; 
	}
};
ll n,q,a[N],o[N],cnto;
ll opt[N],el[N],er[N],ex[N];
set<node> S[N];ll cs[N];ll kind;
inline void read(ll &x)
{
	ll f=1;char c;
	for(x=0,c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x*=f;
}
inline ll mn(ll _x,ll _y){return _x<_y?_x:_y;}
inline ll mx(ll _x,ll _y){return _x>_y?_x:_y;}
inline ll ab(ll _x){return _x<0?-_x:_x;}

ll sum[N],cnt[N];
inline ll lowbit(ll x){return x&-x;}
inline void update(ll x,ll o){
	ll v=x;++x;
	while(x<=n+1){sum[x]+=1ll*o*v;cnt[x]+=o;x+=lowbit(x);}
	return ;
}
inline ll qc(ll x){
	++x;ll res=0;
	while(x){res+=cnt[x];x-=lowbit(x);}
	return res;
}
inline ll qs(ll x){
	++x;ll res=0;
	while(x){res+=sum[x];x-=lowbit(x);}
	return res;
}
inline ll Qc(ll l,ll r){
	ll res=qc(r);
	if(l) res-=qc(l-1);
	return res;	
}
inline ll Qs(ll l,ll r){
	ll res=qs(r);
	if(l) res-=qs(l-1);
	return res;
}

inline void SegIns(ll l,ll r,ll c){
	set<node>::iterator ita=S[c].lower_bound((node){l,r,c});
	set<node>::iterator itb;itb=ita;--itb;
	update(ita->l-itb->r-1,-1);
	set<node>::iterator it=S[c].insert((node){l,r,c}).first;
	update(it->l-itb->r-1,1);
	update(ita->l-it->r-1,1);
	return ;
}
inline void SegDel(ll l,ll r,ll c){
	set<node>::iterator it=S[c].find((node){l,r,c});
	set<node>::iterator ita,itb;ita=it;--ita;itb=it;++itb;
	update(it->l-ita->r-1,-1);
	update(itb->l-it->r-1,-1);
	update(itb->l-ita->r-1,1);
	S[c].erase(it);return ; 
}
inline set<node>::iterator split(ll pos){
	set<node>::iterator it=S[0].lower_bound((node){pos,pos,0});
	if(it!=S[0].end()&&it->l==pos) return it;
	--it;
	ll _l=it->l,_r=it->r,_c=it->c;
	S[0].erase(it);
	S[_c].erase((node){_l,_r,_c});
	if(_l<pos) { 
		S[0].insert((node){_l,pos-1,_c});
		S[_c].insert((node){_l,pos-1,_c});
	}
	S[_c].insert((node){pos,_r,_c});
	return S[0].insert((node){pos,_r,_c}).first;
}
inline void Assign(ll l,ll r,ll v){
	set<node>::iterator itr=split(r+1),itl=split(l);
	for(set<node>::iterator it=itl;it!=itr;++it){
		SegDel(it->l,it->r,it->c);
	}
	S[0].erase(itl,itr);
	S[0].insert((node){l,r,v});
	SegIns(l,r,v);
	return ;
} 
inline ll Qk(ll k){
	ll res=0;
	res+=Qs(k,n);
	res-=Qc(k,n)*(k-1);
	return 1ll*cnto*(n-k+1)-res; 
}
int main()
{
	read(n);read(q);
	for(ll i=1;i<=n;i++){
		read(a[i]);o[++cnto]=a[i];
	}
	for(ll i=1;i<=q;i++){
		read(opt[i]);
		if(opt[i]==1){
			read(el[i]);read(er[i]);read(ex[i]);
			o[++cnto]=ex[i];
		}
		else read(ex[i]);
	}
	sort(o+1,o+cnto+1);
	cnto=unique(o+1,o+cnto+1)-o-1;
	for(ll i=1;i<=n;i++) 
		a[i]=lower_bound(o+1,o+cnto+1,a[i])-o;
	for(ll i=1;i<=q;i++)
		if(opt[i]==1) ex[i]=lower_bound(o+1,o+cnto+1,ex[i])-o;
	
	for(ll i=1;i<=cnto;i++){
		S[i].insert((node){n+1,n+1,i});
		S[i].insert((node){0,0,i});
		update(n,1);
	}
	S[0].insert((node){0,0,0});
	S[0].insert((node){n+1,n+1,0});
	for(ll i=1;i<=n;i++) {
		SegIns(i,i,a[i]);
		S[0].insert((node){i,i,a[i]});
	}

	for(ll i=1;i<=q;i++){
		if(opt[i]==1) Assign(el[i],er[i],ex[i]);
		else printf("%lld\n",Qk(ex[i]));
	}

	return 0;
}

标签:node,set,iterator,题解,ll,itb,ita,Growing,flowers
From: https://www.cnblogs.com/ReineRabbit/p/17895829.html

相关文章

  • ABC338 D Island Tour 题解
    Question有\(n\)座海岛由\(n\)条桥连着,第\(i\)座桥连接第\(i\)和\(i+1\)座海岛,第\(n\)座桥连接第\(n\)和\(1\)座海盗有一条长度为\(m\)的旅游路线,第\(X_i\)表示依次到达的岛屿现在需要切断一条桥,求总旅游路线最小值Solution显然,从第\(X_{i-1}\)到\(X_......
  • ABC338 E Chords 题解
    Question一个圆上有\(2N\)个点均匀分布,给出\(N\)条线,每条线连接两个顶点问,有没有两条线相交Solution也算一个比较典的题目考虑到这种两两配对,配对中有没有交错关系的可以考虑异或哈希因为一个数异或两次等于它本身,所以我们可以用异或来实现一个“撤销”操作我们当我......
  • UVA10852 的题解
    UVA10852的题解题目大意给定自然数\(n(100\leqn\leq10000)\),寻找质数\(x\len\),使得\(p\timesx\leqn<(p+1)\timesx\)且\(n-p\timesx\)最大。思路不难发现,\(p\)其实就是$\left\lfloor\frac{n}{x}\right\rfloor$,所以,我们只要找到对应的\(x\),\(p\)的只就......
  • 洛谷题解-P3003 [USACO10DEC] Apple Delivery S (dijkstra)
    题目描述Bessiehastwocrispredapplestodelivertotwoofherfriendsintheherd.Ofcourse,shetravelstheC(1<=C<=200,000)cowpathswhicharearrangedastheusualgraphwhichconnectsP(1<=P<=100,000)pasturesconvenientlynumb......
  • CF765F Souvenirs 题解
    题目链接:CF或者洛谷想了很久,然后想起做过的一道题:秃子酋长,一开始以为差不多,结果写着写着就发现不对劲了。最后写出了个神仙回滚莫队解法,感觉很妙,记录下。进入神仙分析时刻首先,我们来考虑一个事实,加上一个数以后,如果能找到它的前后驱,那么可以立马更新最优解,这个也即是瓶颈点。......
  • ABC338 题解(A-E)
    前言:F,G后续补充。A题意判断一个字符串,是否满足只有第一位为大写字母,其余为小写字母。Sol字面意思模拟即可。Code#include<bits/stdc++.h>#definelllonglong#defineN200005#defineendl"\n"#definefifirst#definesesecondusingnamespacestd;constll......
  • AndroidStudio 编辑xml布局文件卡死问题解决
    之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在解析布局文件时候因为有版权声明的原因导致卡死,所以删除版权声明就可以了。可以......
  • 洛谷题解-P1821 [USACO07FEB] Cow Party S
    https://www.luogu.com.cn/problem/P1821题目描述寒假到了,nnn头牛都要去参加一场在编号为xxx的牛的农场举行的派对,农场之间有mmm条有向路,每条路都有一定的长度。每头牛参加完派对后都必须回家,无论是去参加派对还是回家,每头牛都会选择最短路径,求这nnn头牛的最短路径(一个......
  • 洛谷题解-P1673 [USACO05FEB] Part Acquisition S
    https://www.luogu.com.cn/problem/P1673题目描述奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤5×104)N(1\leN\le5\times10^4)N(1≤N≤5×104)颗行星,在行星上进行交易。为了方便,奶牛们已经给可能出现的K(1≤K≤103)K(1\leK\le10^3)K(1≤K≤103)......
  • CF739A Alyona and mex 题解
    题目传送门前置知识贪心|构造解法从贪心的角度分析,最小的\(\operatorname{mex}\)仅会与长度最小的区间有关;另外为使得\(\operatorname{mex}\)最大,当\(\operatorname{mex}\)等于区间长度的时候即为所求。记\(ans\)表示此时得到的答案。构造序列时,长度最小的区间一定......