考虑每种颜色的贡献,用总数 \(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;
}

CF1423G Growing flowers题解的更多相关文章

  1. CF474D Flowers 题解

    题目:CF474D Flowers 传送门 DP?递推? 首先可以很快看出这是一道 DP 的题目,但与其说是 DP,还不如说是递推. 大家还记得刚学递推时教练肯定讲过的一道经典例题吗?就是爬楼梯,一个 ...

  2. Luogu CF451E Devu and Flowers 题解报告

    题目传送门 [题目大意] 有n种颜色的花,第i种颜色的花有a[i]朵,从这些花中选m朵出来,问有多少种方案?答案对109+7取模 [思路分析] 这是一个多重集的组合数问题,答案就是:$$C_{n+m- ...

  3. CF740B Alyona and flowers 题解

    Content 有 \(n\) 个数 \(a_1,a_2,a_3,...,a_n\),给定 \(m\) 个区间,你可以选择一些区间使得它们的总和最大(也可以不选),求这个最大的总和. 数据范围:\(1 ...

  4. Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力

    E. Roland and Rose Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...

  5. [题解] [CF451E] Devu and Flowers

    题面 题解 就是一个求\(\sum_{i= 1}^{n}x _ i = m\)的不重复多重集的个数, 我们可以由容斥原理得到: \[ ans = C_{n + m - 1}^{n - 1} - \su ...

  6. 题解 【POJ1157】LITTLE SHOP OF FLOWERS

    先把题目意思说一下: 你有F束花,编号为\(1\)~\(F\)(\(1<=F<=100\)),\(V\)个花瓶,编号为\(1\) ~\(V\)(\(1<=V<=100\)), ...

  7. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  8. Codeforces Round #381 (Div. 2)B. Alyona and flowers(水题)

    B. Alyona and flowers Problem Description: Let's define a subarray as a segment of consecutive flowe ...

  9. CF459B Pashmak and Flowers (水

    Pashmak and Flowers Codeforces Round #261 (Div. 2) B. Pashmak and Flowers time limit per test 1 seco ...

  10. Codeforces Round #271 (Div. 2)题解【ABCDEF】

    Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...

随机推荐

  1. ESP32 MQTT对接巴法云平台

    ESP32 MQTT对接巴法云平台 MQTT(Message Queuing Telemetry Transport)是一种轻量级的 发布/订阅(Publish/Subscribe) 消息传输协议,专 ...

  2. 开源我的一款自用AI阅读器,引流Web前端、Rust、Tauri、AI应用开发

    前沿 - 为什么要做这个开源软件 作为一个典型的前端开发者,去年在为公司调研Rust前端工具链.LLM应用开发技术体系的时候,对这类技术领域产生了浓厚的兴趣,也是出于早期曾经是一名Android移动应 ...

  3. .NET 原生驾驭 AI 新基建实战系列(七):Weaviate ── 语义搜索的智能引擎创新者

    引言 随着人工智能和机器学习技术的迅猛发展,向量数据在推荐系统.自然语言处理.图像搜索等领域的应用日益广泛.传统的数据库在处理高维向量数据时往往面临性能瓶颈,而向量数据库的出现为这一问题提供了高效的解 ...

  4. System.Runtime.Serialization.SerializationException:“二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。

    var buffer = new byte[1024]; using (var ms = new MemoryStream(buffer)) { //xxx } 原因是buffer的长度过短,当接受到 ...

  5. 红杉AI闭门会:AI 不再卖工具,而是卖收益

    AI创业失败,经验教训分享可私聊... 近来,AI圈最值得关注的应该是在旧金山召开的红杉资本AI峰会. 敏感的同学会清楚,钱在哪里,哪里就有发展,如果能迎合资本市场,那就有可能活得很好,所以我们今天就 ...

  6. odoo14里面给所有模型添加方法

    给所有的model都添加一个方法, 即所有的model都能调用[类似于create.write.unlink.read]. 方式一: from odoo import api, fields, mod ...

  7. 代码随想录第十天 | 栈与队列part02

      第五章 栈与队列part02 150. 逆波兰表达式求值 本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题 题目链接/文章讲解/视频讲解:https://programmerc ...

  8. 开源 vGPU 方案:HAMi,实现细粒度 GPU 切分

    本文主要分享一个开源的 GPU 虚拟化方案:HAMi,包括如何安装.配置以及使用. 相比于上一篇分享的 TimeSlicing 方案,HAMi 除了 GPU 共享之外还可以实现 GPU core.me ...

  9. 《Android开发——Android Studio的下载、安装与配置》

    Android开发--Android Studio的下载.安装与配置 一.下载: Android Studio最新的版本有一些BUG,不稳定,推荐安装老版本. 在正式安装Android Studio之 ...

  10. 记录一次OPENCV安装的排坑之路

    1.首先从opencv官网上下载 2.下载之后可以得到opencv的源代码文件,解压后是这个样子 3.下载cmake 选择Installer安装,安装完了就会看见这个玩意 4.下载opencv con ...