제출 #14914

#제출 시각아이디문제언어결과실행 시간메모리
14914aintaPalembang Bridges (APIO15_bridge)C++98
100 / 100
316 ms22228 KiB
#include<stdio.h>
#include<algorithm>
#define SZ 262144
using namespace std;
int K, n;
long long Res, SS, D1[101000], D2[101000];
struct A{
    int b, e, num;
    bool operator<(const A &p)const{
        return b+e<p.b+p.e;
    }
}w[101000];
int Num[101000];
struct AA{
    int x, num;
    bool operator<(const AA &p)const{
        return x<p.x;
    }
}ord[201000];
long long IT[SZ+SZ+1][4];
void Ins(int pv, int a, int b){
    a+=SZ;
    while(a){
        IT[a][pv]+=b;
        a>>=1;
    }
}
int Findx(int node, int g){
    if(node >= SZ)return node-SZ;
    if(IT[node*2][0] + IT[node*2][1] < g)return Findx(node*2+1,g-IT[node*2][0] - IT[node*2][1]);
    return Findx(node*2,g);
}
long long Sum(int pv, int b, int e){
    b+=SZ, e+=SZ;
    long long r = 0;
    while(b<=e){
        if(b&1)r+=IT[b][pv];
        if(!(e&1))r += IT[e][pv];
        b=(b+1)>>1, e=(e-1)>>1;
    }
    return r;
}
long long Gap(int a){
    long long t1 = Sum(0, 1, a-1), t2 = Sum(1, a+1, n+n);
    return t1*ord[a].x - Sum(2, 1, a-1) + Sum(3,a+1,n+n) - t2*ord[a].x;
}
int main(){
    int i, a, b, c = 0, e, mid, r, pv = 1;
    scanf("%d%d",&K,&n);
    char p1[3], p2[3];
    for(i=1;i<=n;i++){
        scanf("%s",p1);
        scanf("%d",&a);
        scanf("%s",p2);
        scanf("%d",&b);
        SS += max(a,b)-min(a,b);
        if(p1[0] != p2[0]){
            SS++;
            c++;
            w[c].b = min(a,b);
            w[c].e = max(a,b);
            w[c].num =c;
        }
    }
    n=c;
    sort(w+1,w+n+1);
    for(i=1;i<=n;i++){
        ord[i].x=w[i].b, ord[i].num = i;
        ord[i + n].x = w[i].e, ord[i+n].num = i+n;
    }
    sort(ord+1,ord+n+n+1);
    for(i=1;i<=n+n;i++){
        a = ord[i].num;
        if(a <= n)w[a].b = i;
        else w[a-n].e = i;
    }
    for(i=1;i<=n;i++){
        Ins(0, w[i].e, 1);
        Ins(1, w[i].b, 1);
        Ins(2, w[i].e, ord[w[i].e].x);
        Ins(3, w[i].b, ord[w[i].b].x);
        a = Findx(1, i);
        D1[i] = Gap(a);
    }
    for(i=1;i<=n;i++){
        Ins(0, w[i].e, -1);
        Ins(1, w[i].b, -1);
        Ins(2, w[i].e, -ord[w[i].e].x);
        Ins(3, w[i].b, -ord[w[i].b].x);
    }
    for(i=n;i>=1;i--){
        Ins(0, w[i].e, 1);
        Ins(1, w[i].b, 1);
        Ins(2, w[i].e, ord[w[i].e].x);
        Ins(3, w[i].b, ord[w[i].b].x);
        a = Findx(1, n+1-i);
        D2[i] = Gap(a);
    }
    Res = SS + D1[n]*2;
    if(K==1){
        printf("%lld\n",Res);
        return 0;
    }
    for(i=1;i<n;i++){
        Res = min(Res, SS + (D1[i] + D2[i+1])*2);
    }
    printf("%lld\n",Res);
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bridge.cpp: In function 'int main()':
bridge.cpp:48:25: warning: unused variable 'e' [-Wunused-variable]
     int i, a, b, c = 0, e, mid, r, pv = 1;
                         ^
bridge.cpp:48:28: warning: unused variable 'mid' [-Wunused-variable]
     int i, a, b, c = 0, e, mid, r, pv = 1;
                            ^
bridge.cpp:48:33: warning: unused variable 'r' [-Wunused-variable]
     int i, a, b, c = 0, e, mid, r, pv = 1;
                                 ^
bridge.cpp:48:36: warning: unused variable 'pv' [-Wunused-variable]
     int i, a, b, c = 0, e, mid, r, pv = 1;
                                    ^
bridge.cpp:49:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&K,&n);
                        ^
bridge.cpp:52:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s",p1);
                       ^
bridge.cpp:53:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&a);
                       ^
bridge.cpp:54:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s",p2);
                       ^
bridge.cpp:55:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&b);
                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...