結果
| 問題 |
No.2101 [Cherry Alpha N] ずっとこの数列だったらいいのに
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-10-14 22:43:54 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,096 ms / 6,000 ms |
| コード長 | 4,509 bytes |
| コンパイル時間 | 2,573 ms |
| コンパイル使用メモリ | 196,480 KB |
| 実行使用メモリ | 67,456 KB |
| 最終ジャッジ日時 | 2024-06-26 16:20:04 |
| 合計ジャッジ時間 | 38,456 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 42 |
コンパイルメッセージ
main.cpp: In function 'void in(T& ...)':
main.cpp:28:55: warning: fold-expressions only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
28 | template<class... T> void in(T&... a){ (cin >> ... >> a); }
| ^
main.cpp: In function 'void out(const T&, const Ts& ...)':
main.cpp:30:112: warning: fold-expressions only available with '-std=c++17' or '-std=gnu++17' [-Wc++17-extensions]
30 | template<class T, class... Ts> void out(const T& a, const Ts&... b){ cout << a; (cout << ... << (cout << ' ', b)); cout << '\n'; }
| ^
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i = 0; i < (int)(n); ++i)
#define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; --i)
#define ALL(a) a.begin(), a.end()
#define Sort(a) sort(a.begin(), a.end())
#define RSort(a) sort(a.rbegin(), a.rend())
typedef long long int ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<long long> vll;
typedef vector<char> vc;
typedef vector<string> vst;
typedef vector<double> vd;
typedef pair<long long, long long> P;
const long long INF = 0x1fffffffffffffff;
const long long MOD = 1000000007;
const long double PI = acos(-1);
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T, class U> inline T vin(T& vec, U n) { vec.resize(n); for(int i = 0; i < (int) n; ++i) cin >> vec[i]; return vec; }
template<class T> inline void vout(T vec, string s = "\n"){ for(auto x : vec) cout << x << s; }
template<class... T> void in(T&... a){ (cin >> ... >> a); }
void out(){ cout << '\n'; }
template<class T, class... Ts> void out(const T& a, const Ts&... b){ cout << a; (cout << ... << (cout << ' ', b)); cout << '\n'; }
template<class T, class U> void inGraph(vector<vector<T>>& G, U n, U m, bool directed = false){ G.resize(n); for(int i = 0; i < m; i++){ int a, b; cin >> a >> b; a--, b--; G[a].push_back(b); if(!directed) G[b].push_back(a); } }
template <typename T>
struct binary_indexed_tree{
int N;
vector<T> BIT;
binary_indexed_tree(int N): N(N), BIT(N + 1, 0){
}
void add(int i, T x){
i++;
while(i <= N){
BIT[i] += x;
i += i & -i;
}
}
T sum(int i){
T ans = 0;
while(i > 0){
ans += BIT[i];
i -= i & -i;
}
return ans;
}
T sum(int L, int R){
return sum(R) - sum(L);
}
int lower_bound(T x){
if(x <= 0){
return 0;
}else{
int v = 0, r = 1;
while(r < N) r = r << 1;
for(int len = r; len > 0; len = len >> 1){
if(v + len < N && BIT[v + len] < x){
x -= BIT[v + len];
v += len;
}
}
return v;
}
}
int upper_bound(T x){
if(x < 0){
return 0;
}else{
int v = 0, r = 1;
while(r <= N) r = r << 1;
for(int len = r; len > 0; len = len >> 1){
if(v + len <= N && BIT[v + len] <= x){
x -= BIT[v + len];
v += len;
}
}
return v;
}
}
};
ll n, q;
vll a, t;
void input(){
in(n);
a.resize(n); t.resize(n);
rep(i, n) in(a[i], t[i]);
in(q);
}
void solve(){
binary_indexed_tree<ll> BIT1(n), BIT2(n), BIT3(n), cnt1(n), cnt2(n), cnt3(n);
map<ll, vector<ll>> mp1, mp2;
rep(i, n){
BIT1.add(i, a[i]);
cnt1.add(i, 1);
if(mp1.count(t[i]) == 0){
mp1[t[i]] = {};
}
if(mp2.count(t[i] + a[i]) == 0){
mp2[t[i] + a[i]] = {};
}
mp1[t[i]].push_back(i);
mp2[t[i] + a[i]].push_back(i);
}
vector<tuple<ll, ll, ll, ll>> query(q);
rep(i, q){
ll d, l, r; in(d, l, r);
query[i] = {d, l, r, i};
}
Sort(query);
vll ans(q);
rep(i, q){
ll d = get<0>(query[i]), l = get<1>(query[i]), r = get<2>(query[i]), k = get<3>(query[i]);
l--;
while(true){
auto iter = mp1.upper_bound(d);
if(iter == mp1.begin()) break;
iter--;
for(auto x : iter->second){
cnt1.add(x, -1);
BIT1.add(x, -a[x]);
cnt2.add(x, 1);
BIT2.add(x, t[x] + a[x] - 1);
}
mp1.erase(iter->first);
}
while(true){
auto iter = mp2.upper_bound(d);
if(iter == mp2.begin()) break;
iter--;
for(auto x : iter->second){
cnt2.add(x, -1);
BIT2.add(x, -t[x] -a[x] + 1);
}
mp2.erase(iter->first);
}
ll res = BIT1.sum(l, r) + BIT2.sum(l, r) + cnt2.sum(l, r) * (-d);
ans[k] = res;
}
vout(ans, "\n");
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
input();
solve();
}