結果
問題 |
No.3116 More and more teleporter
|
ユーザー |
|
提出日時 | 2025-04-18 23:25:38 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 142 ms / 2,000 ms |
コード長 | 2,925 bytes |
コンパイル時間 | 2,218 ms |
コンパイル使用メモリ | 198,580 KB |
実行使用メモリ | 19,712 KB |
最終ジャッジ日時 | 2025-04-18 23:25:49 |
合計ジャッジ時間 | 4,476 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:80:30: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘ll’ {aka ‘long long int’} [-Wformat=] 80 | if (a == 1) printf("%d\n", tr.query(1, b)); | ~^ ~~~~~~~~~~~~~~ | | | | int ll {aka long long int} | %lld main.cpp:79:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 79 | scanf("%d%d", &a, &b); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:82:18: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 82 | scanf("%d", &c); | ~~~~~^~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; typedef pair<long long, int> pli; typedef pair<int, pair<int, int> > piii; typedef long long ll; const int N = 2000086, MOD = 1e9 + 7, INF = 0x3f3f3f3f; ll res; int n, m, cnt, w[N]; struct ST { struct Node { int l, r; int v[2], flag[2]; }; vector<Node> tr; ST(ST&& other) noexcept : tr(move(other.tr)) { } ST (int l, int r) : tr(vector<Node>(((r - l + 10) << 2) + 10)) { build(1, l, r); } ST& operator=(ST&& other) noexcept { if (this != &other) { tr = move(other.tr); } return *this; } private: void pushdown(Node& u, Node& l, Node& r) { for (int i = 0; i < 2; i++) { if (!u.flag[i]) continue; l.v[i] = u.flag[i] + (r.r - r.l + 1) * i; r.v[i] = u.flag[i] + (l.r - l.l + 1) * !i; l.flag[i] = l.v[i], r.flag[i] = r.v[i]; u.flag[i] = 0; } } void pushdown(int u) { if (tr[u].flag[0] || tr[u].flag[1]) pushdown(tr[u], tr[u << 1], tr[u << 1 | 1]); } void build(int u, int l, int r) { tr[u] = {l, r, {l - 1, l - 1}}; if (l == r) return; int mid = l + r >> 1; build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); } public: ll query(int u, int x) { if (tr[u].l == tr[u].r) return min(tr[u].v[0], tr[u].v[1]); pushdown(u); int mid = tr[u].l + tr[u].r >> 1; if (x <= mid) return query(u << 1, x); return query(u << 1 | 1, x); } void modify(int u, int l, int r, ll v, int p) { if (tr[u].l >= l && tr[u].r <= r) { if (!p) tr[u].flag[p] = v + (tr[u].l - l), tr[u].v[p] = v + (tr[u].l - l); else tr[u].flag[p] = v + (r - tr[u].r), tr[u].v[p] = v + (r - tr[u].r); } else { pushdown(u); int mid = tr[u].l + tr[u].r >> 1; if (l <= mid) modify(u << 1, l, r, v, p); if (r > mid) modify(u << 1 | 1, l, r, v, p); } } }; int main() { cin >> n >> m; ST tr(1, n); while (m--) { int a, b, c; scanf("%d%d", &a, &b); if (a == 1) printf("%d\n", tr.query(1, b)); else { scanf("%d", &c); if (tr.query(1, b) <= c) continue; int pl, pr; int l = 1, r = b; while (l < r) { int mid = l + r >> 1; if (tr.query(1, mid) <= c + b - mid) l = mid + 1; else r = mid; } pl = l; l = b, r = n; while (l < r) { int mid = l + r + 1 >> 1; if (tr.query(1, mid) <= c + mid - b) r = mid - 1; else l = mid; } pr = r; if (pl != b) tr.modify(1, pl, b - 1, c + 1, 1); tr.modify(1, b, pr, c, 0); } } return 0; }