2019.01.19 codeforces915E.Physical Education Lessons(ODT)

时间:2022-11-29 07:22:26

传送门

ODT水题(当然可以上线段树)

支持区间01覆盖,询问全局1的个数。


思路:直接上ODTODTODT。

不会的点这里

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
struct Node{
    int l,r;
    mutable bool v;
    Node(int l_,int r_=-1,bool v_=0):l(l_),r(r_),v(v_){}
    friend inline bool operator<(const Node&a,const Node&b){return a.l<b.l;}
};
set<Node>S;
int ans;
typedef set<Node>::iterator It;
inline It split(int pos){
    It it=S.lower_bound(Node(pos));
    if(it!=S.end()&&it->l==pos)return it;
    --it;
    int L=it->l,R=it->r;
    bool v=it->v;
    return S.erase(it),S.insert(Node(L,pos-1,v)),S.insert(Node(pos,R,v)).first;
}
inline void assign(int l,int r,bool v){
    It R=split(r+1),L=split(l);
    for(It it=L;it!=R;++it)ans-=it->v*(it->r-it->l+1);
    S.erase(L,R),ans+=(r-l+1)*v,S.insert(Node(l,r,v));
}
int main(){
    S.insert(Node(1,ans=read(),1));
    for(ri tt=read(),l,r,k;tt;--tt)l=read(),r=read(),k=read()-1,assign(l,r,k),cout<<ans<<'\n';
    return 0;
}