考虑每种颜色的贡献,用总数 \(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. (Pytorch第三天)复制官网教程程序遇到的一系列报错

    先说一下,我之前没学过Python,但是鉴于我是一名c语言高手(雾),我决定现学现用. 首先是https://pytorch.org/tutorials/beginner/basics/optimiz ...

  2. TGCTF-misc全解

    TGCTF-misc方向wp next is the end 下载压缩包,拉出第一层文件夹,直接嵌套读取内容找flag import os def is_last_level_dir(director ...

  3. Number of Atoms——LeetCode进阶路

    原题链接https://leetcode.com/problems/number-of-atoms/ 题目描述 Given a chemical formula (given as a string) ...

  4. JVM知识总结-01

    1 程序计数器   程序计数寄存器(Program Counter Register),是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是 ...

  5. odoo14里面开发一个简单的action.client 的tag 模板例子

    1.js模板  web_template.js odoo.define('web', function (require) { "use strict"; var core = r ...

  6. GGTalk 开源即时通讯系统源码剖析之:远程磁盘 (低调赠送GGTalk最新源码)

    继上篇<GGTalk 开源即时通讯系统源码剖析之:聊天消息防错漏机制>介绍了 GGTalk 对消息的可靠性,即消息的不丢失和不重复做了一系列优化处理,以保证不会错漏消息.这篇我们来剖析 G ...

  7. BAPI_OUTB_DELIVERY_CREATE_SLS、BAPI_OUTB_DELIVERY_CONFIRM_DEC 创建交货单,交货单过账

    FUNCTION zsd_dn_create1. *"-------------------------------------------------------------------- ...

  8. Java并发利器:CountDownLatch深度解析与实战应用

    Java并发利器:CountDownLatch深度解析与实战应用 多线程编程中,让主线程等待所有子任务完成是个常见需求.CountDownLatch就像一个倒计时器,当所有任务完成后,主线程才继续执行 ...

  9. vert.x 初识

    中文文档:https://vertx-china.github.io/ 官方文档:https://vertx.io/ 客户端仓库模块:https://github.com/vert-x3/vertx- ...

  10. ASP.NET 5 with Dapr 初体验

    分布式应用运行时Dapr目前已经发布了1.1.0版本,阿里云也在积极地为Dapr贡献代码和落地实践.作为一名开发者,自然也想玩一玩,看看Dapr带来的新"视"界到底是怎么样的. 1 ...