1. 程式人生 > >Codeforces 915E Physical Education Lessons 各種資料結構維護

Codeforces 915E Physical Education Lessons 各種資料結構維護

文章目錄

http://codeforces.com/contest/915/problem/E

題意

n,2.12,2.一個長為n的序列,一開始全為2.每次操作將一個區間賦值為1或2,並詢問整體有多少個2.

題解

可以用權值線段樹瞎搞. 當然用某暴力資料結構珂朵莉樹也可以過啦. 每次動態維護答案,用setset合併區間,暴力拆開. 然後就過了. 珂朵莉樹的話全部都是基本操作,具體可以看洛谷上CF896C的題解.

#include<bits/stdc++.h>
//Ithea Myse Valgulious namespace chtholly{ typedef long long ll; #define re0 register int #define rel register ll #define rec register char #define gc getchar //#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?-1:*p1++) #define pc putchar #define p32 pc(' ') #define pl puts("")
/*By Citrus*/ char buf[1<<23],*p1=buf,*p2=buf; inline int read(){ int x=0,f=1;char c=gc(); for (;!isdigit(c);c=gc()) f^=c=='-'; for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0'); return f?x:-x; } template <typename mitsuha> inline bool read(mitsuha &x){ x=0;int f=1
;char c=gc(); for (;!isdigit(c)&&~c;c=gc()) f^=c=='-'; if (!~c) return 0; for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0'); return x=f?x:-x,1; } template <typename mitsuha> inline int write(mitsuha x){ if (!x) return 0&pc(48); if (x<0) pc('-'),x=-x; int bit[20],i,p=0; for (;x;x/=10) bit[++p]=x%10; for (i=p;i;--i) pc(bit[i]+48); return 0; } inline char fuhao(){ char c=gc(); for (;isspace(c);c=gc()); return c; } }using namespace chtholly; using namespace std; struct chtholly_tree{ #define it set<node>::iterator int sum; struct node{ int l,r,val; node(int nl,int nr=-1,int v=0):l(nl),r(nr),val(v){} bool operator <(const node &b) const{ return l<b.l; } }; set<node> s; it split(int pos) { it p=s.lower_bound(node(pos)); if (p!=s.end()&&p->l==pos) return p; --p; int nl=p->l,nr=p->r,v=p->val; s.erase(p); s.insert(node(nl,pos-1,v)); return s.insert(node(pos,nr,v)).first; } void assign(int l,int r,int v) { it p,itr=split(r+1),itl=split(l); for (p=itl;p!=itr;++p) sum-=(p->r-p->l+1)*p->val; s.erase(itl,itr); s.insert(node(l,r,v)),sum+=(r-l+1)*v; } void init(int n) { sum=n; s.insert(node(1,n,1)); } }my_; int main(){ int n=read(),q=read(); my_.init(n); for (;q--;) { int l=read(),r=read(),k=read()-1; my_.assign(l,r,k),write(my_.sum),pl; } }

謝謝大家.