結果
| 問題 | No.3614 Breaking door keys(LITTLE BREAK ver.) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-28 04:26:32 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 548 ms / 2,000 ms |
| + 828µs | |
| コード長 | 1,652 bytes |
| 記録 | |
| コンパイル時間 | 2,127 ms |
| コンパイル使用メモリ | 186,308 KB |
| 実行使用メモリ | 19,072 KB |
| 最終ジャッジ日時 | 2026-08-28 04:26:49 |
| 合計ジャッジ時間 | 13,566 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / 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<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll = long long;
using vc = vector<ll>;
template<class Tr=vc>
struct segtree{
int N;
Tr iden;
vector<Tr> tree;
Tr op(Tr a, Tr b){
int ia=0, ib=0, na=a.size(), nb=b.size();
vc ans;
while(ia<na||ib<nb){
ll la=(ia==na?1e18:a[ia]);
ll lb=(ib==nb?1e18:b[ib]);
if(la<lb) ans.push_back(a[ia++]);
else ans.push_back(b[ib++]);
if(ans.size()==10) break;
}
return ans;
}
int pow2(int n){
int ans=1;
while(ans<n) ans*=2;
return ans;
}
//aの型に注意
void build(vector<ll> &a){
int n=a.size();
N=pow2(n);
iden={};
tree.resize(2*N, iden);
for(int i=0; i<n; i++) tree[N+i]={a[i]};
for(int i=N-1; i>=1; i--) tree[i]=op(tree[2*i], tree[2*i+1]);
}
void update(int node, Tr x){ //0-indexed
int i=node+N;
tree[i]=op(tree[i], x); i/=2;
while(i>0){
tree[i]=op(tree[2*i], tree[2*i+1]); i/=2;
}
return;
}
Tr query(int s, int t){ //0-indexed
int left=s+N, right=t+N;
Tr ansl=iden, ansr=iden;
while(left<=right){
if(left%2==1){
ansl=op(ansl, tree[left]); left++;
}
if(right%2==0){
ansr=op(tree[right], ansr); right--;
}
left/=2, right/=2;
}
return op(ansl, ansr);
}
};
int main(void){
int n, q; cin >> n >> q;
vector<ll> s(n);
for(auto&x:s) cin >> x;
segtree seg;
seg.build(s);
while(q--){
int l, r, k; cin >> l >> r >> k; l--, r--;
auto v=seg.query(l, r);
ll ans=0;
for(int i=0; i<k; i++) ans+=v[i];
cout << ans << '\n';
}
return 0;
}