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

P11831 [省选联考 2025] 追忆 题解

我该在哪里停留?我问我自己。

题目链接

很难想象专门有一道题目考察bitset

这道题目的 \(O(nq)\) 做法是显然的,预处理就行了。

考虑转化一下限制:令集合 \(S\) 表示可用点的集合,则 \(S = \{ i|u\to i,l\le a_i \le r\}\)。然后取点集中 \(b\) 的最大值即可。

那么可以拆一下限制:第一个限制是好处理的,在 DAG 图上可以使用 bitset 做到 \(O(nm/w)\)。对于第二部分,我们可以使用小巧思。

令集合 \(A_x = \{ i|a_i\ge x\}\)。则限制也就变为了 \(A_l - A_r\)。因此可以考虑分块,把 \(n\) 分成 \(\sqrt n\) 段,维护bitset,修改操作直接更新每一段,查询操作散块直接查,整块使用 xor 处理就行了。

然后再考虑怎么处理 \(b\),可以维护与 \(a\) 同样的 \(B_x\),从大到小尝试与 \(x\) 求交,如果有交,可以直接在块里找答案。

这里需要注意需要手写 bitset,不然会因为求交的次数过多直接 TLE

Code

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
#define ull unsigned long long
const int siz = 1570;
const int N = 1e5 + 10;
const int M = 340;
int n,m,Q;
struct bitst{ull a[siz];void reset(){memset(a,0,sizeof a);}void set(int x){a[(x >> 6)] |= 1ull << (x & 63ll);}void flip(int x){a[x>>6] ^= 1ull << (x & 63ll);}void operator &= (bitst o){for(int i=0;i<siz;i++) a[i] &= o.a[i];}void operator |= (bitst o){for(int i=0;i<siz;i++) a[i] |= o.a[i];}void operator ^= (bitst o){for(int i=0;i<siz;i++) a[i] ^= o.a[i];}int ask(int x){return (a[x >> 6] >> (x & 63))& 1;}
};
bitst A[M],B[M];
bitst to[N];
int a[N],b[N];
int ia[N],ib[N];
vector<int> G[N];
int L[M],R[M];
int len;
void solve(){for(int i=1;i<=n;i++) G[i].clear(),to[i].reset();for(int i=1;i<=len;i++) A[i].reset(),B[i].reset();cin >> n >> m >> Q;int S = sqrt(n);len = (n-1) / S + 1;for(int i=1;i<=len;i++){L[i] = R[i-1];R[i] = i * S;}R[len] = n;for(int i=1;i<=m;i++){int u,v;cin >> u >> v;G[u].push_back(v);}for(int i=1;i<=n;i++){cin >> a[i];ia[a[i]] = i;int block = (a[i] - 1) / S + 1;A[block].set(i);}for(int i=1;i<=n;i++){cin >> b[i];ib[b[i]] = i;int block = (b[i] - 1) / S + 1;B[block].set(i);}for(int i=len;i;i--){A[i] |= A[i+1];B[i] |= B[i+1];}for(int i=n;i>=1;i--){to[i].set(i);for(int v : G[i]) to[i] |= to[v];}while(Q -- ){int op;cin >> op;if(op == 1){int x,y;cin >> x >> y;int l,r;l = (a[x] - 1) / S + 1;r = (a[y] - 1) / S + 1;if(l > r) swap(l,r);for(int i=l+1;i<=r;i++)A[i].flip(x),A[i].flip(y);swap(a[x],a[y]);swap(ia[a[x]],ia[a[y]]);}else if(op == 2){int x,y;cin >> x >> y;int l,r;l = (b[x] - 1) / S + 1;r = (b[y] - 1) / S + 1;if(l > r) swap(l,r);for(int i=l+1;i<=r;i++)B[i].flip(x),B[i].flip(y);swap(b[x],b[y]);swap(ib[b[x]],ib[b[y]]);}else{int x,l,r;cin >> x >> l >> r;bitst bt;bt.reset();int block_l = (l - 1) / S + 1;int block_r = (r - 1) / S + 1;if(block_l+1 <= block_r){bt = A[block_l+1];bt ^= A[block_r];}for(int i=l;i<=R[block_l];i++) bt.set(ia[i]);for(int i=L[block_r];i<=r;i++) bt.set(ia[i]);bt &= to[x];int pos=0;for(int i=0;i<siz && pos < len;i++){while(bt.a[i] & B[pos+1].a[i]) pos ++ ;}int ans = 0;for(int i=R[pos];i>=L[pos];i--){if(bt.ask(ib[i])){ans = i;break;}}cout << ans << "\n";}}
}
int main()
{
//	File("recall");IOS;int c,T;cin >> c >> T;while(T -- ) solve();return 0;
}

http://www.jsqmd.com/news/438051/

相关文章:

  • 公路隧道内各种类型车辆检测数据集VOC+YOLO格式2088张6类别
  • React Native for OpenHarmony 进阶:深度剖析 TouchableOpacity 的交互...
  • GitHub 本地仓库如何推送到远程?
  • 专属私教,精准赋能|武汉瑜伽私教课程,禧悦为你定制专属瑜伽之路 - 冠顶工业设备
  • 基于STM32的智能盆栽管家系统设计与实现(开题报告2)
  • 关闭WPS自动弹出登录窗 - 指南
  • 江苏有哪些专业做模流仿真服务的公司? - 冠顶工业设备
  • go实现单机版限流
  • Transformers API 深度探索:超越基础调用的高级范式与工程实践
  • CF2106E Wolf 题解
  • zerofs 支持wal 存储到独立地方
  • springboot+vue高校学生评教系统
  • 上海捷勃特机器人|智能制造工时管理的 “效率革命” - 搭贝
  • 2026年家居建装设计潮流去哪个展会看最好?五大顶级展会全景指南助你抢占先机 - 匠言榜单
  • 不同规模医院成本核算管理系统应用实践与厂商适配 - 业财科技
  • 大模型对齐的Benchmark准吗?看看腾讯混元的RubricBench
  • PiliPlus 2.0.0.1 | 基于Flutter开发的第三方哔哩,目前最好用的一款
  • HDx播放器1.0.197 | 支持多种格式和4K/8K高清视频播放,内置推特~脸书下载器
  • 省选集训 40 - 容斥原理
  • 《PicoServer 跨平台轻量级 Web Admin 实战系列》总序
  • 解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南
  • 平衡kube-apiserver流量
  • 一会就得回学校
  • 第9章 丰富你的程序,运用手机多媒体
  • 2026桔多多借贷靠谱吗?从合规服务看用户体验 - 品牌排行榜
  • 第10章 后台默默的劳动者,探究Service
  • 桔多多是干嘛的?为23-50岁用户提供消费服务平台 - 品牌排行榜
  • 桔多多逾期怎么还款?2026年实用还款流程指引 - 品牌排行榜
  • 【信息科学与工程学】【管理科学】第二十五篇 企业高管运作模型框架02
  • 莫名奇妙的nginx请求偶发400