2025.3.23 鲜花

news/2025/3/24 16:38:35/文章来源:https://www.cnblogs.com/xrlong/p/18787556

[省选联考 2025] 追忆 题解

hello (bpm) 2025

恭喜获得 最速被击破奖🏆

不会 bitset,赛时想不到分块也是没救了。

首先必然要坚定 bitset 信念,因为其严格难于导出子图。

维护后继直接 bitset 就是 \(\frac{nm}w\) 的。

考虑到第二个限制 \(l, r\) 如何维护,容易想到的暴力是开 \(n\) 个 bitset,维护出 \(k \in [1, n]\) 的所有集合 \(A_k = \{i \mid a_i \ge k\}\),但是首先空间开不下,其次还有修改。

于是乎想到分块, 设块长是 \(B\),则只维护 \(k = xB\),这样修改是 \(\frac nB\) 的,查询是 \(B\) 的,平衡得 \(\sqrt n\)

这样我们就得到了限制集合 \(C\)

考虑如何求出最大的 \(b\),依然类似维护出 \(B_k\),其等价于是最大的一个 \(k\),满足 \(B_k \cap C \not = \varnothing \And B_{k + 1} \cap C = \varnothing\),依然类似的分块,如果暴力二分复杂度是 \(\frac{n\log \sqrt n}w + \sqrt n\) 的,好像能过 88pts。

考虑优化,容易发现前面的集合对后面有偏序关系,所以这是一个类似前缀和上二分的形式,考虑双指针,手写 bitset,将判断拆成 \(\frac nw\) 个 ull 判交,于是我们枚举每个 ull,维护一个 \(p\) 表示当前的 \(k\),每次尝试更新 \(k \gets k + 1\),最后的 \(p\) 显然就是 \(k\)

最终复杂度 \(\mathcal O(\frac{(n + m)q}w + q\sqrt n)\)

Code
/* Local File
in_out/in.in
in_out/out.out
*/
#include <bits/stdc++.h>
using namespace std;
using llt = long long;
using ull = unsigned long long;
using llf = long double;
#define endl '\n'const int N = 1e5 + 3, W = 64, D = N / W + 1, B = 600, S = N / B + 3;
int n, m, q, va[N], vb[N], pa[N], pb[N];class Bset{
private:ull o[D];
public:bool operator[](int p) const{int l = p / W, r = p - l * W;return (o[l] >> r) & 1;}ull &operator()(int p){return o[p]; }void Set(int p){int l = p >> 6, r = p - l * W;o[l] = o[l] | (1ull << r);}void Res(int p){int l = p >> 6, r = p - l * W;o[l] = o[l] & ~(1ull << r);}Bset &operator|=(const Bset &_){for(int i = 0; i < D; ++i)o[i] |= _.o[i];return *this;}Bset operator|(const Bset &_) const{Bset r(*this);return r |= _;}Bset &operator^=(const Bset &_){for(int i = 0; i < D; ++i)o[i] ^= _.o[i];return *this;}Bset operator^(const Bset &_) const{Bset r(*this);return r ^= _;}Bset &operator&=(const Bset &_){for(int i = 0; i < D; ++i)o[i] &= _.o[i];return *this;}Bset operator&(const Bset &_) const{Bset r(*this);return r &= _;}
};Bset sn[N], ca[S], cb[S];
int bln, id[N], bl[N], br[N];struct Gph{vector<int> to[N];void Add(int u, int v){to[u].emplace_back(v);}void ADD(int u, int v){Add(u, v), Add(v, u);}void Clr(){for(int i = 1; i <= n; ++i)to[i].clear();}
#define For_to(u, v, g) for(auto v : g.to[u])
} g, rg;int rd[N];
void Solve(){cin >> n >> m >> q;for(int i = 1; i <= m; ++i){int u, v; cin >> u >> v;g.Add(u, v), ++rd[u], rg.Add(v, u);}for(int i = 1; i <= n; ++i)cin >> va[i], pa[va[i]] = i;for(int i = 1; i <= n; ++i)cin >> vb[i], pb[vb[i]] = i;queue<int> que;for(int i = 1; i <= n; ++i) if(!rd[i])que.emplace(i);while(!que.empty()){int u = que.front(); que.pop();sn[u].Set(u);For_to(u, v, g) sn[u] |= sn[v];For_to(u, v, rg)if(!--rd[v]) que.emplace(v);}bln = 0;for(int l = 1; l <= n; l += B){++bln;for(int j = bl[bln] = l, r = br[bln] = min(l + B - 1, n); j <= r; ++j)ca[bln].Set(pa[j]), cb[bln].Set(pb[j]), id[j] = bln;}for(int i = bln - 1; i; --i)ca[i] |= ca[i + 1], cb[i] |= cb[i + 1];for(int tst = 1; tst <= q; ++tst){int op; cin >> op;if(op == 1){int x, y; cin >> x >> y;int ix = id[va[x]], iy = id[va[y]];swap(va[x], va[y]), pa[va[x]] = x, pa[va[y]] = y;for(int i = 1; i <= ix; ++i) ca[i].Res(x);for(int i = 1; i <= iy; ++i) ca[i].Set(x);for(int i = 1; i <= iy; ++i) ca[i].Res(y);for(int i = 1; i <= ix; ++i) ca[i].Set(y);}else if(op == 2){int x, y; cin >> x >> y;int ix = id[vb[x]], iy = id[vb[y]];swap(vb[x], vb[y]), pb[vb[x]] = x, pb[vb[y]] = y;for(int i = 1; i <= ix; ++i) cb[i].Res(x);for(int i = 1; i <= iy; ++i) cb[i].Set(x);for(int i = 1; i <= iy; ++i) cb[i].Res(y);for(int i = 1; i <= ix; ++i) cb[i].Set(y);}else{int u, l, r; cin >> u >> l >> r;int il = id[l], ir = id[r];Bset k(ca[il] ^ ca[ir]);for(int i = bl[ir]; i <= r; ++i) k.Set(pa[i]);for(int i = bl[il]; i < l; ++i) k.Res(pa[i]);k &= sn[u];int p = 0;for(int i = 0; i < D; ++i)while(p < bln && (cb[p + 1](i) & k(i))) ++p;if(!p) cout << 0 << endl;elsefor(int i = br[p]; i >= bl[p]; --i){int p = pb[i];if(k[p]){cout << i << endl;break;}}}}
}void Clear(){memset(sn, 0, sizeof sn);memset(ca, 0, sizeof ca);memset(cb, 0, sizeof cb);g.Clr(), rg.Clr();
}int main(){ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);int c, t; cin >> c >> t;while(t--) Solve(), Clear();
}
P

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904092.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给wordpress文章提供在线翻译和朗读的功能

