제출 #520282

#제출 시각아이디문제언어결과실행 시간메모리
520282krit3379수열 (APIO14_sequence)C++14
0 / 100
56 ms7008 KiB
#include<bits/stdc++.h>
using namespace std;
#define N 100005

struct A{
    long long a,b,c;
    bool operator<(const A& o)const{
        return c>o.c;
    }
};

long long val[N],l[N],r[N],qs[N],a,b,c,ans;
int p[N];
priority_queue<A> q;

int fp(int v){return (v==p[v])?v:p[v]=fp(p[v]);}

int main(){
    int n,k,i,j,st;
    scanf("%d %d",&n,&k);
    st=n;
    iota(p,p+n+1,0);
    for(i=1;i<=n;i++)scanf("%lld",&val[i]),qs[i]=qs[i-1]+val[i],ans+=val[i]*qs[i-1],l[i]=r[i]=i;
    for(i=1;i<n;i++)q.push({i,i+1,val[i]*val[i+1]});
    while(st!=k+1){
        a=q.top().a;
        b=q.top().b;
        c=q.top().c;
        q.pop();
        if(val[fp(a)]*val[fp(b)]!=c)continue;
        val[fp(a)]+=val[fp(b)];
        l[fp(a)]=min(l[fp(a)],l[fp(b)]);
        r[fp(a)]=max(r[fp(a)],r[fp(b)]);
        p[fp(b)]=fp(a);
        if(l[fp(a)]!=1)q.push({fp(a),fp(l[fp(a)]-1),val[fp(a)]*val[fp(l[fp(a)]-1)]});
        if(r[fp(a)]!=n)q.push({fp(a),fp(r[fp(a)]+1),val[fp(a)]*val[fp(r[fp(a)]+1)]});
        ans-=c;
        st--;
    }
    printf("%lld\n",ans);
    for(i=1;r[fp(i)]<n;i++){
        printf("%d ",r[fp(i)]);
        i=r[fp(i)];
    }
    return 0;
}

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

sequence.cpp: In function 'int main()':
sequence.cpp:42:18: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
   42 |         printf("%d ",r[fp(i)]);
      |                 ~^   ~~~~~~~~
      |                  |          |
      |                  int        long long int
      |                 %lld
sequence.cpp:19:15: warning: unused variable 'j' [-Wunused-variable]
   19 |     int n,k,i,j,st;
      |               ^
sequence.cpp:20:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |     scanf("%d %d",&n,&k);
      |     ~~~~~^~~~~~~~~~~~~~~
sequence.cpp:23:27: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |     for(i=1;i<=n;i++)scanf("%lld",&val[i]),qs[i]=qs[i-1]+val[i],ans+=val[i]*qs[i-1],l[i]=r[i]=i;
      |                      ~~~~~^~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...