【线段树区间最值单点更新模板】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 }
View Code

 

posted @ 2017-10-03 22:53  shulin15  阅读(145)  评论(0编辑  收藏  举报