当前位置: 首页 > news >正文

D. Eating【Codeforces Round 1005 (Div. 2)】

D. Eating

题意

n n n 个史莱姆排成一行,第 i i i 个史莱姆的权重为 w i w_i wi。若史莱姆 i i i 的权重满足 w i ≥ w j w_i \geq w_j wiwj,则它可以吃掉史莱姆 j j j;之后,史莱姆 j j j 会消失,史莱姆 i i i 的权重变为 w i ⊕ w j w_i \oplus w_j wiwj ∗ ^{\text{∗}}

史莱姆国王想用参数 x x x 进行以下实验:

• 将一个权重为 x x x 的新史莱姆添加到行的最右端(第 n n n 个史莱姆之后)。

• 这个新史莱姆会尝试吃掉左侧的史莱姆(若满足条件),并移动到被吃者的位置。此过程会持续直到其左侧没有史莱姆,或者左侧史莱姆的权重大于它当前的值。(此过程中其他史莱姆不会被吃掉。)

• 实验的得分为被吃掉的史莱姆总数。

国王会询问 q q q 次查询。每次查询给定整数 x x x,你需要计算该参数下实验的得分。注意这些查询是假设性的,不会实际改变史莱姆的状态(即查询之间相互独立)。

∗ ^{\text{∗}} 此处 ⊕ \oplus 表示按位异或运算。

输入格式

第一行输入整数 t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1t104),表示测试用例数量。

每个测试用例的第一行包含整数 n n n q q q ( 1 ≤ n , q ≤ 2 ⋅ 1 0 5 1 \le n, q \le 2 \cdot 10^5 1n,q2105),分别表示史莱姆数量和查询次数。

第二行包含 n n n 个整数 w 1 , w 2 , … , w n w_1,w_2,\ldots,w_n w1,w2,,wn ( 1 ≤ w i < 2 30 1 \le w_i < 2^{30} 1wi<230),表示史莱姆的权重。

接下来 q q q 行每行输入一个整数 x x x ( 1 ≤ x < 2 30 1 \le x < 2^{30} 1x<230),表示实验参数。

所有测试用例的 n n n 之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105 q q q 之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105

输出格式

对于每个查询,输出一个整数,表示对应实验的得分。

思路

区间异或和可以用前缀和来快速查询,并且若a的最高有效位大于b,那么a>b。

因此预处理每个位置的二进制信息,利用贪心跳跃加速查询:

  1. 预处理:对每个位置i,记录其二进制位数。维护数组j[i][k],表示在i左侧,二进制位数不超过k的最远位置。这能快速定位可吞吃区间。

  2. 跳跃查询:从右向左处理,每次计算当前x的二进制位数g。利用j[t][g]找到最远可吞吃的位置l,此时区间[l, t]的史莱姆均满足条件。累加数量后,更新x为异或结果,并跳到l-1继续处理。

  3. 复杂度优化:通过预处理,每次查询只需 O ( l o g max ⁡ W ) O(log \max{W}) O(logmaxW)次跳跃,总复杂度 O ( q log ⁡ max ⁡ W ) O(q \log \max{W}) O(qlogmaxW),避免暴力遍历。

通过预处理二进制信息实现快速跳跃,将每次查询的时间从线性优化为对数级。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define int long long
#define pb push_back
#define pii pair<int,int>
#define FU(i, a, b) for(int i = (a); i <= (b); ++ i)
#define FD(i, a, b) for(int i = (a); i >= (b); -- i)
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int maxn= 5e5+5,MAXN = maxn;
int a[200005];
int p[200005];
int j[200005][31];
int rj[31];
int qr(int l,int r){if(l==r)return a[l];return p[r]^p[l-1];
}
void solve() {int n,q;cin>>n>>q;for(int i=1;i<=n;i++){cin>>a[i];p[i]=p[i-1]^a[i];int l= log2(a[i])+1;rj[l]=i;for(int k=1;k<=l;k++)rj[k]=i;for(int k=1;k<=30;k++){j[i][k]=rj[k];}}while(q--){int x,t=n,ans=0;cin>>x;while(x>=a[t] && t>0){int g=log2(x)+1;int l = min(t,j[t][g]+1);x=x^qr(l,t);ans+=t-l+1;t=l-1;}cout<<ans<<" ";}   cout<<endl;
}	signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("../in.txt", "r", stdin);
#endifcin.tie(0)->ios::sync_with_stdio(0);int T = 1;cin >> T;while (T--) {solve();}return 0;
}	

相关文章:

  • 微机原理与接口技术知识点总结——8086微处理器ddddd
  • 16 - VDMA之视频转发实验
  • 字符串检索算法:KMP和Trie树
  • 解决 PicGo 上传 GitHub图床及Marp中Github图片编译常见难题指南
  • VUE3 -综合实践(Mock+Axios+ElementPlus)
  • 安全合规检查开源项目ComplianceAsCode/content详解及操作系统新产品开发适配指南
  • less中使用 @supports
  • tensorflow安装及简单例程学习
  • Baklib知识中台赋能业务智能跃迁
  • 使用大模型预测急性结石性疾病技术方案
  • 现代计算机图形学Games101入门笔记(六)
  • HPE ProLiant DL360 Gen11 服务器,配置 RAID 5 教程!
  • C#11的特性
  • echarts中一些关键的配置
  • SCADA|KingSCADA中如何使用自定义函数优化脚本程序?
  • Java问题排查常用命令行工具速查表
  • Android多媒体——媒体start流程分析(十三)
  • 深入解析 PostgreSQL 外部数据封装器(FDW)的 SELECT 查询执行机制
  • 【vLLM 学习】基础教程
  • 4G物联网模块实现废气处理全流程数据可视化监控配置
  • 透视社会组织创新实践中的花开岭现象:与乡村发展的融合共进
  • 遭“特朗普关税”冲击,韩国今年经济增长预期“腰斩”降至0.8%
  • 商务部就开展加强战略矿产出口全链条管控工作应询答记者问
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • 最高降九成!特朗普签署降药价行政令落地存疑,多家跨国药企股价收涨
  • 金价大跌!足金饰品每克一夜便宜14元,涨势是否已终结?