Submission #1174690


Source Code Expand

using System;
using System.Text;
using System.Collections.Generic;
class Solve{
    public Solve(){}
    int N;
    long[] DPL;
    long[] DPR;
    long[] unuse;
    long[] use;
    long[] sumL;
    long[] sumR;
    StringBuilder sb;
    public static int Main(){
        new Solve().Run();
        return 0;
    }
    void Run(){
        sb = new StringBuilder();
        Calc();
        Console.Write(sb.ToString());
    }
    void Calc(){
        N = int.Parse(Console.ReadLine());
        string[] str = Console.ReadLine().Split(' ');
        long[] T = new long[N];
        for(int i=0;i<N;i++){
            T[i] = int.Parse(str[i]);
        }
        DPL = new long[N];
        DPR = new long[N];
        {
            sumL = new long[N];
            sumL[0] = T[0];
            for(int i=1;i<N;i++){
                sumL[i] = sumL[i-1] + T[i];
            }
            ConvexHullTrick Con = new ConvexHullTrick(N+1);
            Con.Add(-1,1);
            for(int i=0;i<N;i++){
                DPL[i] = Math.Max(i == 0 ? 0 : DPL[i-1],Con.Query(-i)-sumL[i]+(long)i*(long)(i+1)/2);
                Con.Add(i,DPL[i]+sumL[i]+(long)i*(long)(i-1)/2);
            }
        }
        {
            sumR = new long[N];
            sumR[0] = T[N-1];
            for(int i=1;i<N;i++){
                sumR[i] = sumR[i-1] + T[N-1-i];
            }
            ConvexHullTrick Con = new ConvexHullTrick(N+1);
            Con.Add(-1,1);
            for(int i=0;i<N;i++){
                DPR[N-1-i] = Math.Max(i == 0 ? 0 : DPR[N-i],Con.Query(-i)-sumR[i]+(long)i*(long)(i+1)/2);
                Con.Add(i,DPR[N-1-i]+sumR[i]+(long)i*(long)(i-1)/2);
            }
        }
        unuse = new long[N];
        for(int i=0;i<N;i++){
            unuse[i] = (i == 0 ? 0 : DPL[i-1]) + (i == N-1 ? 0 : DPR[i+1]);
        } 
        use = new long[N];
        for(int i=0;i<N;i++){
            use[i] = -T[i];
        }
        GetUse(0,N-1);
        int M = int.Parse(Console.ReadLine());
        for(int i=0;i<M;i++){
            str = Console.ReadLine().Split(' ');
            int P = int.Parse(str[0])-1;
            long X = int.Parse(str[1]);
            sb.Append(Math.Max(unuse[P],use[P]-X+T[P])+"\n");
        }
    }
    ConvexHullTrick ConL(int l,int r){
        ConvexHullTrick Con = new ConvexHullTrick(r-l+1);
        for(int i=l;i<=r;i++){
            if(i == 0){
                Con.Add(-1,1);
            }
            else{
                Con.Add(i-1,DPL[i-1]+sumL[i-1]+(long)(i-1)*(long)(i-2)/2);
            }
        }
        return Con;
    }
    ConvexHullTrick ConR(int l,int r){
        ConvexHullTrick Con = new ConvexHullTrick(r-l+1);
        for(int i=N-1-r;i<N-l;i++){
            if(i == 0){
                Con.Add(-1,1);
            }
            else{
                Con.Add(i-1,DPR[N-i]+sumR[i-1]+(long)(i-1)*(long)(i-2)/2);
            }
        }
        return Con;
    }
    long UseConL(int i){
        return -sumL[i]+(long)i*(long)(i+1)/2;
    }
    long UseConR(int i){
        return -sumR[N-1-i]+(long)(N-1-i)*(long)(N-i)/2;
    }
    void GetUse(int l,int r){
        int M = (l+r)/2;
        if(l <= M-1){
            GetUse(l,M-1);
        }
        if(M+1 <= r){
            GetUse(M+1,r);
        }
        {
            ConvexHullTrick Con = ConL(l,M);
            long max = -1000000000;
            for(int i=r;i>=M;i--){
                max = Math.Max(max,Con.Query(-i)+UseConL(i)+(i == N-1 ? 0 : DPR[i+1]));
                use[i] = Math.Max(max,use[i]);
            }
        }
        {
            ConvexHullTrick Con = ConR(M,r);
            long max = -1000000000;
            for(int i=l;i<=M;i++){
                max = Math.Max(max,Con.Query(-(N-1-i))+UseConR(i)+(i == 0 ? 0 : DPL[i-1]));
                use[i] = Math.Max(max,use[i]);
            }
        }
    }
}
struct ConvexHullTrick{
    long[] A;
    long[] B;
    //C[i]はi番目の点に適用するのがi+1番目の点に適用するよりも大きくなる最大のx 単調増加になる
    long[] C;
    int p;
    int find;
    public ConvexHullTrick(int N){
        A = new long[N];
        B = new long[N];
        C = new long[N];
        p = 0;
        find = 0;
    }
    //aは単調増加でないといけない
    public void Add(long a,long b){
        if(p == 0){
            A[0] = a;
            B[0] = b;;
            p++;
        }
        else{
            for(int i=p;i>0;i--){
                long X = Compare(A[i-1],B[i-1],a,b);
                if(i == 1 || X > C[i-2]){
                    C[i-1] = X;
                    A[i] = a;
                    B[i] = b;
                    p = i+1;
                    break;
                }
            }
        }
    }
    //1つはAddしていないといけない
    public long Query(long x){
        return Calc(x,findMax(x));
    }
    int findMax(long x){
        find = Math.Min(find,p-1);
        while(find < p-1 && C[find] < x){
            find++;
        }
        while(find > 0 && C[find-1] >= x){
            find--;
        }
        return find;
    }
    long Calc(long x,int i){
        return A[i]*x + B[i];
    }
    //(a1,b1)に適用する方が(a2,b2)に適用するより大きくなる最大のx
    long Compare(long a1,long b1,long a2,long b2){
        return (b1-b2-1)/(a2-a1) - ((b1-b2-1)%(a2-a1) < 0 ? 1 : 0);
    }
}

Submission Info

Submission Time
Task F - Contest with Drinks Hard
User leign
Language C# (Mono 4.6.2.0)
Score 1400
Code Size 5523 Byte
Status AC
Exec Time 1308 ms
Memory 68628 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1400 / 1400
Status
AC × 2
AC × 54
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All sample_01.txt, sample_02.txt, subtask_1_high_equaly_01.txt, subtask_1_high_equaly_02.txt, subtask_1_high_equaly_03.txt, subtask_1_high_equaly_04.txt, subtask_1_high_rand_01.txt, subtask_1_high_rand_02.txt, subtask_1_high_rand_03.txt, subtask_1_high_rand_04.txt, subtask_1_killer_01.txt, subtask_1_killer_02.txt, subtask_1_low_equaly_01.txt, subtask_1_low_equaly_02.txt, subtask_1_low_equaly_03.txt, subtask_1_low_equaly_04.txt, subtask_1_low_rand_01.txt, subtask_1_low_rand_02.txt, subtask_1_low_rand_03.txt, subtask_1_low_rand_04.txt, subtask_1_max_high_equaly_01.txt, subtask_1_max_high_equaly_02.txt, subtask_1_max_high_equaly_03.txt, subtask_1_max_high_equaly_04.txt, subtask_1_max_high_rand_01.txt, subtask_1_max_high_rand_02.txt, subtask_1_max_high_rand_03.txt, subtask_1_max_high_rand_04.txt, subtask_1_max_low_equaly_01.txt, subtask_1_max_low_equaly_02.txt, subtask_1_max_low_equaly_03.txt, subtask_1_max_low_equaly_04.txt, subtask_1_max_low_rand_01.txt, subtask_1_max_low_rand_02.txt, subtask_1_max_low_rand_03.txt, subtask_1_max_low_rand_04.txt, subtask_1_max_rand_equaly_01.txt, subtask_1_max_rand_equaly_02.txt, subtask_1_max_rand_equaly_03.txt, subtask_1_max_rand_equaly_04.txt, subtask_1_max_rand_rand_01.txt, subtask_1_max_rand_rand_02.txt, subtask_1_max_rand_rand_03.txt, subtask_1_max_rand_rand_04.txt, subtask_1_min_rand_rand_01.txt, subtask_1_min_rand_rand_02.txt, subtask_1_rand_equaly_01.txt, subtask_1_rand_equaly_02.txt, subtask_1_rand_equaly_03.txt, subtask_1_rand_equaly_04.txt, subtask_1_rand_rand_01.txt, subtask_1_rand_rand_02.txt, subtask_1_rand_rand_03.txt, subtask_1_rand_rand_04.txt
Case Name Status Exec Time Memory
sample_01.txt AC 21 ms 9172 KB
sample_02.txt AC 22 ms 13268 KB
subtask_1_high_equaly_01.txt AC 553 ms 52612 KB
subtask_1_high_equaly_02.txt AC 407 ms 47720 KB
subtask_1_high_equaly_03.txt AC 106 ms 15820 KB
subtask_1_high_equaly_04.txt AC 795 ms 49184 KB
subtask_1_high_rand_01.txt AC 546 ms 52140 KB
subtask_1_high_rand_02.txt AC 392 ms 46524 KB
subtask_1_high_rand_03.txt AC 578 ms 47092 KB
subtask_1_high_rand_04.txt AC 716 ms 47812 KB
subtask_1_killer_01.txt AC 22 ms 11220 KB
subtask_1_killer_02.txt AC 22 ms 13268 KB
subtask_1_low_equaly_01.txt AC 871 ms 50408 KB
subtask_1_low_equaly_02.txt AC 637 ms 54136 KB
subtask_1_low_equaly_03.txt AC 734 ms 59796 KB
subtask_1_low_equaly_04.txt AC 328 ms 48716 KB
subtask_1_low_rand_01.txt AC 658 ms 47136 KB
subtask_1_low_rand_02.txt AC 528 ms 43724 KB
subtask_1_low_rand_03.txt AC 436 ms 43032 KB
subtask_1_low_rand_04.txt AC 893 ms 46432 KB
subtask_1_max_high_equaly_01.txt AC 1279 ms 68584 KB
subtask_1_max_high_equaly_02.txt AC 1288 ms 61972 KB
subtask_1_max_high_equaly_03.txt AC 1288 ms 62952 KB
subtask_1_max_high_equaly_04.txt AC 1265 ms 66596 KB
subtask_1_max_high_rand_01.txt AC 1308 ms 67040 KB
subtask_1_max_high_rand_02.txt AC 1266 ms 66424 KB
subtask_1_max_high_rand_03.txt AC 1266 ms 64208 KB
subtask_1_max_high_rand_04.txt AC 1270 ms 64108 KB
subtask_1_max_low_equaly_01.txt AC 1242 ms 60400 KB
subtask_1_max_low_equaly_02.txt AC 1229 ms 64804 KB
subtask_1_max_low_equaly_03.txt AC 1274 ms 58336 KB
subtask_1_max_low_equaly_04.txt AC 1237 ms 58308 KB
subtask_1_max_low_rand_01.txt AC 1249 ms 60656 KB
subtask_1_max_low_rand_02.txt AC 1253 ms 62624 KB
subtask_1_max_low_rand_03.txt AC 1230 ms 64564 KB
subtask_1_max_low_rand_04.txt AC 1240 ms 58940 KB
subtask_1_max_rand_equaly_01.txt AC 1215 ms 64548 KB
subtask_1_max_rand_equaly_02.txt AC 1216 ms 66596 KB
subtask_1_max_rand_equaly_03.txt AC 1249 ms 64548 KB
subtask_1_max_rand_equaly_04.txt AC 1221 ms 64544 KB
subtask_1_max_rand_rand_01.txt AC 1217 ms 64548 KB
subtask_1_max_rand_rand_02.txt AC 1235 ms 66596 KB
subtask_1_max_rand_rand_03.txt AC 1218 ms 68628 KB
subtask_1_max_rand_rand_04.txt AC 1235 ms 64548 KB
subtask_1_min_rand_rand_01.txt AC 22 ms 11220 KB
subtask_1_min_rand_rand_02.txt AC 22 ms 13268 KB
subtask_1_rand_equaly_01.txt AC 63 ms 18264 KB
subtask_1_rand_equaly_02.txt AC 719 ms 53228 KB
subtask_1_rand_equaly_03.txt AC 323 ms 35536 KB
subtask_1_rand_equaly_04.txt AC 581 ms 52756 KB
subtask_1_rand_rand_01.txt AC 872 ms 64392 KB
subtask_1_rand_rand_02.txt AC 499 ms 39672 KB
subtask_1_rand_rand_03.txt AC 787 ms 59296 KB
subtask_1_rand_rand_04.txt AC 329 ms 27408 KB