結果
問題 |
No.3284 Picnic with Friends
|
ユーザー |
|
提出日時 | 2025-09-27 15:52:12 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,765 bytes |
コンパイル時間 | 2,013 ms |
コンパイル使用メモリ | 203,440 KB |
実行使用メモリ | 34,980 KB |
最終ジャッジ日時 | 2025-09-27 15:52:39 |
合計ジャッジ時間 | 26,483 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 15 WA * 10 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:23:42: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 23 | for (int i = 1; i < n + 1; i++) scanf("%lld", v + i); | ~~~~~^~~~~~~~~~~~~~~ main.cpp:25:42: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 25 | for (int i = 1; i < m + 1; i++) scanf("%lld%lld", &e[i].t, &e[i].v); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; typedef long long ll; const int N = 2000086, MOD = 998244353;//, INF = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3f; int n, m, w[N]; struct Node { ll t, v; }e[N]; ll v[N]; vector<ll> num; int find(int x) { return lower_bound(num.begin(), num.end(), x) - num.begin(); } ll a[N], s[N]; ll pa[N], ps[N]; int main() { cin >> n; for (int i = 1; i < n + 1; i++) scanf("%lld", v + i); cin >> m; for (int i = 1; i < m + 1; i++) scanf("%lld%lld", &e[i].t, &e[i].v); ll l = 0, r = 0; vector<ll> g; for (int i = 1; i < m + 1; i++) { if (!l) l = e[i].t, r = e[i].t + e[i].v; else { if (r >= e[i].t) r += e[i].v; else g.push_back(r - l), l = e[i].t, r = e[i].t + e[i].v; } } if (l) g.push_back(r - l); for (int i = 1; i < n + 1; i++) num.push_back(v[i]); sort(num.begin(), num.end()); num.erase(unique(num.begin(), num.end()), num.end()); for (auto u : g) { ll l = 1; while (l <= u) { ll v = u / l, r = u / v; if (r <= 100000) { pa[l] += v, pa[r + 1] -= v; } else { int pl = find(l), pr = find(r + 1); if (pl < pr) a[pl] += v, a[pr] -= v; } l = r + 1; } } for (int i = 1; i <= 100000; i++) ps[i] = ps[i - 1] + pa[i]; s[0] = a[0]; if (num[0] <= 100000) s[0] += ps[num[0]]; for (int i = 1; i < num.size(); i++) { s[i] = s[i - 1] + a[i]; if (num[i - 1] <= 100000) s[i] -= ps[num[i - 1]]; if (num[i] <= 100000) s[i] += ps[num[i]]; } for (int i = 1; i < n + 1; i++) printf("%lld\n", s[find(v[i])]); return 0; }