結果
| 問題 | No.3614 Breaking door keys(LITTLE BREAK ver.) |
| コンテスト | |
| ユーザー |
keisuke6
|
| 提出日時 | 2026-08-06 14:20:41 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 251 ms / 2,000 ms |
| + 159µs | |
| コード長 | 1,415 bytes |
| 記録 | |
| コンパイル時間 | 1,326 ms |
| コンパイル使用メモリ | 224,488 KB |
| 実行使用メモリ | 18,032 KB |
| 最終ジャッジ日時 | 2026-08-06 14:20:51 |
| 合計ジャッジ時間 | 9,386 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 3 |
| 小課題1 | 10 % | AC * 7 |
| 小課題2 | 20 % | AC * 7 |
| 小課題3 | 30 % | AC * 7 |
| 小課題4 | 30 % | AC * 14 |
| 小課題5 | 10 % | AC * 38 |
| 合計 | 2.5 * 100% = 250 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct SEG{
private:
int n;
vector<int> node;
public:
SEG(int N){
n = 1;
while(n < N) n *= 2;
node.resize(2*n+1);
}
void add(int i, int x){
for(i++;i<=n;i+=i&-i) node[i] += x;
}
int f_(int i){
int ans = 0;
for(;i>0;i-=i&-i) ans += node[i];
return ans;
}
int f(int l, int r){
return f_(r)-f_(l);
}
};
signed main(){
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
srand((unsigned)time(NULL));
int N,Q;
cin>>N>>Q;
vector<pair<int,int>> I(N);
for(int i=0;i<N;i++){
int a;
cin>>a;
I[i] = {a,i};
}
sort(I.begin(),I.end());
vector<int> L(Q), R(Q), K(Q), AC(Q), WA(Q);
for(int i=0;i<Q;i++){
cin>>L[i]>>R[i]>>K[i];
L[i]--;
AC[i] = -1; // -1 個選んでいる状態では <= K
WA[i] = N+1; // N+1 個は選べないので
}
int pb = 18;
vector<int> Ans(Q);
while(pb--){
SEG segk(N), segc(N); // kosuu cost
vector<vector<int>> Ls(N+1);
for(int i=0;i<Q;i++) Ls[(AC[i]+WA[i])/2].push_back(i);
for(int i=0;i<=N;i++){
for(int pl:Ls[i]){
int k = segk.f(L[pl],R[pl]);
if(k <= K[pl]){
AC[pl] = i;
Ans[pl] = segc.f(L[pl],R[pl]);
}
else WA[pl] = i;
}
if(i == N) continue;
auto [c,p] = I[i];
segk.add(p,1);
segc.add(p,c);
//for(int j=0;j<N;j++) cout<<segc.f(j,j+1)<<' ';
//cout<<endl;
}
}
for(int x:Ans) cout<<x<<endl;
}
keisuke6