【离线+LogTrick】codeforces 1878 E. Iva & Pav
题目
https://codeforces.com/problemset/problem/1878/E
题意
输入一个正整数
第一行,输入一个整数
第二行,输入长为
第三行,输入一个整数
接下来
对于每个询问,回答出满足
保证:
题解
首先,要思考如何计算
对于按位与运算,有规则:同 1 则为 1,有 0 便为 0。那么越多个数进行按位与运算,计算结果必定是单调递减的。我们不妨举个例子:
的情况:
的情况:
的情况:
的情况:
观察上述样例,容易发现的是,
原因很简单,就是
若
那么,我们来思考一下,发生按位与后结果不同的最多可能性有多少种?
int 型整数共有 32 位,按位与后结果不同,则至少要有一位变为 0,那么至多变 32 次。
那么,若加上这个性质,最差时间复杂度为
最后将询问按照
参考代码
void solve() { cin >> n; for (int i = 1; i <= n; ++ i) cin >> a[i]; cin >> m; for (int i = 0; i < m; ++ i) { nd[i].i = i; cin >> nd[i].j >> nd[i].k; } sort(nd, nd + m); for (int i = n, j = m - 1; j >= 0; -- i) { for (int k = i + 1; k <= n; ++ k) { if ((a[k] & a[k - 1]) == a[k]) break; a[k] = a[k] & a[k - 1]; } while (j >= 0 && nd[j].j == i) { if (a[i] < nd[j].k) ans[nd[j].i] = -1; else { int le = i, ri = n, md; while (le < ri) { md = le + ri + 1 >> 1; if (a[md] >= nd[j].k) le = md; else ri = md - 1; } ans[nd[j].i] = le; } -- j; } } for (int i = 0; i < m; ++ i) cout << ans[i] << ' '; cout << '\n'; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee