結果

問題 No.2065 Sum of Min
ユーザー HIcoderHIcoder
提出日時 2023-07-13 14:18:37
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,331 bytes
コンパイル時間 1,246 ms
コンパイル使用メモリ 122,004 KB
実行使用メモリ 8,092 KB
最終ジャッジ日時 2023-10-13 03:17:08
合計ジャッジ時間 19,497 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,352 KB
testcase_01 AC 2 ms
4,348 KB
testcase_02 AC 1 ms
4,348 KB
testcase_03 AC 2 ms
4,352 KB
testcase_04 AC 467 ms
7,816 KB
testcase_05 AC 741 ms
7,916 KB
testcase_06 AC 932 ms
7,832 KB
testcase_07 AC 700 ms
7,816 KB
testcase_08 AC 569 ms
7,728 KB
testcase_09 WA -
testcase_10 AC 1,831 ms
7,916 KB
testcase_11 AC 1,823 ms
7,728 KB
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<numeric>
#include<queue>
#include<cmath>
#include <unordered_set>
using namespace std;
typedef long long ll;
const ll INF=1LL<<60;
typedef pair<int,int> P;
typedef pair<int,P> PP;
const ll MOD=998244353;


int main(){
    int N,Q;
    cin>>N>>Q;
    vector<ll> A(N);
    for(int i=0;i<N;i++){
        cin>>A[i];
    }

    /*
    vector<ll> B=A;
    vector<ll> sumA(N,0);
    sumA[0]=A[0];
    for(int i=1;i<N;i++){
        sumA[i]=sumA[i-1]+A[i];
    }
    */

    const int T=max(1,(int)sqrt(N));//適当

    vector<vector<ll>> divT;

    {
        /*
        0番目が 0~T-1,
        1番目が T~2*T-1,
        2番目が 2*T ~ 3*T-1
        3番目が 3*T ~ 4*T-1

        */
        vector<ll> tmp;
        for(int i=0;i<N;i++){
            if(i>0 && i%T==0){
                divT.push_back(tmp);
                tmp.clear();
                tmp.push_back(A[i]);
            }else{
                tmp.push_back(A[i]);
            }
        }

        if(tmp.size()>0){
            divT.push_back(tmp);
        }

    }

   


    for(auto &vec:divT){
        //バケット内ではソートしておく
        sort(vec.begin(),vec.end());
    }

  

    //auto sumdivT=divT;//divT[i]はソートされた状態

    vector<vector<ll>> sumdivT(divT.size());

    for(int i=0;i<divT.size();i++){
        int sz=divT[i].size();

        sumdivT[i].resize(sz+1);

        sumdivT[i][0]=0;
        for(int j=0;j<sz;j++){
            sumdivT[i][j+1]=sumdivT[i][j]+divT[i][j];
        }
        
    }   

    /*
    cout<<"r"<<endl;
    for(int i=0;i<divT.size();i++){
        int sz=divT[i].size();
        
        for(int j=0;j<sz;j++){
            cout<<"i="<<i<<",j="<<j<<",="<<sumdivT[i][j]<<endl;//=sumdivT[i][j-1]+divT[i][j];
        }
    }
    */

   

    vector<int> L(Q),R(Q);
    vector<ll> X(Q);


    vector<ll> ans(Q);

    for(int q=0;q<Q;q++){
    
        cin>>L[q]>>R[q]>>X[q];
        L[q]--;R[q]--;

        ll rangesum=0;

       

        int lb=(L[q]+(T-1))/T;
        int ub=R[q]/T;
        //cout<<"L[q]="<<L[q]<<",R[q]="<<R[q]<<endl;
        //cout<<"lb="<<lb<<",ub="<<ub<<endl;

        for(int l=L[q];l<lb*T;l++){
            
            rangesum+=min(A[l],X[q]);
        }

        for(int r=ub*T;r<=R[q];r++){
            rangesum+=min(A[r],X[q]);
        }

        //cout<<"rangesum="<<rangesum<<endl;


        for(int i=lb;i<ub;i++){
            //区間に完全に入っている

            auto it=upper_bound(divT[i].begin(),divT[i].end(),X[q]);

            //divT[i]のなかでX[i]より大きい数
            int num=divT[i].end()-it;//X[i]
            
            //divT[i]のなかでX[q]を超える最初のインデックス
            int idx=it-divT[i].begin();
           
           
            //[0,idx-1]の和
            /*
            if(idx-1>=0){
                rangesum+=sumdivT[i][idx-1];
            }
            */
            rangesum += sumdivT[i][idx];
           
            //cout<<"num="<<num<<",idx="<<idx<<endl;
            rangesum+=num*X[q];


        }

        //cout<<"rangesum="<<rangesum<<endl;

        ans[q]=rangesum;

        //cout<<rangesum<<endl;
    }

    for(ll v:ans){
        cout<<v<<endl;
    }

}
0