結果
| 問題 |
No.3284 Picnic with Friends
|
| コンテスト | |
| ユーザー |
Kude
|
| 提出日時 | 2025-09-27 13:54:19 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 887 ms / 7,000 ms |
| コード長 | 2,472 bytes |
| コンパイル時間 | 4,543 ms |
| コンパイル使用メモリ | 315,152 KB |
| 実行使用メモリ | 344,488 KB |
| 最終ジャッジ日時 | 2025-10-08 17:06:47 |
| 合計ジャッジ時間 | 20,069 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
#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';
}
Kude