Submission #7925

# Submission time Handle Problem Language Result Execution time Memory
7925 2014-08-25T10:13:17 Z gs14004 허수아비 (JOI14_scarecrows) C++
100 / 100
1444 ms 17056 KB
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;

struct pt{int x,y;}pos[200005];
int cmp1(pt a, pt b){return a.x<b.x;}
int cmp2(pt a, pt b){return a.y<b.y;}

struct x{int key, sub, type;};
bool operator<(x a, x b){return a.key == b.key ? (a.type < b.type) : (a.key > b.key);}

int a[200005],n;

int lim, tree[270000];
void initTree(){
    for(lim = 1; lim <= n+1; lim <<= 1);
    memset(tree,0,sizeof(tree));
}
void add(int x){
    while (x <= lim) {
        tree[x]++;
        x += x & -x;
    }
}
int sum(int x){
    int res = 0;
    while (x) {
        res += tree[x];
        x -= x & -x;
    }
    return res;
}

long long f(int s, int e){
    long long res = 0;
    if(e - s < 500){
        for (int i=s; i<=e; i++) {
            int upper=1e9;
            for (int j=i+1; j<=e; j++) {
                if(a[i] < a[j] && a[j] < upper){
                    upper = a[j];
                    res++;
                }
            }
        }
        return res;
    }
    int m = (s+e)/2;
    res = f(s,m) + f(m+1,e);
    
    initTree();
    set<int> s_left, s_right;
    set<int> ::iterator it;
    priority_queue<x> pq;
    int lim;
    
    for (int i=m; i>=s; i--) {
        it = s_left.upper_bound(a[i]);
        if(it == s_left.end()) lim = n+1;
        else lim = *it - 1;
        s_left.insert(a[i]);
        pq.push({a[i],lim,0});
    }
    
    for (int i=m+1; i<=e; i++) {
        it = s_right.upper_bound(a[i]);
        if(it == s_right.begin()) lim = -1;
        else{
            it--;
            lim = *it;
        }
        pq.push({lim,a[i],1});
        s_right.insert(a[i]);
    }
    for (int i=s; i<=e; i++) {
        x c = pq.top();
        pq.pop();
        if(c.type) add(c.sub);
        else res += sum(c.sub) - sum(c.key - 1);
    }
    return res;
}

int main(){
    scanf("%d",&n);
    for (int i=0; i<n; i++) {
        scanf("%d %d",&pos[i].x,&pos[i].y);
    }
    sort(pos,pos+n,cmp2);
    for (int i=0; i<n; i++) {
        pos[i].y = i+1;
    }
    sort(pos,pos+n,cmp1);
    for (int i=0; i<n; i++) {
        a[i] = pos[i].y;
    }
    long long r = f(0,n-1);
    printf("%lld",r);
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 4612 KB Output is correct
2 Correct 0 ms 4612 KB Output is correct
3 Correct 0 ms 4612 KB Output is correct
4 Correct 0 ms 4612 KB Output is correct
5 Correct 0 ms 4612 KB Output is correct
6 Correct 0 ms 4612 KB Output is correct
7 Correct 0 ms 4612 KB Output is correct
8 Correct 0 ms 4612 KB Output is correct
9 Correct 0 ms 4612 KB Output is correct
10 Correct 0 ms 4612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 4944 KB Output is correct
2 Correct 12 ms 4944 KB Output is correct
3 Correct 8 ms 4944 KB Output is correct
4 Correct 8 ms 4944 KB Output is correct
5 Correct 12 ms 4944 KB Output is correct
6 Correct 16 ms 4944 KB Output is correct
7 Correct 16 ms 4944 KB Output is correct
8 Correct 8 ms 4944 KB Output is correct
9 Correct 8 ms 4944 KB Output is correct
10 Correct 16 ms 4944 KB Output is correct
11 Correct 16 ms 4944 KB Output is correct
12 Correct 12 ms 4944 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 948 ms 17020 KB Output is correct
2 Correct 1428 ms 17056 KB Output is correct
3 Correct 1064 ms 17020 KB Output is correct
4 Correct 932 ms 17020 KB Output is correct
5 Correct 1108 ms 17020 KB Output is correct
6 Correct 1256 ms 17020 KB Output is correct
7 Correct 1364 ms 17020 KB Output is correct
8 Correct 1424 ms 17020 KB Output is correct
9 Correct 956 ms 17020 KB Output is correct
10 Correct 1048 ms 17020 KB Output is correct
11 Correct 1212 ms 17020 KB Output is correct
12 Correct 1360 ms 17028 KB Output is correct
13 Correct 1444 ms 17048 KB Output is correct
14 Correct 900 ms 17020 KB Output is correct
15 Correct 1212 ms 17020 KB Output is correct
16 Correct 1424 ms 17028 KB Output is correct
17 Correct 756 ms 12268 KB Output is correct
18 Correct 1368 ms 17024 KB Output is correct
19 Correct 1352 ms 17020 KB Output is correct
20 Correct 1328 ms 17020 KB Output is correct