結果
問題 |
No.3284 Picnic with Friends
|
ユーザー |
![]() |
提出日時 | 2025-09-27 13:54:19 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 696 ms / 7,000 ms |
コード長 | 2,472 bytes |
コンパイル時間 | 3,408 ms |
コンパイル使用メモリ | 315,176 KB |
実行使用メモリ | 344,404 KB |
最終ジャッジ日時 | 2025-09-27 13:54:37 |
合計ジャッジ時間 | 17,002 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 25 |
ソースコード
#include<bits/stdc++.h> namespace { #pragma GCC diagnostic ignored "-Wunused-function" #include<atcoder/all> #pragma GCC diagnostic warning "-Wunused-function" using namespace std; using namespace atcoder; #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(x) begin(x), end(x) unsigned long long res_small[100001]; int ptr_inc_ev = 0; pair<unsigned int, unsigned int> inc_ev[100001]; // 10^7.5 = 31622776.6... int ptr_dec_ev = 0; unsigned long long dec_ev[31622776]; template <class T> void add_sub(T t) { unsigned int sq = sqrt(t); for (unsigned int i = 1; i <= sq; i++) { res_small[i] += t / i; } unsigned int q = t / (sq + 1); inc_ev[ptr_inc_ev++] = {sq + 1, q}; for (; q >= 1; q--) { dec_ev[ptr_dec_ev++] = t / q + 1; } } void add(unsigned long long t) { if (in_range<unsigned int>(t)) add_sub<unsigned int>(t); else add_sub<unsigned long long>(t); } template <auto a> void radix_sort(int sz) { assert (0 <= sz && sz <= 31622776); span sp1(a, a + sz); static int ptr[(1 << 17)+1]; static unsigned long long b[31622776]; for (auto x : sp1) ptr[(x & ((1 << 17) - 1))+1]++; for (int i = 0; i < 1 << 17; i++) ptr[i+1] += ptr[i]; for (auto x : sp1) b[ptr[x & ((1 << 17) - 1)]++] = x; memset(ptr, 0, sizeof(ptr)); span sp2(b, b + sp1.size()); for (auto x : sp2) ptr[(x >> 17) + 1]++; for (int i = 0; i < 1 << 17; i++) ptr[i+1] += ptr[i]; for (auto x : sp2) a[ptr[(x >> 17)]++] = x; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<unsigned long long> s(n); rep(i, n) cin >> s[i]; int q; cin >> q; long long from = -1, to = -1; rep(i, q) { long long t, f; cin >> t >> f; if (to < t) add(to - from), from = t, to = t + f; else to += f; } add(to - from); ranges::sort(inc_ev, inc_ev + ptr_inc_ev, {}, &pair<unsigned int, unsigned int>::first); radix_sort<dec_ev>(ptr_dec_ev); vector<int> ord(n); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int i, int j) { return s[i] < s[j]; }); vector<unsigned long long> ans(n); unsigned long long now = 0; int pi = 0, pd = 0; for (int i : ord) { while (pi < ptr_inc_ev && inc_ev[pi].first <= s[i]) now += inc_ev[pi++].second; while (pd < ptr_dec_ev && dec_ev[pd] <= s[i]) now--, pd++; ans[i] = s[i] <= 100000 ? res_small[s[i]] + now : now; } for (auto x : ans) cout << x << '\n'; }