1. 程式人生 > >Physical Education Lessons Codeforces - 915E

Physical Education Lessons Codeforces - 915E

amp clas spa targe less 復雜 ESS 思路 names

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

大概有幾種思路:

1.動態開點線段樹+標記下傳

#1.1標記永久化:想了一會沒想出來

1.2可以先掃一遍詢問把所有需要的點建出來,然後pushdown就不管沒建出來的點了,空間跟標記永久化一樣

2.離散化+線段樹

3.用splay維護區間(估計沒人願意去寫)

4.用一個set<pair<int,int>>記所有非工作日(或工作日)區間,修改就暴力找到相關的區間去改

由於每一次操作最多多出O(1)個區間,因此盡管有時會一次刪掉多個區間,但復雜度是對的

 1 #include<cstdio>
 2
#include<algorithm> 3 #include<set> 4 #define fi first 5 #define se second 6 using namespace std; 7 typedef pair<int,int> P; 8 set<P> s; 9 set<P>::iterator it; 10 int ans,n,q; 11 int main() 12 { 13 int i,idx,l,r;P t; 14 scanf("%d%d",&n,&q);ans=n;s.insert(P(n,1
)); 15 while(q--) 16 { 17 scanf("%d%d%d",&l,&r,&idx); 18 it=s.lower_bound(P(l,0)); 19 if(it!=s.end()&&it->se<=l) 20 { 21 t=*it;s.erase(it); 22 if(l!=t.se) s.insert(P(l-1,t.se)); 23 s.insert(P(t.fi,l));
24 } 25 it=s.lower_bound(P(r,0)); 26 if(it!=s.end()&&it->se<=r) 27 { 28 t=*it;s.erase(it); 29 if(t.fi!=r) s.insert(P(t.fi,r+1)); 30 s.insert(P(r,t.se)); 31 } 32 for(it=s.lower_bound(P(l,0));it!=s.end()&&it->fi<=r;it=s.lower_bound(P(l,0))) 33 ans-=it->fi-it->se+1,s.erase(it); 34 if(idx==2) s.insert(P(r,l)),ans+=r-l+1; 35 printf("%d\n",ans); 36 } 37 return 0; 38 }

Physical Education Lessons Codeforces - 915E