码迷,mamicode.com
首页 > 其他好文 > 详细

HDU5140---Hun Gui Wei Company (主席树)

时间:2014-12-08 21:14:46      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   on   

主席树太强大了,,如果仅仅用来求第k大就太屈才了。。貌似和HDU4605差不多,那个是在图上根据点的顺序建立主席树,这个是根据年龄大小 或者等级高低建立主席树。

题意 大致就是一个二维区间的求和,但是数量级很大,显然不能直接求。

一个想法是可以二维线段树,但是这样显然会MLE。

另外一个还是主席树,以age或者level顺序建立主席树,我是以age建立的。

然后对应的查找就是 查找 tree[LA-1] 、tree[HA]之间的线段树 等级在LL HL之间的salary的和。

题目强制要求在线算,只需要把 k更新后询问的LL HL LA HA 离散化就可以了。

  1 #include <cstdio>
  2 #include <string>
  3 #include <vector>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <algorithm>
  7 using namespace std;
  8 typedef unsigned long long ull;
  9 typedef long long ll;
 10 const int inf = 0x3f3f3f3f;
 11 const double eps = 1e-8;
 12 const int maxn = 1e5+10;
 13 int tot,tree[maxn],c[maxn*20],lson[maxn*20],rson[maxn*20];
 14 ll sum[maxn*20];
 15 int build (int l, int r)
 16 {
 17     int root = tot++;
 18     c[root] = sum[root] = 0;
 19     if (l != r)
 20     {
 21         int mid = (l + r) >> 1;
 22         lson[root] = build(l,mid);
 23         rson[root] = build(mid+1,r);
 24     }
 25     return root;
 26 }
 27 int MAX;
 28 int update (int root,int pos,int val,ll sa)
 29 {
 30     int newroot = tot++;
 31     int tmp = newroot;
 32     int l = 1, r = MAX;
 33     c[newroot] = c[root] + val;
 34     sum[newroot] = sum[root] + sa;
 35     while (l < r)
 36     {
 37         int mid = (l + r) >> 1;
 38         if (pos <= mid)
 39         {
 40             r = mid;
 41             rson[newroot] = rson[root];
 42             root = lson[root];
 43             lson[newroot] = tot++;
 44             newroot = lson[newroot];
 45         }
 46         else
 47         {
 48             l = mid + 1;
 49             lson[newroot] = lson[root];
 50             root = rson[root];
 51             rson[newroot] = tot++;
 52             newroot = rson[newroot];
 53         }
 54         c[newroot] = c[root] + val;
 55         sum[newroot] = sum[root] + sa;
 56     }
 57     return tmp;
 58 }
 59 ll query(int root1,int root2,int l,int r,int ua,int ub)
 60 {
 61     if (ua > ub)
 62         return 0;
 63     if (ua <= l && ub >= r)
 64     {
 65         return sum[root2] - sum[root1];
 66     }
 67     int mid = (l + r) >> 1;
 68     ll t1 = 0, t2 = 0;
 69     if (ua <= mid)
 70         t1 = query(lson[root1],lson[root2],l,mid,ua,ub);
 71     if (ub > mid)
 72         t2 = query(rson[root1],rson[root2],mid+1,r,ua,ub);
 73     return t1 + t2;
 74 }
 75 int lev[maxn],idx1,idx2,age[maxn];
 76 
 77 struct worker
 78 {
 79     int s,l,a;
 80     bool operator < (const worker &rhs)const
 81     {
 82         return a < rhs.a;
 83     }
 84 } per[maxn];
 85 int main(void)
 86 {
 87 #ifndef ONLINE_JUDGE
 88     freopen("in.txt","r",stdin);
 89  #endif
 90     int n;
 91     while (~scanf ("%d",&n))
 92     {
 93         tot = 0;
 94         memset(sum,0,sizeof(sum));
 95         MAX = n;
 96         int max_age = 0,min_age = inf;
 97         for (int i = 1; i <= n; i++)
 98         {
 99             scanf ("%d%d%d",&per[i].s, &per[i].l, &per[i].a);
100             age[i-1] = per[i].a;
101             lev[i-1] = per[i].l;
102             max_age = max(max_age,age[i-1]);
103             min_age = min(min_age,age[i-1]);
104         }
105         sort(per+1, per+1+n);
106         sort(age, age+n);
107         sort(lev, lev+n);
108         idx1 = n;
109         idx2 = unique(lev,lev+n) - lev;
110 
111         tree[0] = build(1,n);
112         for (int i = 1; i <= n; i++)
113         {
114             int tmp = lower_bound(lev,lev+idx2,per[i].l) - lev + 1;
115             tree[i] = update(tree[i-1], tmp, 1, (ll)per[i].s);
116         }
117         int Q;
118         ll k = 0;
119         scanf ("%d",&Q);
120         for (int i = 0; i < Q; i++)
121         {
122             ll LL,HL,LA,HA;
123             scanf ("%I64d%I64d%I64d%I64d",&LL,&HL,&LA,&HA);
124             LL += k, HL -= k;
125             LA += k, HA -= k;
126             if (LL > HL)
127                 swap(LL, HL);
128             if (LA > HA)
129                 swap(LA, HA);
130             LA = max(LA, (ll)0);
131             HA = min(HA, (ll)1000000000);
132             int idx_la = lower_bound(age,age+idx1,LA) - age + 1;
133             int idx_ha = lower_bound(age,age+idx1,HA) - age + 1;
134             if (age[idx_ha-1] == HA)
135             {
136                 while (age[idx_ha-1] == HA && idx_ha <= n)
137                     idx_ha ++;
138                 idx_ha--;
139             }
140             else
141                 idx_ha--;
142             LL = max(LL,(ll)0);
143             HL = min(HL,(ll)1000000000);
144             int i1 = lower_bound(lev,lev+idx2,LL) - lev + 1;
145             int i2 = lower_bound(lev,lev+idx2,HL) - lev + 1;
146             if (lev[i2-1] > HL)
147                 i2--;
148             k = query(tree[idx_la-1],tree[idx_ha],1,MAX,i1,i2);
149             printf("%I64d\n",k);
150         }
151     }
152     return 0;
153 }
154 
155 /*
156 5
157 1 2 2
158 2 3 3
159 3 4 4
160 4 5 6
161 6 5 8
162 1
163 2 3 2 8
164 
165 3
166 5 6 4
167 2 8 6
168 4 8 6
169 1
170 6 8 4 6
171 */

 

HDU5140---Hun Gui Wei Company (主席树)

标签:style   blog   io   ar   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/oneshot/p/4151843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!