LGP11831_1 [UPTS 2025] 追忆 学习笔记

news/2025/3/17 15:59:38/文章来源:https://www.cnblogs.com/OrinLoong/p/18777025

LGP11831_1 [UPTS 2025] 追忆 学习笔记

Luogu Link

前言

又幻想了……唉!

幻想自己场切这道题,最后标准分上升至 \(\text{598pts}\),翻掉了 \(\text{yyz}\),不至于一点脸不要。

本题解基本借鉴这篇题解。

题意简述

给定一个 \(n\)\(m\) 边的简单有向图 \(G\),有 \(m\) 条形如 \((u_i,v_i)\) 的边,其中 \(u_i<v_i\)。每个结点 \(u\) 有两个权值 \(a_u,b_u\),保证 \(\{a_1,\dots,a_n\}\)\(\{b_1,\dots,b_n\}\) 各为一个 \(1\sim n\) 的排列。

给定 \(q\) 次操作,操作分为三种类型:

  1. 交换 \(a_u\)\(a_v\) 的值。
  2. 交换 \(b_u\)\(b_v\) 的值。
  3. 给定 \(u,l,r\),求出满足 \(l\le a_v\le r\) 且存在 \(u\to v\) 路径的所有点 \(v\) 中,\(b_v\) 的最大值。若不存在 \(v\) 满足条件则输出 \(0\)

请注意本题特别的时空限制:

  • 时限 \(\text{9.00s}\)
  • 空限 \(\text{2.00GB}\)

做法解析

首先,“对于所有边均有 \(u_i<v_i\)”说明 \(G\) 是一个 DAG。连这都没看出来的这辈子有了。

询问操作有两个限制,其中“存在 \(u\to v\) 路径”等价于问任意两点可达性了。而这又是个 DAG,所以我们只能也必然要用 bitset 预处理这一信息,方法见代码。这一步是 \(O(\frac{n^2}{w})\) 的。不然题目给你这么大的时空干嘛??????而且这是经典套路!!!

可达性的限制问题解决了,然后呢?\(a_v\) 值域的限制怎么处理?

你想,既然你都已经用 bitset 搞掉一个限制了,你就不倾向于也用 bitset 搞掉另一个限制么?最后两个限制与一下就可以得到完整限制了。

考虑怎么用 bitset 维护 \(a\) 的限制。

我们首先发现,\(\{i\mid a_i\in [l,r]\}\) 的 bitset 明显可以由 \(\{i\mid a_i\ge l\}\) 异或 \(\{i\mid a_i\ge r+1\}\) 得到。考虑到 \(a\) 带修,我们感性理解交换元素不太能用 \(\log\) 做,考虑根号。令块长 \(S=\sqrt{n}\),分块维护根号个 bitset \(A_x=\{i\mid a_i\ge lim_x\}\)。单次修改显然可以 \(\sqrt{n}\) 做,单次询问也是 \(O(\sqrt(n))\) 的。

此时我们对于询问就能得到一个在两个限制下都合法的答案集合 \(C\) 了。我们现在要求的就是 \(\max_{i\in C}b_i\)

你想,既然你都已经用 bitset 把满足限制的点集合搞出来了,你就不倾向于也类似地维护根号个 bitset 依次表示 \(B_u\) 的值在某个区间的点集合吗?最后根号地贪心扫一下然后再 bitset 内扫一下反正差不多不就做完了?

具体来说,维护 \(\sqrt{n}\) 个 bitset \(B_x=\{i\mid k_x\le b_i<k_{x+1}\}\)。然后倒着把 \(B\) 扫一遍,找到第一个 \(B_x\) 满足 \(C\oplus B_x\neq 0\),然后再在块内找……吗?不太行,因为整个 bitset 之间的比较复杂度很高,这样的单次询问复杂度是 \(O(\frac{n}{w}\sqrt{n})\) 的,直接爆了。

但是如果搞个后缀和,就可以秒变 \(O(\frac{n}{w}+\sqrt{n})\) 了。

pEdQ0uF.md.png

原理如图。

好了这题就做完了。

你想,你都已经用 bitset 在赛后把这道题 AC 了,你就不倾向于在赛场上把这题正解写了吗?当时你干嘛去了?

代码实现

略难于 LGP2801,神奇吧,联合省选。

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
using namespace obicet;
const int MaxN=1e5+5,MaxNr=3.5e2;
int N,M,Q,X,Y,Opt,Z;
vector<int> Gr[MaxN];
void addedge(int u,int v){Gr[u].push_back(v);}
int ksiz,knum,lb[MaxNr],rb[MaxNr],bel[MaxN];
int A[MaxN],na[MaxN],B[MaxN],nb[MaxN],ans;
bicet sg[MaxN],sa[MaxNr],sb[MaxNr],sc;
void befinit(int n){for(int i=1;i<=n;i++)Gr[i].clear(),sg[i].reset();ksiz=sqrt(N),knum=pcedi(N,ksiz);for(int i=1;i<=knum;i++)sa[i].reset(),sb[i].reset();
}
void mian(){readi(N),readi(M),readi(Q),befinit(N);for(int i=1;i<=N;i++)Gr[i].clear();for(int i=1;i<=M;i++)readi(X),readi(Y),addedge(X,Y);for(int i=N;i>=1;i--){sg[i].set(i);for(int v : Gr[i])sg[i]|=sg[v];}for(int i=1;i<=knum;i++)lb[i]=rb[i-1]+1,rb[i]=ksiz*i;rb[knum]=N;for(int i=1;i<=N;i++)bel[i]=pcedi(i,ksiz);for(int i=1;i<=N;i++)readi(A[i]),na[A[i]]=i;for(int i=1;i<=N;i++)readi(B[i]),nb[B[i]]=i;for(int i=1;i<=N;i++)sa[bel[A[i]]].set(i),sb[bel[B[i]]].set(i);for(int i=knum-1;i;i--)sa[i]|=sa[i+1],sb[i]|=sb[i+1];while(Q--){readi(Opt);if(Opt==1){readi(X),readi(Y);int kl=bel[A[X]],kr=bel[A[Y]];if(kl>kr)swap(kl,kr);for(int i=kl+1;i<=kr;i++)sa[i].flip(X),sa[i].flip(Y);swap(A[X],A[Y]),swap(na[A[X]],na[A[Y]]);}if(Opt==2){readi(X),readi(Y);int kl=bel[B[X]],kr=bel[B[Y]];if(kl>kr)swap(kl,kr);for(int i=kl+1;i<=kr;i++)sb[i].flip(X),sb[i].flip(Y);swap(B[X],B[Y]),swap(nb[B[X]],nb[B[Y]]);}if(Opt==3){readi(Z),readi(X),readi(Y);ans=0,sc=sa[bel[X]],sc^=sa[bel[Y]+1];for(int i=Y+1;i<=rb[bel[Y]];i++)sc.flip(na[i]);for(int i=lb[bel[X]];i<X;i++)sc.flip(na[i]);sc&=sg[Z];int k=1;for(int i=0;i<bicet::Siz&&k<knum;i++)while(sc.t[i]&sb[k+1].t[i])k++;for(int i=rb[k];i>=lb[k];i--)if(sc.val(nb[i])){ans=i;break;}writi(ans),puts("");}}
}
int Tpn,Tcn;
int main(){readi(Tpn),readi(Tcn);while(Tcn--)mian();return 0;
}

反思总结

经典套路:用 bitset \(O(\frac{n^2}{w})\) 预处理 DAG 任意两点可达性

一个限制能用 bitset,试试把别的限制也用 bitset 干掉,可以考虑分块。

当感觉一个东西可以维护但是复杂度暂时不对时,画画图,搞搞缀和差分,没准就可以了。

后记

暴力可过,怎么回事呢?

你说的对,但是 QOJ 追忆 [-365]

形不成形,意不在意,再回去练练吧!

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

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

相关文章

sql 在两个数据表中,A表存在字段以逗号分隔存储B表的多id对象,进行关联查询

A 表:B表:关联查询 需求为,查询出A表的数据列表,需要将A表关联B表的数据id,概要通过B表的 name 进行输出显示 SELECT A.id,A.name,A.creator,A.created_at,GROUP_CONCAT(B.name SEPARATOR , ) AS B_names -- 将 c_name 合并为逗号分隔的字符串 FROM xf_service_type A LE…

算力市场何以拥有巨大潜力

算力市场未来确实具有巨大的潜力,这一判断基于多个方面的因素: 一、算力成为经济增长的主要驱动力 随着全球数字化转型的迅猛推进,算力已成为推动经济增长的关键引擎。各国纷纷加大在算力基础设施方面的投入,以期为经济发展注入新的活力。例如,欧盟委员会批准了一项名为“…

算法备案拟公示内容编写指南

除了自评估报告,算法备案复审中的拟公示内容也是难度颇大的一份材料,导致很多开发者的算法备案申请被驳回。今天我就提供一份简易模板供大家学习参考(请结合实际情况撰写,不要照抄,不要买模板,否则会判定真实性存疑或高度雷同,影响备案)。(各类文件套模板都会判定该真…

CH585 RF_Basic例程讲解含单向和双向发送

CH585_RF基础通讯例程见下图路径:1、RF初始化参数配置/******************************************************************************** @fn RFRole_Init** @brief RF应用层初始化** @param None.** @return None.*/ void RFRole_Init(void) {rfTaskID = TMOS_…

uniapp整合SQLite(Android)

一、勾选SQLite数据库选项 (1)HBuilder工具打开项目 (2)项目/manifest.json =>App模块配置 => 勾选SQLite(数据库)二、封装sqlite.ts 在项目根目录下创建sqlite/sqlite.ts// 数据库名称 const dbName = scan/*** 数据库地址* @type {String} 推荐以下划线为开头 _d…

No.68 Vue---vue3新特性

一、vue3新特性 1.1 六大亮点二、组合API(setup)2.1 ref或者reactive 1、创建项目 vue create vue-demo5 2、进入文件,启动服务。 3、 2.2 methods中定义的方法写在setup() 2.3setup()中使用props和context 在2.x中,组件的方法中可以通过this获取到当前组件的实例,并执…

2025年2月国产数据库大事记-墨天轮

​本文为墨天轮社区整理的2025年2月国产数据库大事件和重要产品发布消息,一起看看2月有哪些大事发生~本文为墨天轮社区整理的2025年2月国产数据库大事件和重要产品发布消息。 目录2025年2月国产数据库大事记 TOP10 2025年2月国产数据库大事记(时间线) 产品/版本发布 兼容认证…

Mybatis-入门

配置:JDBC:原始HDBC的问题:数据库连接池:lombok:

SimpleRev(buu-reverse)

IDA打开题目大致看主函数没什么东西,主要控制开始和退出,我们进入decry加密函数看看,下面给出ai注释后的伪代码方便理解点击查看代码 // 解密验证函数,返回栈保护校验值 unsigned __int64 Decry() {// 局部变量声明(IDA自动生成的变量名)char v1; // 临时存…

soildworks装配体流体仿真

模型分析区域缩放可以将一个零件的分析结果导入到另一仿真中去 右键项目>自定义树>调用边界条件> 右键边界条件,添加之前的边界条件

因为Apifox不支持离线,我果断选择了Apipost!

要说国内最有名的两款API开发工具不是Apipost就是Apifox,因为曾经遭遇到这样的事情,导致我坚定的选择了Apipost。一个以用户立场设计工具、愿意把选择权交给用户的工具,是充分考虑用户和尊重用户的,这才应该是工具进化的终极意义。要说国内最有名的两款API开发工具不是Apip…