# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
60927 |
2018-07-25T02:18:32 Z |
ngkan146 |
Teams (IOI15_teams) |
C++11 |
|
2377 ms |
224656 KB |
#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
typedef pair<int,int> ii;
typedef pair<ii,int> iiI;
#define fi first
#define se second
struct persistentSeg{
struct node{
int val, Lnode, Rnode;
};
node seg[N * 25];
int root[N];
int totalNode;
persistentSeg(){
for(int i=1;i<=2000000;i++){
seg[i].Lnode = 2*i;
seg[i].Rnode = 2*i+1;
}
root[0] = 1;
totalNode = 2000000;
}
int upd(int id,int l,int r,int pos,int value){
int newNode = ++totalNode;
seg[newNode] = seg[id];
if (l == r){
seg[newNode].val += value;
return newNode;
}
int mid = (l+r)/2;
if (pos <= mid){
seg[newNode].Lnode = upd(seg[newNode].Lnode, l, (l+r)/2, pos, value);
}
else{
seg[newNode].Rnode = upd(seg[newNode].Rnode, (l+r)/2+1, r, pos, value);
}
seg[newNode].val = seg[seg[newNode].Lnode].val + seg[seg[newNode].Rnode].val;
return newNode;
}
int get(int id,int l,int r,int u,int v){
if (v < l || r < u)
return 0;
if (u <= l && r <= v)
return seg[id].val;
return get(seg[id].Lnode, l, (l+r)/2, u, v) + get(seg[id].Rnode, (l+r)/2+1, r, u, v);
}
};
int n;
ii range[N];
persistentSeg seg;
vector <int> lis[N];
void init(int nn, int A[], int B[]) {
n = nn;
for(int i=0;i<n;i++){
lis[A[i]].push_back(B[i]);
}
for(int i=1;i<=n;i++){
seg.root[i] = seg.root[i-1];
for(auto v: lis[i])
seg.root[i] = seg.upd(seg.root[i], 1, n, v, 1);
}
}
iiI del[500]; int delSz;
int can(int m, int lst[]) {
//~~~~~~~~~~~~~~~~prep~~~~~~~~~~~~~~~~~~~~~~
set <int> s;
int tmp = 0;
for(int i=0;i<m;i++){
tmp = min(n+1, tmp + lst[i]);
s.insert(lst[i]);
}
if (tmp > n)
return 0;
int newM = 0;
int ask[s.size()+5] = {}, askTimes[s.size()+5] = {};
ask[0] = 0;
for(set<int>::iterator it = s.begin(); it != s.end(); it++){
ask[++newM] = *it;
}
for(int i=0;i<m;i++){
askTimes[lower_bound(ask+1,ask+newM+1,lst[i]) - ask] ++;
}
//~~~~~~~~~~~~~~~solve~~~~~~~~~~~~~~~~~~~~~
delSz = 0;
del[delSz++] = iiI({{n, 0}, 0});
for(int i=1;i<=newM;i++){
while(delSz && del[delSz-1].fi.fi < ask[i]) delSz--;
int need = ask[i] * askTimes[i];
int last = ask[i];
while(delSz){
int current = seg.get(seg.root[ask[i]], 1, n, last, del[delSz-1].fi.fi)
- seg.get(seg.root[del[delSz-1].fi.se], 1, n, last, del[delSz-1].fi.fi)
+ del[delSz-1].se;
if (need <= current) break;
else
last = del[delSz-1].fi.fi+1,
need -= current,
delSz--;
}
if (!delSz) return 0;
int moreNeed = need + (last == 1 ? 0 : seg.get(seg.root[ask[i]], 1, n, 1, last-1)
- seg.get(seg.root[del[delSz-1].fi.se], 1, n, 1, last-1));
int id1 = seg.root[ask[i]], id2 = seg.root[del[delSz-1].fi.se], L = 1, R = n;
while(L != R){
int mid = (L + R)/2;
int cur = seg.seg[seg.seg[id1].Lnode].val
- seg.seg[seg.seg[id2].Lnode].val
+ del[delSz-1].se * (mid >= del[delSz-1].fi.fi);
if (cur >= moreNeed)
id1 = seg.seg[id1].Lnode,
id2 = seg.seg[id2].Lnode,
R = mid;
else
moreNeed -= cur,
id1 = seg.seg[id1].Rnode,
id2 = seg.seg[id2].Rnode,
L = mid+1;
}
//~ int L = last-1, R = del[delSz-1].fi.fi, cur;
//~ while(L+1<R){
//~ int mid = (L+R)/2;
//~ cur = seg.get(seg.root[ask[i]], 1, n, last, mid)
//~ - seg.get(seg.root[del[delSz-1].fi.se], 1, n, last, mid)
//~ + del[delSz-1].se * (mid == del[delSz-1].fi.fi);
//~ if (cur >= need)
//~ R = mid;
//~ else
//~ L = mid;
//~ }
int cur = seg.get(seg.root[ask[i]], 1, n, last, R)
- seg.get(seg.root[del[delSz-1].fi.se], 1, n, last, R)
+ del[delSz-1].se * (R == del[delSz-1].fi.fi);
while(delSz && del[delSz-1].fi.fi <= R) delSz--;
del[delSz++] = iiI({ii(R, ask[i]), cur - need});
}
return 1;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
28 ms |
35576 KB |
Output is correct |
2 |
Correct |
29 ms |
35656 KB |
Output is correct |
3 |
Correct |
39 ms |
35764 KB |
Output is correct |
4 |
Correct |
40 ms |
35764 KB |
Output is correct |
5 |
Correct |
38 ms |
35764 KB |
Output is correct |
6 |
Correct |
37 ms |
35764 KB |
Output is correct |
7 |
Correct |
37 ms |
35776 KB |
Output is correct |
8 |
Correct |
40 ms |
35828 KB |
Output is correct |
9 |
Correct |
39 ms |
35828 KB |
Output is correct |
10 |
Correct |
42 ms |
35828 KB |
Output is correct |
11 |
Correct |
29 ms |
35828 KB |
Output is correct |
12 |
Correct |
38 ms |
35828 KB |
Output is correct |
13 |
Correct |
30 ms |
35828 KB |
Output is correct |
14 |
Correct |
40 ms |
35828 KB |
Output is correct |
15 |
Correct |
35 ms |
35828 KB |
Output is correct |
16 |
Correct |
31 ms |
35828 KB |
Output is correct |
17 |
Correct |
36 ms |
35828 KB |
Output is correct |
18 |
Correct |
35 ms |
35828 KB |
Output is correct |
19 |
Correct |
34 ms |
35828 KB |
Output is correct |
20 |
Correct |
36 ms |
35828 KB |
Output is correct |
21 |
Correct |
32 ms |
35832 KB |
Output is correct |
22 |
Correct |
30 ms |
35832 KB |
Output is correct |
23 |
Correct |
37 ms |
35832 KB |
Output is correct |
24 |
Correct |
33 ms |
35832 KB |
Output is correct |
25 |
Correct |
32 ms |
35832 KB |
Output is correct |
26 |
Correct |
32 ms |
35832 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
159 ms |
59556 KB |
Output is correct |
2 |
Correct |
169 ms |
59556 KB |
Output is correct |
3 |
Correct |
159 ms |
59576 KB |
Output is correct |
4 |
Correct |
155 ms |
59908 KB |
Output is correct |
5 |
Correct |
63 ms |
59908 KB |
Output is correct |
6 |
Correct |
84 ms |
59908 KB |
Output is correct |
7 |
Correct |
71 ms |
59908 KB |
Output is correct |
8 |
Correct |
72 ms |
59908 KB |
Output is correct |
9 |
Correct |
79 ms |
59908 KB |
Output is correct |
10 |
Correct |
80 ms |
59908 KB |
Output is correct |
11 |
Correct |
77 ms |
59908 KB |
Output is correct |
12 |
Correct |
75 ms |
59908 KB |
Output is correct |
13 |
Correct |
93 ms |
59908 KB |
Output is correct |
14 |
Correct |
92 ms |
59908 KB |
Output is correct |
15 |
Correct |
124 ms |
59908 KB |
Output is correct |
16 |
Correct |
145 ms |
59908 KB |
Output is correct |
17 |
Correct |
68 ms |
59908 KB |
Output is correct |
18 |
Correct |
68 ms |
59908 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
185 ms |
59972 KB |
Output is correct |
2 |
Correct |
182 ms |
59972 KB |
Output is correct |
3 |
Correct |
619 ms |
63000 KB |
Output is correct |
4 |
Correct |
165 ms |
63000 KB |
Output is correct |
5 |
Correct |
217 ms |
63000 KB |
Output is correct |
6 |
Correct |
213 ms |
63000 KB |
Output is correct |
7 |
Correct |
96 ms |
63000 KB |
Output is correct |
8 |
Correct |
164 ms |
63000 KB |
Output is correct |
9 |
Correct |
64 ms |
63000 KB |
Output is correct |
10 |
Correct |
78 ms |
63000 KB |
Output is correct |
11 |
Correct |
97 ms |
63000 KB |
Output is correct |
12 |
Correct |
235 ms |
63000 KB |
Output is correct |
13 |
Correct |
407 ms |
63000 KB |
Output is correct |
14 |
Correct |
677 ms |
63000 KB |
Output is correct |
15 |
Correct |
264 ms |
63000 KB |
Output is correct |
16 |
Correct |
200 ms |
63000 KB |
Output is correct |
17 |
Correct |
143 ms |
63000 KB |
Output is correct |
18 |
Correct |
146 ms |
63000 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1010 ms |
168800 KB |
Output is correct |
2 |
Correct |
1027 ms |
168800 KB |
Output is correct |
3 |
Correct |
2247 ms |
174460 KB |
Output is correct |
4 |
Correct |
978 ms |
174460 KB |
Output is correct |
5 |
Correct |
651 ms |
174460 KB |
Output is correct |
6 |
Correct |
581 ms |
174460 KB |
Output is correct |
7 |
Correct |
332 ms |
174460 KB |
Output is correct |
8 |
Correct |
544 ms |
174460 KB |
Output is correct |
9 |
Correct |
264 ms |
174460 KB |
Output is correct |
10 |
Correct |
283 ms |
174480 KB |
Output is correct |
11 |
Correct |
367 ms |
178132 KB |
Output is correct |
12 |
Correct |
700 ms |
182908 KB |
Output is correct |
13 |
Correct |
1345 ms |
190552 KB |
Output is correct |
14 |
Correct |
2377 ms |
204480 KB |
Output is correct |
15 |
Correct |
946 ms |
209184 KB |
Output is correct |
16 |
Correct |
917 ms |
216424 KB |
Output is correct |
17 |
Correct |
452 ms |
218176 KB |
Output is correct |
18 |
Correct |
433 ms |
224656 KB |
Output is correct |