之前有一个用wordpress搭的英文站点,我想给文章每个段落下面加两个“朗读”和“翻译”的按钮,方便英语不好的浏览者快速的了解中文意思和读法。 下面给出实现思路,全部是deepseek给出的代码实现的。 1、在(functions.php)文件末尾加上如下代码function enqueue_custom_scrip…

第五章 影响估算的因素

对软件项目产生影响的因素,可以有多种分类方式。了解这些影响因素有助于提高估算的准确度,并改善对软件项目动态特性的整体理解。 影响到项目工作量、成本和进度的最具决定性的因素毫无疑问是项目的规模。其次是正在开发的软件的类型,紧随其后的是人员因素。开发中使用的编程…

2025.3.25(周二)

4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。 假设一个中国的航空公司规定:① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。③ 中国国内的航班的商务仓有食物供应,但是…

2025.3.19(周三)

2、找零钱最佳组合假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。请结合等价类划分法…

如何使用microSD卡模块与Arduino

MicroSD卡模块 ESP32有不同的microSD卡模块兼容。我们使用microSD卡模块,它使用SPI通信协议进行通信。您可以使用带有SPI接口的任何其他microSD卡模块。这个microSD卡模块也与Arduino板等其他微控制器兼容。学习如何使用microSD卡模块与Arduino。您可以使用默认SPI引脚将其连接…

VMware ESXi 8.0U3d macOS Unlocker OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版)

VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版)VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版) VMware ESXi 8.0U3d macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe …

2025.3.10(周一)

实验二:UI设计 实验目的 本次实验的目的是让大家熟悉Android开发中的UI设计,包括了解和熟悉常用控件的使用、界面布局和事件处理等内容。 实验要求熟悉和掌握界面控件设计 了解Android界面布局 掌握控件的事件处理实验内容 一、 常用控件 1、 常用控件介绍 (1)基本控…

设计一个简单的圆柱形情绪灯

步骤1:打印零件和闪光WLED 3D打印外壳 下载提供的STL或STEP文件,并将它们加载到您首选的切片软件中。调整设置(填充,层高度,支撑),如果需要,打印每个部分。我使用白色PLA,填充15%,层高0.2mm。对于扩散器,它只是一个固体圆柱体,在花瓶模式下打印它。 一旦打印完成,把…

构建一个Pedro Robot

Pedro 2.0是一个完全开源的项目,旨在为每个人提供可访问和可定制的服务。Pedro Robot是一个完全开源的项目,设计为每个人都可以访问和定制。组装起来很容易,不需要螺丝,不需要胶水,不需要工具!完美的制造商,学生和教育工作者希望探索机器人和编程。 所有文档都可以在Pedr…

一文搞懂MCP协议与Function Call的区别

一、前言 大家好,我是六哥! 今天咱们聊聊编程里两个听起来有点复杂的概念——MCP协议和函数调用(function call),其实用大白话来讲,它们就是两种不同的“沟通方式”,就像咱们人与人之间交流也有不同的方式一样。下面我就用生活中的例子和Python代码,给大家好好讲讲它们…

基于Arduino设计RFID门锁系统

使用基于arduino的RFID锁系统实现无缝,无钥匙进入和增强保护,从而改变您的门安全性。你是否厌倦了每次需要开门时都要找钥匙?不如建一个智能锁系统,你只需刷卡就能开门?在本节中,我们将学习如何使用Arduino构建RFID门锁系统。这是一种既有趣又安全的开门方式。 这个Ardui…