日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[NOI 2017]整数

發(fā)布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [NOI 2017]整数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

題庫鏈接

P 博士將他的計(jì)算任務(wù)抽象為對一個整數(shù)的操作。

具體來說,有一個整數(shù) \(x\) ,一開始為 \(0\)

接下來有 \(n\) 個操作,每個操作都是以下兩種類型中的一種:

  • 1 a b :將 \(x\) 加上整數(shù) \(a\cdot 2^b\) ,其中 \(a\) 為一個整數(shù), \(b\) 為一個非負(fù)整數(shù)
  • 2 k :詢問 \(x\) 在用二進(jìn)制表示時,位權(quán)為 \(2^k\) 的位的值(即這一位上的 \(1\) 代表 \(2^k\)

保證在任何時候, \(x\geqslant 0\)

\(1\leq n\leq 10^6,|a| \leq 10^9,0 \leq b, k \leq 30n\)

Solution

考慮稍微暴力一點(diǎn)的做法,我們開兩個數(shù)組來模擬進(jìn)位(一個是 \(a > 0\) ,另一個 \(a < 0\) )。

然后對于詢問,我們假設(shè)小于 \(k\) 位的部分 \(a>0\) 的是 \(s_1\)\(a<0\) 的是 \(s_2\)

討論所有情況,我們可以得出結(jié)論:

  • \(s_1\geq s2\) ,輸出答案為 \([x\oplus y]\) ,其中 \(x\)\(a>0\) 的第 \(k\) 位的值, \(y\)\(a<0\) 的第 \(k\) 位的值。
  • \(s_1< s2\) ,輸出答案為 \([x=y]\)

這樣總復(fù)雜度是 \(O(30n\log(30n))\) 的。

考慮優(yōu)化。

直接拿 \(\text{zkw線段樹}\) 卡過去啦!

Code

#include <bits/stdc++.h> using namespace std; const int M = 1000000*30+300; void gi(int &x) {char ch = getchar(); x = 0; int flag = 0;for (; ch < '0' || ch > '9'; ch = getchar()) flag |= (ch == '-');for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x<<1)+(x<<3)+ch-48;if (flag) x = -x; }int s1[M], s2[M], tr[(1<<26)+5]; int n, N, rbsc, opt, a, b, lst[32], bin[32], tot;void modify(int *s, int a, int b) {tot = 0;for (int i = 30; i >= 0 && a; i--)if (bin[i]&a) lst[++tot] = i, a -= bin[i];int r = lst[1]+b, l = lst[tot]+b;for (int i = 1; i <= tot; i++) {int loc = lst[i]+b;while (s[loc]) s[loc++] = 0;r = max(r, loc), s[loc] = 1;}for (int i = l; i <= r; i++) tr[N+i] = (s1[i]^s2[i]);for (l = (l+N)>>1, r = (r+N)>>1; l; l >>= 1, r >>= 1)for (int j = l; j <= r; j++) tr[j] = tr[j<<1]|tr[j<<1|1]; } int query(int a) {for (a += N; a; a >>= 1)if (a&1&tr[a^1]) {for (a ^= 1; a < N; a = a<<1|tr[a<<1|1]);return a-N;}return -1; } void work() {gi(n); gi(rbsc), gi(rbsc), gi(rbsc);for (N = 1; N <= n*30; N <<= 1);bin[0] = 1; for (int i = 1; i <= 30; i++) bin[i] = (bin[i-1]<<1);while (n--) {gi(opt);if (opt == 1) {gi(a), gi(b);if (a < 0) modify(s2, -a, b);else modify(s1, a, b);}else {gi(a); int now = query(a);if (now == -1 || s1[now] > s2[now]) putchar('0'+(s1[a]^s2[a]));else putchar('0'+(s1[a] == s2[a]));putchar('\n');}} } int main() {work(); return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/NaVi-Awson/p/9290018.html

總結(jié)

以上是生活随笔為你收集整理的[NOI 2017]整数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。