凡凡開了一間寵物收養場。收養場提供兩種服務:收養被主人遺棄的寵物和讓新的主人領養這些寵物。
每個領養者都希望領養到自己滿意的寵物,凡凡根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a(a是乙個正整數,a<2^31),而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠很方便的處理整個領養寵物的過程了,寵物收養場總是會有兩種情況發生:被遺棄的寵物過多或者是想要收養寵物的人太多,而寵物太少。
被遺棄的寵物過多時,假若到來乙個領養者,這個領養者希望領養的寵物的特點值為a,那麼它將會領養乙隻目前未被領養的寵物中特點值最接近a的乙隻寵物。(任何兩隻寵物的特點值都不可能是相同的,任何兩個領養者的希望領養寵物的特點值也不可能是一樣的)如果有兩隻滿足要求的寵物,即存在兩隻寵物他們的特點值分別為a-b和a+b,那麼領養者將會領養特點值為a-b的那只寵物。
收養寵物的人過多,假若到來乙隻被收養的寵物,那麼哪個領養者能夠領養它呢?能夠領養它的領養者,是那個希望被領養寵物的特點值最接近該寵物特點值的領養者,如果該寵物的特點值為a,存在兩個領養者他們希望領養寵物的特點值分別為a-b和a+b,那麼特點值為a-b的那個領養者將成功領養該寵物。
乙個領養者領養了乙個特點值為a的寵物,而它本身希望領養的寵物的特點值為b,那麼這個領養者的不滿意程度為abs(a-b)。
你得到了一年當中,領養者和被收養寵物到來收養所的情況,請你計算所有收養了寵物的領養者的不滿意程度的總和。這一年初始時,收養所裡面既沒有寵物,也沒有領養者。
輸入格式:
第一行為乙個正整數n,n<=80000,表示一年當中來到收養場的寵物和領養者的總數。接下來的n行,按到來時間的先後順序描述了一年當中來到收養場的寵物和領養者的情況。每行有兩個正整數a, b,其中a=0表示寵物,a=1表示領養者,b表示寵物的特點值或是領養者希望領養寵物的特點值。(同一時間呆在收養所中的,要麼全是寵物,要麼全是領養者,這些寵物和領養者的個數不會超過10000個)
輸出格式:
僅有乙個正整數,表示一年當中所有收養了寵物的領養者的不滿意程度的總和mod 1000000以後的結果。
輸入樣例#1: 複製
50 2
0 4
1 31 2
1 5
輸出樣例#1: 複製
3注:abs(3-2) + abs(2-4)=3,
最後乙個領養者沒有寵物可以領養。
1 #include2 #include3using
namespace
std;45
const
int n = 100100;6
const
int mod = 1000000;7
8int ch[n][2
],fa[n],siz[n],data[n];
9int
root,tn;
1011 inline char
nc()
15 inline int
read()
23 inline int son(int
x) 26 inline void pushup(int
x) 29 inline void rotate(int
x) 36 inline void splay(int x,int
rt) 44}
45}46 inline int getpre(int
x) 52
return
ans;53}
54 inline int getsuc(int
x) 60
return
ans;61}
62 inline int getk(int
k) 71 ans ++;
72 p = ch[p][1
];73}74
}75}76 inline int getkth(int
k) 85}86
}87 inline void insert(int
x) 94
int p = root,pa = 0;95
while (true
) 105
}106
}107 inline void clear(int
x) 110 inline void delete(int
x) 113
if (!ch[root][0
]) 116
else
if (!ch[root][1
]) 119
int tmp = root,pre = ch[root][0
];120
while (ch[pre][1]) pre = ch[pre][1
];121 splay(pre,0
);122 ch[root][1] = ch[tmp][1
];123 fa[ch[tmp][1]] =root;
124clear(tmp);
125pushup(root);
126}
127int
main()
132if (a==s)
133int p1 = getpre(b),p2 =getsuc(b);
134int k1 = data[p1],k2 =data[p2];
135if (k1 &&k2)
140else
if (k1) ans += abs(k1-b),ans = ans%mod,delete(k1);
141else
if (k2) ans += abs(k2-b),ans = ans%mod,delete(k2);
142}
143 ans = ans%mod;
144 printf("%d"
,ans);
145return0;
146 }
來一發set
只是略慢,實測set在開o2的情況下 與 splay不開o2的情況下差不多。
1 #include2 #include3 #include4 #include5
6const
int mod = 1000000;7
using
namespace
std;89
10 inline char
nc()
14 inline int
read()
2223
sets;
24set
::iterator it;
2526
intmain()
2732
if (a == sta)
33 it =s.lower_bound(b);
34 k2 = *it;
35if (it==s.end()) t2 = 0; //
左閉右開
36else
if (k2==b) continue;37
if (it == s.begin()) t1 = 0;38
else it--,k1 = *it;
3940
if (t1 &&t2)
45else
if (t1) ans += abs(k1-b),ans = ans%mod,s.erase(k1);
46else
if (t2) ans += abs(k2-b),ans = ans%mod,s.erase(k2);47}
48 ans = ans %mod;
49 printf("%d"
,ans);
50return0;
51 }
P2286 HNOI2004 寵物收養場
凡凡開了一間寵物收養場。收養場提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,凡凡根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠...
洛谷P2286 HNOI2004 寵物收養場
凡凡開了一間寵物收養場。收養場提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,凡凡根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠...
洛谷P2286 HNOI2004 寵物收養場
凡凡開了一間寵物收養場。收養場提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,凡凡根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠...