【权值分块】bzoj1208 [HNOI2004]宠物收养所

不多说。比pb_ds还是要快不少的。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 using namespace std;
 5 #define N 80001
 6 int sum,sz,num[N],l[295],r[295],a[N],op[N],en,ma[N],ans,n;
 7 inline void R(int &x){
 8     char c=0;int f=1;
 9     for(;c<‘0‘||c>‘9‘;c=getchar())if(c==‘-‘)f=-1;
10     for(x=0;c>=‘0‘&&c<=‘9‘;c=getchar())(x*=10)+=(c-‘0‘);
11     x*=f;
12 }
13 void makeblock()
14 {
15     sz=sqrt(en); if(!sz) sz=1;
16     for(sum=1;sum*sz<en;sum++)
17       {
18         l[sum]=r[sum-1]+1;
19         r[sum]=sum*sz;
20         for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
21       }
22     l[sum]=r[sum-1]+1;
23     r[sum]=en;
24     for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
25 }
26 struct Val_Blocks
27 {
28     int sumv[295],Size;
29     bool b[N];
30     inline void Insert(const int &x){b[x]=1; sumv[num[x]]++; Size++;}
31     inline void Delete(const int &x){b[x]=0; sumv[num[x]]--; Size--;}
32     inline int Next(const int &x)
33       {
34         if(b[x]) return x;
35         for(int i=x+1;i<=r[num[x]];i++) if(b[i]) return i;
36         for(int i=num[x]+1;i<=sum;i++) if(sumv[i])
37           for(int j=l[i];;j++)
38             if(b[j]) return j;
39         return -1;
40       }
41     inline int Pre(const int &x)
42       {
43         if(b[x]) return x;
44         for(int i=x-1;i>=l[num[x]];i--) if(b[i]) return i;
45         for(int i=num[x]-1;i>=1;i--) if(sumv[i])
46           for(int j=r[i];;j--)
47             if(b[j]) return j;
48         return -1;
49       }
50 }T[2];
51 struct Point{int v,p;}t[N];
52 bool operator < (const Point &a,const Point &b){return a.v<b.v;}
53 int main()
54 {
55     R(n); for(int i=1;i<=n;i++)
56       {
57           R(op[i]); R(t[i].v);
58           t[i].p=i;
59       } sort(t+1,t+n+1);
60     ma[a[t[1].p]=++en]=t[1].v;
61     for(int i=2;i<=n;i++)
62       {
63           if(t[i].v!=t[i-1].v) en++;
64           ma[a[t[i].p]=en]=t[i].v;
65       } makeblock();
66     for(int i=1;i<=n;i++)
67       {
68           if(!T[op[i]^1].Size) T[op[i]].Insert(a[i]);
69           else
70             {
71                 int Up=T[op[i]^1].Next(a[i]),Down=T[op[i]^1].Pre(a[i]);
72                 if(Up==-1||(Down!=-1&&ma[a[i]]-ma[Down]<=ma[Up]-ma[a[i]]))
73                   {
74                       ans=(ans+ma[a[i]]-ma[Down])%1000000;
75                       T[op[i]^1].Delete(Down);
76                   }
77                 else
78                   {
79                       ans=(ans+ma[Up]-ma[a[i]])%1000000;
80                       T[op[i]^1].Delete(Up);
81                   }
82             }
83       } printf("%d\n",ans);
84     return 0;
85 }
时间: 2024-10-12 21:31:12

【权值分块】bzoj1208 [HNOI2004]宠物收养所的相关文章

[bzoj1208][HNOI2004]宠物收养所

题目好长啊直接copy算了 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领

BZOJ1208: [HNOI2004]宠物收养所 平衡树 Treap 模板题

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被 主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希 望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程 了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个

[bzoj1208][HNOI2004][宠物收养所] (平衡树)

Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^31),而他也给每个处在收养所的宠物一个特点值.这样他就能够很方便的处理整个领养宠物的过程了,宠物收养所总是会有两种情况发生:被遗弃的宠物过多或者是想要收养宠物的人太多,而宠物太少. 1. 被遗弃的宠物过多时,假若到来一个领养者

【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: 1 #include<cstdio> 2 #include<ext/pb_ds/assoc_container.hpp> 3 #include<ext/pb_ds/tree_policy.hpp> 4 using namespace std; 5 using namespace __

bzoj1208: [HNOI2004]宠物收养所 (sbt)

切傻逼题还能wa那么多次我也是醉了 好啦其实是sbt都不会敲了(一直用神器treap) 重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的…… 还是treap大法好&…… 题解还用写么?就是找前驱找后继然后判断一下 const maxn=300000; mm=1<<28; mmm=1000000; var left,right,value,s:array[0..maxn]of longint; ans,n,m,i,j,k,l,t,tot,now:longint; fun

BZOJ 1208: [HNOI2004]宠物收养所

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7514  Solved: 2982[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^

bzoj 1208: [HNOI2004]宠物收养所 set

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7328  Solved: 2892[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^

【BZOJ-1208】宠物收养所 Splay

1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6638  Solved: 2601[Submit][Status][Discuss] Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出该领养者希望领养的宠物的特点值a(a是一个正整数,a<2^

BZOJ 1208: [HNOI2004]宠物收养所(BST)

本来想先用set写一遍,再自己写个splay或treap,不过用set过了之后就懒得去写了....以后有空再来写吧..(不会有空的吧= = --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #incl