제출 #972954

#제출 시각아이디문제언어결과실행 시간메모리
972954sleepntsheepPalembang Bridges (APIO15_bridge)C11
22 / 100
43 ms1944 KiB
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100000

int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
int cmpr(const void*a,const void*b){return *(const int*)a - *(const int*)b;}

int n, k, c[1+MAX_N<<1], p;
long long cost, pc[1+MAX_N<<1], z = 1e18;

int main()
{
    scanf("%d%d", &k, &n);
    for (int s, t, i = 0; i < n; ++i)
    {
        char bb, cc;
        scanf(" %c%d %c%d",&bb,&s,&cc,&t);
        if(bb==cc) cost += abs(t-s);
        else
        {
            c[++p] = s; c[++p] = t;
            ++cost;
        }
    }

    qsort(c+1, p, sizeof*c, cmpr);
    if(k==1)
    {
        for(int j=1;j<=p;++j) cost += abs(c[p/2] - c[j]);
        printf("%lld\n", cost);
        return 0;
    }

    /* partial sum on c */
    for (int i = 1; i <= p; ++i) pc[i] = pc[i-1] + c[i];

    /* some prefix of points will choose left bridge and the rest will choose right bridge
     *
     * - fix prefix and find optimal cost for that prefix
     */

    for (int i = 1; i <= p; ++i)
    {
        /* c[1..i] will use left bridge, the rest using right bridge */

        long long cost1 = 0, j;

        /* left bridge*/
        j = (i+1)/2ll;
        cost1 += j*c[j] - pc[j];
        cost1 += (pc[i] - pc[j]) - c[j]*(i-j);

        /* right bridge*/
        j = (p-i+1)/2+i;
        cost1 += c[j]*1ll*(j-i) - (pc[j] - pc[i]);
        cost1 += (pc[p] - pc[j]) - c[j]*1ll*(p-j);
        if(cost1<z)z=cost1;
    }
    printf("%lld",z+cost);
}

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

bridge.c:9:20: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
    9 | int n, k, c[1+MAX_N<<1], p;
      |                    ^~
bridge.c:10:27: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   10 | long long cost, pc[1+MAX_N<<1], z = 1e18;
      |                           ^~
bridge.c: In function 'main':
bridge.c:14:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   14 |     scanf("%d%d", &k, &n);
      |     ^~~~~~~~~~~~~~~~~~~~~
bridge.c:18:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |         scanf(" %c%d %c%d",&bb,&s,&cc,&t);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...