美文网首页
珂朵莉树

珂朵莉树

作者: 云中翻月 | 来源:发表于2020-11-24 21:39 被阅读0次

适用题目特征

数据随机条件下,维护包含区间整体赋值的操作。(即推平一段区间)

原理

珂朵莉树会将一段相同的区间用一个三元组(l,r,val)表示。因此当数据随即时,若干次操作后,期望的三元组数量会在log(n)级别。此时对于每次区间赋值操作,只需要将对应区间分离出来,拆成两部分修改后在拼回去即可。

例题

Luogu P2572
PS:目前该题数据已不再随机生成,以下代码并无法通过所有测试点。
代码如下

/*
Luogu P2572
*/
#define method_1
#ifdef method_1
/*

*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<ctime>
#include<string>
#include<bitset>
#define D(x) cout<<#x<<" = "<<x<<"  "
#define E cout<<endl
#define rep(i,s,t) for(int i=(s);i<=(t);i++)
#define rep0(i,s,t) for(int i=(s);i<(t);i++)
#define rrep(i,t,s) for(int i=(t);i>=(s);i--)
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int maxn=1e5+5;
const int INF=0x3f3f3f3f;
int n,m;
struct node{
    int l,r;mutable int val;
    bool operator<(const node &h)const{return l<h.l;}
};
set<node>tr;
#define IT set<node>::iterator
IT split(int pos){
    IT it=tr.lower_bound((node){pos});
    if(it!=tr.end()&&it->l==pos) return it;
    it--;
    int nl=it->l,nr=it->r,nval=it->val;
    tr.erase(it);
    tr.insert((node){nl,pos-1,nval});
    return tr.insert((node){pos,nr,nval}).first;
}
void assign(int l,int r,int val){
    IT itr=split(r+1),itl=split(l);
    tr.erase(itl,itr);
    tr.insert((node){l,r,val});
}
void reverse(int l,int r){
    IT itr=split(r+1),itl=split(l);
    for(;itl!=itr;++itl) itl->val^=1;
}
int ask1(int l,int r){
    int res=0;
    IT itr=split(r+1),itl=split(l);
    for(;itl!=itr;++itl) res+=(itl->r-itl->l+1)*itl->val;
    return res;
}
int ask2(int l,int r){
    int mx=0,sum=0;
    IT itr=split(r+1),itl=split(l);
    for(;itl!=itr;++itl) if(itl->val==1) sum+=itl->r-itl->l+1; else mx=max(mx,sum),sum=0;
    return max(mx,sum);
}
void solve(){
    int op,l,r;
    scanf("%d%d%d",&op,&l,&r);
    if(op==0) assign(l,r,0);
    if(op==1) assign(l,r,1);
    if(op==2) reverse(l,r);
    if(op==3) printf("%d\n",ask1(l,r));
    if(op==4) printf("%d\n",ask2(l,r));
}
int main() {
//  ios::sync_with_stdio(false);
//  freopen("序列操作.in","r",stdin);
    scanf("%d%d",&n,&m);
    int x;
    rep(i,1,n) scanf("%d",&x),tr.insert((node){i-1,i-1,x});
    tr.insert((node){n,n,0});
    while(m--) solve();
    return 0;
}
#endif
#ifdef method_2
/*

*/

#endif
#ifdef method_3
/*

*/

#endif

相关文章

  • 珂朵莉树

    适用题目特征 在数据随机条件下,维护包含区间整体赋值的操作。(即推平一段区间) 原理 珂朵莉树会将一段相同的区间用...

  • 珂朵莉,欢迎回来

    《末日之际在做什么?有没有空呢?可以来拯救吗?》是一部我曾经听名字就直接不会去看的轻小说,因为业界轻小说的套路就是...

  • 珂学家:大概除了她自己,没人觉得她幸福

    “抱歉……我已经,绝对不可能再获得幸福了……因为,我早已被幸福包围。”说罢,珂朵莉纵身跃下飞艇,笔直朝地面落去,她...

  • 干货,教你怎么用经常在动漫里看到的“って”和"し&qu

    原句: 威廉:病人がいるからな 珂朵莉:病人って 对就是这个“って”,今天尼酱给你们总结所有“って”的用法。 首先...

  • 末日时在做什么,有没有空,可以来拯救吗

    珂朵莉:我曾经发誓要永远和他在一起,能够如此发誓,让我无比幸福。 威廉:我曾经发誓要永远和她在一起,能够如此发誓,...

  • 朵慕与莉娜 (二)

    莉娜跟着朵慕来找朵慕的妈妈来分享这份喜悦。朵慕的妈妈竟然就在学校附近的家具店里打工,莉娜惊呆了。莉娜这...

  • 严莉(五)

    严莉不理他,蒲树直接开车回家,放下行李箱。蒲树要走,严莉问他去哪儿?蒲树:“还能去哪儿,公司呀!” 严莉:“你先别...

  • 来,我们一起去种树

    种一棵树,的最佳时间是10年前,其次是现在。 01 休息的时候,珂珂(最近珂珂曝光率较高,谁叫我们住一个房间)在那...

  • 《奔跑吧,朵莉!》

    朵莉在遇到咩咩之前觉得自由就是可以决定甜点在饭前吃还是饭后吃,甜点是蛋糕还是蛋挞,甜度是五分还是七分。 在遇到咩咩...

  • 豌豆与朵莉

    第一章 遇见小豌豆 朵莉是一个小女孩,特别喜欢吃豌豆,有...

网友评论

      本文标题:珂朵莉树

      本文链接:https://www.haomeiwen.com/subject/asvwiktx.html