社区讨论

线段树求条,玄小号1关

P14268[ROI 2015 Day2] 路灯参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhj0ug9h
此快照首次捕获于
2025/11/03 18:53
4 个月前
此快照最后确认于
2025/11/03 18:53
4 个月前
查看原帖
rt,被创死了。
大号被禁言了,玄的是这个号的。
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5;
string s;
int n,q;
struct Node
{
    int sum,mx,lz;
}tr[N<<2];
void build(int id,int l,int r)
{
    if(l==r)
	{
        tr[id].sum=0;
        tr[id].mx=l-1;
        tr[id].lz=0;
        return;
    }
    int mid=l+r>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
    tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;
    tr[id].mx=max(tr[id<<1].mx,tr[id<<1|1].mx);
}
void apply(int id,int l,int r,int v)
{
    if(v>tr[id].mx)
	{
        tr[id].mx=v;
        tr[id].sum=(v-l+1+v-r+1)*(r-l+1)/2;
        tr[id].lz=max(tr[id].lz,v);
    }
}
void pushdown(int id,int l,int r)
{
    if(tr[id].lz)
	{
        int mid=l+r>>1;
        apply(id<<1,l,mid,tr[id].lz);
        apply(id<<1|1,mid+1,r,tr[id].lz);
        tr[id].lz=0;
    }
}
void upd(int id,int l,int r,int ql,int qr,int v)
{
    if(ql>r||qr<l||tr[id].mx>=v) return;
    if(ql<=l&&r<=qr)
	{
        apply(id,l,r,v);
        return;
    }
    pushdown(id,l,r);
    int mid=l+r>>1;
    upd(id<<1,l,mid,ql,qr,v);
    upd(id<<1|1,mid+1,r,ql,qr,v);
    tr[id].sum=tr[id<<1].sum+tr[id<<1|1].sum;
    tr[id].mx=max(tr[id<<1].mx,tr[id<<1|1].mx);
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>q>>s;
    s=" "+s;
    build(1,1,n);
    for(int i=1;i<=n;)
	{
        if(s[i]=='1')
		{
            int j=i;
            while(j<=n&&s[j]=='1') j++;
            upd(1,1,n,i,j-1,j-1);
            i=j;
        }
		else i++;
    }
    cout<<tr[1].sum<<endl;
    while(q--)
	{
        int l,r,c;
        cin>>l>>r>>c;
        if(c==1) upd(1,1,n,l,r,r);
        cout<<tr[1].sum<<endl;
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...