P8936 月下缭乱 Sol
考虑对操作的区间 \([l_i,r_i]\) 的下标进行扫描线而不是对操作的值扫。用 \(m\) 个 set 动态维护 \(x_i\) 对应的操作的下标集合,再用一个可删堆来维护当前所有操作 \(x_i\) 的最大值。这样的话 \(\text{sol}(l,r)=\text{sol}(1,m)\) 必须满足 \([l,r]\) 至少包含一个 \(x_i\) 为当前最大值的操作。
动态维护题目中要求的 \(f_i\),发现题目中要我们支持若干个形如 \(\forall i\in [l,r],f_i\leftarrow \max(f_i,r)\) 的操作,满足 \(x_r\) 为当前最大值或者 \(m+1\)。
每个时间点当前最大值的个数之和是 \(O(n^2)\) 的,但我们发现当你操作了一个 set 里的所有值后,后面再去操作这个 set 剔除掉跟之前重复的操作,只需要操作这个 set 新删去的点现在的前驱后继即可。也就是说,本质不同的对 \(f_i\) 的区间取 max 操作在 \(O(n)\) 级别。
注意到对 \(f_i\) 的区间取 max 反正可以离线,干脆用扫描线+可删堆减少常数。
复杂度是 \(O(n\log n)\),空间复杂度 \(O(n)\)。
然后你发现在出题人的精心策划下 \(O(n)\) 个 set 被卡的又 M 又 T。
去掉所有的 vector,换用 \(O(n)\) 个树状树组维护前驱后继才卡过去。
#include <bits/stdc++.h>
using namespace std;
int read(){
char c=getchar();int x=0;
while(c<48||c>57) c=getchar();
do x=(x<<1)+(x<<3)+(c^48),c=getchar();
while(c>=48&&c<=57);
return x;
}
typedef unsigned int ui;
typedef pair<int,int> pii;
const int N=1000003;
int n,m,rk;
int a[N],id[N],len[N],sz[N],lg[N];
pii sins[N],sdel[N],ains[N];
priority_queue<int> que;
int *del[N],base[N],cnt[N];
int *tr[N],trbase[N];
int *od[N],odbase[N];
bitset<N> add;
void upd(int p,int x,int v){
sz[p]+=v;
for(int i=id[x];i<=len[p];i+=(i&-i)) tr[p][i-1]+=v;
}
int qry(int p,int x){
int res=0;
for(int i=id[x];i;i^=(i&-i)) res+=tr[p][i-1];
return res;
}
int loc(int p,int v){
int x=0;
for(int i=(1<<lg[len[p]]);i;i>>=1)
if(x+i<=len[p]&&tr[p][x+i-1]<v) v-=tr[p][(x+=i)-1];
return od[p][x];
}
int main(){
n=read();m=read();
for(int i=1;i<=m;++i){
sins[i]=pii(read(),i);
sdel[i]=pii(read()+1,i);
id[i]=++len[a[i]=read()];
}
del[1]=base;tr[1]=trbase;od[1]=odbase;lg[0]=-1;
for(int i=1;i<m;++i){
del[i+1]=del[i]+len[i];
tr[i+1]=tr[i]+len[i];
od[i+1]=od[i]+len[i];
}
for(int i=1;i<=m;++i) od[a[i]][id[i]-1]=i,lg[i]=lg[i>>1]+1;
int ix=1,dx=1;
sort(sins+1,sins+m+1);
sort(sdel+1,sdel+m+1);
for(int i=1;i<=n;++i){
while(ix<=m&&sins[ix].first<=i){
int x=sins[ix++].second;
if(!sz[a[x]]) que.emplace(a[x]);
upd(a[x],x,1);
}
while(dx<=m&&sdel[dx].first<=i){
int x=sdel[dx++].second;
upd(a[x],x,-1);
del[a[x]][cnt[a[x]]++]=x;
}
while(!que.empty()&&!sz[que.top()]) que.pop();
if(que.empty()) continue;
int mx=que.top();
if(add[mx]){
for(int t=0;t<cnt[mx];++t){
int val=qry(mx,del[mx][t]);
int rig=m+1,lef=0;
if(val<sz[mx]) rig=loc(mx,val+1);
if(val) lef=loc(mx,val);
ains[++rk]=pii(lef+1,rig);
}
}
else{
int las=0;
for(int i=1;i<=sz[mx];++i){
int x=loc(mx,i);
ains[++rk]=pii(las+1,x);
las=x;
}
ains[++rk]=pii(las+1,m+1);add.set(mx);
}
cnt[mx]=0;
}
while(!que.empty()) que.pop();
unsigned int fa=0,fb=0,fc=0;
ix=1;sort(ains+1,ains+rk+1);
for(int i=1;i<=m;++i){
while(ix<=rk&&ains[ix].first<=i) que.emplace(ains[ix++].second);
while(!que.empty()&&que.top()<=i) que.pop();
int tmp=i;
if(!que.empty()) tmp=que.top();
unsigned int res=m+1-tmp;
fa+=res;fb^=res*i;fc+=res*i;
}
printf("%u %u %u\n",fa,fb,fc);
return 0;
}
P8936 月下缭乱 Sol的更多相关文章
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境
如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...
- grub的sol
http://smcijohnny.blogspot.com/2015/06/linuxsolserial-over-lan.html https://www.hiroom2.com/2016/06/ ...
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: 562[Submit][Status] ...
- 【BZOJ1984】月下“毛景树” 树链剖分+线段树
[BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...
- 士兵站队问题sol
作者:http://www.cnblogs.com/taoziwel/articles/1859577.html 相类似题目:输油管道问题 [问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网 ...
- 【BZOJ-1984】月下“毛景树” 树链剖分
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1314 Solved: 416[Submit][Status][Discu ...
- dell ipmi sol
http://blog.arnoudvermeer.nl/post/52375062605/howto-setup-ipmi-sol-on-a-dell-r-series-server http:// ...
- Bzoj 1984: 月下“毛景树” 树链剖分
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1282 Solved: 410[Submit][Status][Discu ...
- BZOJ1984: 月下“毛景树”
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 713 Solved: 245[Submit][Status] Descri ...
随机推荐
- pymysql安装后使用报错处理
1.django启动报错: Error loading MySQLdb module. Did you install mysqlclient? 原因:初次安装配置pymysql时需要在__init_ ...
- Python第九章实验报告
一.实验对象:<零基础学Python>第九章异常处理及程序调试的实例 二.实验环境:IDLE Shell 3.9.7 三.实验目的:了解和掌握常用的异常处理语句 四.实验过程: 实例01 ...
- 1.java基本语法
一.数据和数据类型 (一)标识符:给变量.常量.方法类.对象等命名的符号 (二)变量和常量 1.变量:值在运行时可以改变的量: 每个变量属于特定的数据类型,使用前要先声明,然后赋值,初始化或赋值后才能 ...
- SDK测试标准
测试分类 具体测试项 测试内容 测试方法 文档测试 接口清单 接口清单是否完整,正确,包含提供给开发者的协议所有字段的定义和解释 人工检查 更新说明 要说明新增,删除的接口定义 Demo示例 显示如何 ...
- Python学习笔记--异常+模块+包
异常的捕获 基本语法: 示例: 捕获指定异常 基本语法:--必写 示例: 捕获多个异常 示例: 捕获所有异常 示例: 异常else--可写可不写 示例: 异常finally(无论是否出现异常,都会去执 ...
- 使用MyBatis时需要注意到的事情------执行添加、修改和删除操作时,一定要记得提交事务
今天在重写添加操作代码时,发现自己写的代码没有任何报错,使用断点进行查询,发现一切正常,但是注册使用的数据就是无法添加到数据库里面 然后就去之前看过的视频里面去找错误,就发现这样一个小细节: 在视频里 ...
- rosdep初始化顺利进行
rosdep初始化顺利进行 rosdep初始化需要两条命令 sudo rosdep init rosdep update 但在国内,我们通常会出现因为网络状况访问服务器超时的问题 解决方案就是将资源手 ...
- ChatGPT对于滤除微多普勒运动目标的解决方案
上一篇体验了一把GPT的真香定律,赶紧又问了一些同事问的如何滤除微多普勒目标的问题.感觉还可以,后面可以试试看,具体大家可以一起看看这个回答,还是有一些可以采纳的意见(文章内容为GPT回答的内容,可能 ...
- .NET应用系统的国际化-多语言翻译服务
上篇文章我们介绍了 .NET应用系统的国际化-基于Roslyn抽取词条.更新代码 系统国际化改造整体设计思路如下: 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言.界面.模块统一管理多有 ...
- 改善与提高linux系统的音质
当初装Linux系统的时候,我就发现了,deepin和ubuntu的linux平台音质和Windows平台下的音质不一样.硬件参数没变,歌曲音频文件相同的情况下,linux播放歌曲的时候动态和音乐细节 ...