답안 #29274

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
29274 2017-07-19T00:35:35 Z TAMREF 수족관 3 (KOI13_aqua3) C++11
100 / 100
363 ms 47224 KB
#include <bits/stdc++.h>
using namespace std;
const int mx=300005;
typedef long long ll;
typedef pair<ll,int> pli;

int N,K,V,M;
ll ans;
int X[mx], Y[mx], order_y[mx], T[mx];
ll D[mx];
bool removed[mx];

struct Vert{
    int y,a,b;
    int up_y;
    int le,ri;
} ver[mx];

struct Node{
    int l,r,y2;
    ll w;
    int mom;
    bool operator< (Node z){
        return y2<z.y2;
    }
} node[mx];

map<int,int> itv;
map<int,int>::iterator it;
vector<int> G[mx];
int arr[mx], arr_top;
int Q[mx], q_f, q_r;
int Bfs[mx], br;
priority_queue<pli> pQ;

int main(){
    int i,j,k,n,q,L,R;
    int max_y;
    scanf("%d",&N);
    for(i=1;i<=N;i++) scanf("%d%d",&X[i],&Y[i]);
    scanf("%d",&K);
    for(i=2;i<N-1;i++){
        if(Y[i]==Y[i+1]){
            ++V;
            ver[V].a=X[i], ver[V].b=X[i+1], ver[V].y=Y[i];
            ver[V].le=V-1, ver[V].ri=V+1;

        }
    }
    for(i=1;i<=V;i++) order_y[i]=i;
    sort(order_y+1,order_y+V+1,[](int u,int v){
            if(ver[u].y==ver[v].y) return ver[u].a>ver[v].a;
            return ver[u].y>ver[v].y;
         });
    for(i=1;i<=V;i++){
        n=order_y[i];
        k=0;
        max_y=0;
        L=ver[n].le, R=ver[n].ri;
        if(L>0&&ver[L].y<=ver[n].y)
            max_y=max(max_y,ver[L].y);
        if(R<=V&&ver[R].y<=ver[n].y){
            max_y=max(max_y,ver[R].y);
        }
        if(L>0&&max_y==ver[L].y){
            ver[L].ri=max(ver[L].ri,R);
        }
        if(R<=V&&max_y==ver[R].y){
            ver[R].le=min(ver[R].le,L);
        }
        ver[n].up_y=max_y;
        //printf("N - ver[%d] : Lx=%d, Rx=%d, L=%d, R=%d, y=%d, upy=%d\n",n,ver[n].a,ver[n].b,ver[n].le,ver[n].ri,ver[n].y,ver[n].up_y);
        //printf("L - ver[%d] : Lx=%d, Rx=%d, L=%d, R=%d, y=%d, upy=%d\n",L,ver[L].a,ver[L].b,ver[L].le,ver[L].ri,ver[L].y,ver[L].up_y);
        //printf("R - ver[%d] : Lx=%d, Rx=%d, L=%d, R=%d, y=%d, upy=%d\n",R,ver[R].a,ver[R].b,ver[R].le,ver[R].ri,ver[R].y,ver[R].up_y);
    }
    M=1;
    for(i=1;i<=V;i++){
        L=ver[i].le, R=ver[i].ri;
        int Lx=(L>0?ver[L].b:0);
        int Rx=(R<=V?ver[R].a:X[N]);
        ll sz = 1LL*(Rx-Lx)*(ver[i].y-ver[i].up_y);
        //printf("node %d : Lx=%d, Rx=%d, y=%d, upy=%d, sz=%lld\n",M,Lx,Rx,ver[i].y,ver[i].up_y,sz);
        if(ver[i].up_y == ver[i].y) continue;
        ++M;
        node[M].y2=ver[i].y;
        node[M].l=Lx, node[M].r=Rx;
        node[M].w=sz;
    }
    sort(node+2,node+M+1);
    for(i=M;i>=2;--i){
        arr_top=0;
        for(it = itv.upper_bound(node[i].l);it!=itv.end();++it){
            if(it->first > node[i].r) break;
            k = it->second;
            node[k].mom=i;
            arr[arr_top++]=it->first;
            G[i].push_back(k);
        }
        for(j=0;j<arr_top;j++) itv.erase(arr[j]);
        itv[node[i].r]=i;
    }
    for(i=2;i<=M;i++){
        if(!node[i].mom){
            node[i].mom=1;
            G[1].push_back(i);
        }
    }
    for(Q[q_r++]=1;q_f!=q_r;){
        q=Q[q_f++];
        Bfs[br++]=q;
        for(i=G[q].size();i--;) Q[q_r++]=G[q][i];
    }
    for(i=M;i--;){
        n=Bfs[i];
        D[n]=node[n].w; T[n]=n;
        for(j=G[n].size();j--;){
            k=G[n][j];
            if(D[n]<D[k]+node[n].w){
                D[n]=D[k]+node[n].w;
                T[n]=T[k];
            }
        }
        pQ.push(pli(D[n],n));
    }
    while(K--){
        while(!pQ.empty() && removed[pQ.top().second]) pQ.pop();
        if(pQ.empty()) break;
        k=pQ.top().second; pQ.pop();
        ans+=D[k];
        for(k=T[k];k&&!removed[k];k=node[k].mom)
            removed[k]=1;
    }
    printf("%lld\n",ans);
    return 0;
}

