제출 #358511

#제출 시각아이디문제언어결과실행 시간메모리
358511thuanqvbn03Split the sequence (APIO14_sequence)C++17
71 / 100
83 ms131076 KiB
#include<bits/stdc++.h>
#define MAXN   100100
#define MAXK   202
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i=i+1)
#define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
#define FORE(i,v) for (__typeof((v).begin()) i=(v).begin();i!=(v).end();i++)
#define fi   first
#define se   second
using namespace std;
class ConvexHull {
    private:
    static const int INF=(int)1e9+7;
    struct Segment {
        long long x,a,b;
        int lineID;
        Segment() {
            x=a=b=0.0;
        }
        Segment(long long _x,long long _a,long long _b,int id) {
            x=_x;a=_a;b=_b;lineID=id;
        }
        long long y(void) const {
            return (a*x+b);
        }
    };
    long long ceil(long long b,long long a) const {
        assert(a>0);
        long long x=b/a;
        FOR(i,-2,2) if ((x+i)*a>b) return (x+i);
        assert(false);
    }
    deque<Segment> dq;
    long long lastA,lastB;
    public:
    ConvexHull() {
        lastA=lastB=-INF;
    };
    void addLine(long long a,long long b,int id) {
        //printf("ADD %lld %lld\n",a,b);
        if (lastA>a || (lastA==a && lastB>=b)) return;
        lastA=a;lastB=b;
        while (!dq.empty() && dq.back().y()<=a*dq.back().x+b) dq.pop_back();
        if (dq.empty()) {
            dq.push_back(Segment(0,a,b,id));
            return;
        }
        long long x=ceil(dq.back().b-b,a-dq.back().a);
        dq.push_back(Segment(x,a,b,id));
        while (!dq.empty() && dq.back().x>=INF) dq.pop_back();
    }
    pair<long long,int> query(int x) {
        while (dq.size()>1 && dq[1].x<=x) dq.pop_front();
        return (make_pair(dq.front().a*x+dq.front().b,dq.front().lineID));
    }
};
int a[MAXN],s[MAXN],n,m;
long long dp[MAXN][MAXK];
int trc[MAXN][MAXK];
void init(void) {
    scanf("%d%d",&n,&m);m++;
    FOR(i,1,n) scanf("%d",&a[i]);
    FOR(i,1,n) s[i]=s[i-1]+a[i];
}
void optimize(void) {
    FOR(i,1,n) trc[i][1]=i;
    FOR(j,2,m) {
        ConvexHull ch;
        FOR(i,j,n) {
            ch.addLine(s[i-1],dp[i-1][j-1]-1LL*s[i-1]*s[i-1],i-1);
            pair<long long,int> tmp=ch.query(s[i]);
            dp[i][j]=tmp.fi;
            trc[i][j]=tmp.se;
//            printf("DP %d %d is %d\n",i,j,dp[i][j]);
        }
    }
}
void trace(void) {
    cout<<dp[n][m]<<endl;
    vector<int> val;
    int i=n;
    int j=m;
    while (j>0) {
        if (i<n) val.push_back(i);
        i=trc[i][j];
        j--;
    }
    sort(val.begin(),val.end());
    REP(i,val.size()) printf("%d ",val[i]); printf("\n");
}
int main(void) {
#ifdef SKY
    freopen("tmp.txt","r",stdin);
#endif // SKY
    init();
    optimize();
    trace();
    return 0;
}

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

sequence.cpp: In function 'void trace()':
sequence.cpp:5:18: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
    5 | #define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
      |                  ^~~
sequence.cpp:88:5: note: in expansion of macro 'REP'
   88 |     REP(i,val.size()) printf("%d ",val[i]); printf("\n");
      |     ^~~
sequence.cpp:88:45: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   88 |     REP(i,val.size()) printf("%d ",val[i]); printf("\n");
      |                                             ^~~~~~
sequence.cpp: In function 'void init()':
sequence.cpp:60:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   60 |     scanf("%d%d",&n,&m);m++;
      |     ~~~~~^~~~~~~~~~~~~~
sequence.cpp:61:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   61 |     FOR(i,1,n) scanf("%d",&a[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...