ABC061C-Big Array
#include <bits/stdc++.h> using namespace std; using ll =long long; #define SORT(a) sort((a).begin(),(a).end()) #define rSORT(a) reverse((a).begin(),(a).end()) #define For(i, a, b) for(int i = (a) ; i < (b) ; ++i) #define rep(i, n) For(i, 0, n) #define debug(x) cout << #x << " = " << (x) << endl; bool coY() {cout <<"Yes"<<endl;} bool coN(){cout <<"No"<<endl;} const ll INF = 1LL << 60; ll N,M,H,W,K,A,B; string S; //Write From this Line int main() { cout << setprecision(10); cin >> N >> K ; //a1をb1個挿入する。 vector<ll> P(100100,0); //pair<入れる数、何個入ってるか> rep(i,N){ ll a, b; cin >> a >> b; P[a] += b; } ll count = 0 ; rep(i,100100){ count += P[i]; if(count>=K){ cout <<i<<endl; return 0; } } }
解法
Nの制約が<= 105で、与えられる整数も<=105なので、
それと同じ大きさの配列を用意してもメモリ、実行時間は問題ない。
vector
配列の大きさが100100,初期値を0として
N回の操作で入力が与えられたとき、挿入する値をa,入れる個数をbとしたときに
P.at(a)を+=bしてあげる。
でN会の挿入が終わったら、
P.at(0)からP.at(N)を見て、P.at(i)の和がKを超えたところのiを出力する。
解説も同じような解法だったので良い。