Compilation message

aqua3.cpp: In function 'int main()':
aqua3.cpp:39:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&N);
                   ^
aqua3.cpp:40:48: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(i=1;i<=N;i++) scanf("%d%d",&X[i],&Y[i]);
                                                ^
aqua3.cpp:41:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&K);
                   ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 36308 KB Output is correct
2 Correct 3 ms 36308 KB Output is correct
3 Correct 0 ms 36308 KB Output is correct
4 Correct 3 ms 36308 KB Output is correct
5 Correct 3 ms 36308 KB Output is correct
6 Correct 3 ms 36308 KB Output is correct
7 Correct 3 ms 36308 KB Output is correct
8 Correct 0 ms 36308 KB Output is correct
9 Correct 3 ms 36308 KB Output is correct
10 Correct 0 ms 36308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 36440 KB Output is correct
2 Correct 3 ms 36440 KB Output is correct
3 Correct 3 ms 36440 KB Output is correct
4 Correct 6 ms 36440 KB Output is correct
5 Correct 3 ms 36440 KB Output is correct
6 Correct 0 ms 36588 KB Output is correct
7 Correct 3 ms 36440 KB Output is correct
8 Correct 3 ms 36440 KB Output is correct
9 Correct 3 ms 36588 KB Output is correct
10 Correct 3 ms 36592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 246 ms 42288 KB Output is correct
2 Correct 266 ms 42288 KB Output is correct
3 Correct 179 ms 42688 KB Output is correct
4 Correct 246 ms 42684 KB Output is correct
5 Correct 196 ms 42684 KB Output is correct
6 Correct 183 ms 47224 KB Output is correct
7 Correct 136 ms 42468 KB Output is correct
8 Correct 143 ms 42468 KB Output is correct
9 Correct 363 ms 46284 KB Output is correct
10 Correct 353 ms 46288 KB Output is correct
11 Correct 166 ms 47224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 266 ms 42288 KB Output is correct
2 Correct 263 ms 42288 KB Output is correct
3 Correct 229 ms 42684 KB Output is correct
4 Correct 203 ms 42684 KB Output is correct
5 Correct 193 ms 42688 KB Output is correct
6 Correct 186 ms 47224 KB Output is correct
7 Correct 133 ms 42468 KB Output is correct
8 Correct 159 ms 42468 KB Output is correct
9 Correct 306 ms 46288 KB Output is correct
10 Correct 336 ms 46284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 279 ms 42292 KB Output is correct
2 Correct 363 ms 42288 KB Output is correct
3 Correct 233 ms 42684 KB Output is correct
4 Correct 203 ms 42684 KB Output is correct
5 Correct 226 ms 42684 KB Output is correct
6 Correct 149 ms 42468 KB Output is correct
7 Correct 166 ms 42468 KB Output is correct
8 Correct 333 ms 46284 KB Output is correct
9 Correct 343 ms 46288 KB Output is correct