【线段树区间最值单点更新模板】BNUOJ 52965 E Excellent Engineers
http://acm.bnu.edu.cn/v3/external/gym/101512.pdf
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define N 100010 5 #define ls(p) (p<<1) 6 #define rs(p) (p<<1|1) 7 const int INF=1e9; 8 struct node 9 { 10 int a,b,c; 11 } p[N]; 12 struct segment 13 { 14 int l,r,min; 15 } t[N<<2]; 16 int n; 17 bool cmpa(const node &p,const node &q) 18 { 19 return p.a<q.a; 20 } 21 void build(int p,int l,int r) 22 { 23 t[p].l=l;t[p].r=r; 24 t[p].min=INF; 25 if(l==r) 26 return ; 27 int mid=l+r>>1; 28 build(ls(p),l,mid); 29 build(rs(p),mid+1,r); 30 } 31 int ask(int p,int l,int r) 32 { 33 if(l<=t[p].l && t[p].r<=r) 34 return t[p].min; 35 int mid=(t[p].l+t[p].r)>>1; 36 int ans=INF; 37 if(l<=mid) ans=min(ans,ask(ls(p),l,r)); 38 if(mid<r) ans=min(ans,ask(rs(p),l,r)); 39 return ans; 40 } 41 void change(int p,int x,int y) 42 { 43 if(t[p].l==t[p].r) 44 { 45 t[p].min=min(t[p].min,y); 46 return; 47 } 48 int mid=(t[p].l+t[p].r)>>1; 49 if(x<=mid) change(ls(p),x,y); 50 else change(rs(p),x,y); 51 t[p].min=min(t[ls(p)].min,t[rs(p)].min); 52 } 53 int main() 54 { 55 int T; 56 scanf("%d",&T); 57 while(T--) 58 { 59 scanf("%d",&n); 60 for(int i=1;i<=n;++i) 61 { 62 scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c); 63 } 64 sort(p+1,p+n+1,cmpa); 65 build(1,1,n); 66 int ans=0; 67 for(int i=1;i<=n;++i) 68 { 69 if(ask(1,1,p[i].b)>p[i].c) ++ans; 70 change(1,p[i].b,p[i].c); 71 } 72 printf("%d\n",ans); 73 } 74 }