提出 #38686072


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for (ll i=a;i<(ll)n;i++)

ll read(){ll r;scanf("%lld",&r);return r;}

int score[200010];
int quota[200010];
vector<array<int,3> >Q;
vector<ll> xval;
ll init[400010]; // {quota sum}

array<ll,2> operator+(array<ll,2>l,array<ll,2>r){ return {l[0]+r[0],l[1]+r[1]}; }
array<ll,2> operator-(array<ll,2>l,array<ll,2>r){ return {l[0]-r[0],l[1]-r[1]}; }

class Fenwick{
public:
  vector<array<ll,2> > qs; // quota, score sum
  vector<array<ll,2> > point; // quota, score sum
  Fenwick(int sz){ // 0-index
    qs.resize(sz);
    point.resize(sz);
  }
  void add(int x,int inc){
    array<ll,2> diff = {inc, inc*xval[x]};
    point[x] = point[x] + diff;
    for(x+=1;x<=(int)qs.size();x+=(x&-x)){
      qs[x-1] = qs[x-1] + diff;
    }
  }

  ll query(int cnt){
    int x = qs.size();
    ll res = 0;
    for(;x;){
      if(qs[x-1][0] <= cnt){
        cnt -= qs[x-1][0];
        res += qs[x-1][1];
        x-=(x&-x);
      }else{
        if(point[x-1][0] <= cnt){
          cnt -= point[x-1][0];
          res += point[x-1][1];
          x-=1;
        }else{
          return res += cnt*xval[x-1];
        }
      }
    }
    return cnt==0?res:-1;
  }
};

int main(){
  int n=read();
  rep(i,0,n) {
    score[i]=read(); // score
    quota[i]=read(); // quota
    xval.push_back(score[i]);
  }
  int q=read();
  rep(i,0,q){
    int op=read();
    int x=read();
    if(op==1){
      int y=read();
      xval.push_back(y);
      Q.push_back({op,x-1,y});
    }else if(op==2){
      int y=read();
      Q.push_back({op,x-1,y});
    }else if(op==3){
      Q.push_back({op,x,0});
    }
  }
  sort(begin(xval),end(xval));
  xval.erase(unique(begin(xval),end(xval)),end(xval));
  auto idx=[&](int x){return lower_bound(begin(xval),end(xval),x)-begin(xval);};
  Fenwick fw(xval.size());
  rep(i,0,n) fw.add(idx(score[i]), quota[i]);
  for(auto [op,x,y]:Q){
    if(op==1){
      fw.add(idx(score[x]),-quota[x]);
      score[x] = y;
      fw.add(idx(score[x]),quota[x]);
    }else if(op==2){
      fw.add(idx(score[x]),y-quota[x]);
      quota[x] = y;
    }else if(op==3){
      printf("%lld\n", fw.query(x));
    }
  }
  return 0;
}

提出情報

提出日時
問題 G - Balance Update Query
ユーザ cromarmot
言語 C++ (GCC 9.2.1)
得点 600
コード長 2198 Byte
結果 AC
実行時間 214 ms
メモリ 25816 KiB

コンパイルエラー

./Main.cpp: In function ‘ll read()’:
./Main.cpp:6:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    6 | ll read(){ll r;scanf("%lld",&r);return r;}
      |                ~~~~~^~~~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 1
AC × 40
セット名 テストケース
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_rnd_00.txt, 01_rnd_01.txt, 01_rnd_02.txt, 01_rnd_03.txt, 02_rnd2_00.txt, 02_rnd2_01.txt, 02_rnd2_02.txt, 02_rnd2_03.txt, 03_samet_00.txt, 03_samet_01.txt, 03_samet_02.txt, 04_samea_00.txt, 04_samea_01.txt, 04_samea_02.txt, 04_samea_03.txt, 04_samea_04.txt, 04_samea_05.txt, 05_smallb_00.txt, 05_smallb_01.txt, 05_smallb_02.txt, 05_smallb_03.txt, 06_rotate_00.txt, 06_rotate_01.txt, 06_rotate_02.txt, 06_rotate_03.txt, 07_border_00.txt, 07_border_01.txt, 07_border_02.txt, 08_smallN_00.txt, 08_smallN_01.txt, 08_smallN_02.txt, 08_smallN_03.txt, 09_hand_00.txt, 09_hand_01.txt, 09_hand_02.txt, 09_hand_03.txt, 10_worst_00.txt, 10_worst_01.txt, 10_worst_02.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 5 ms 3720 KiB
01_rnd_00.txt AC 86 ms 9700 KiB
01_rnd_01.txt AC 113 ms 11444 KiB
01_rnd_02.txt AC 33 ms 5316 KiB
01_rnd_03.txt AC 124 ms 13692 KiB
02_rnd2_00.txt AC 203 ms 18120 KiB
02_rnd2_01.txt AC 120 ms 11696 KiB
02_rnd2_02.txt AC 105 ms 10928 KiB
02_rnd2_03.txt AC 143 ms 16336 KiB
03_samet_00.txt AC 175 ms 16380 KiB
03_samet_01.txt AC 175 ms 16500 KiB
03_samet_02.txt AC 173 ms 16380 KiB
04_samea_00.txt AC 102 ms 12520 KiB
04_samea_01.txt AC 105 ms 12348 KiB
04_samea_02.txt AC 112 ms 12408 KiB
04_samea_03.txt AC 125 ms 12356 KiB
04_samea_04.txt AC 139 ms 12444 KiB
04_samea_05.txt AC 154 ms 12520 KiB
05_smallb_00.txt AC 195 ms 19124 KiB
05_smallb_01.txt AC 195 ms 19036 KiB
05_smallb_02.txt AC 196 ms 19080 KiB
05_smallb_03.txt AC 192 ms 19012 KiB
06_rotate_00.txt AC 137 ms 20268 KiB
06_rotate_01.txt AC 143 ms 25816 KiB
06_rotate_02.txt AC 143 ms 25808 KiB
06_rotate_03.txt AC 131 ms 20424 KiB
07_border_00.txt AC 208 ms 21852 KiB
07_border_01.txt AC 209 ms 21888 KiB
07_border_02.txt AC 214 ms 21892 KiB
08_smallN_00.txt AC 22 ms 4568 KiB
08_smallN_01.txt AC 14 ms 3872 KiB
08_smallN_02.txt AC 20 ms 3980 KiB
08_smallN_03.txt AC 42 ms 5840 KiB
09_hand_00.txt AC 104 ms 13032 KiB
09_hand_01.txt AC 103 ms 13284 KiB
09_hand_02.txt AC 84 ms 11040 KiB
09_hand_03.txt AC 174 ms 19008 KiB
10_worst_00.txt AC 107 ms 16480 KiB
10_worst_01.txt AC 162 ms 16716 KiB
10_worst_02.txt AC 137 ms 16400 KiB