P3863 序列(分块)

news/2024/9/18 8:53:27/文章来源:https://www.cnblogs.com/dcytrl/p/18408976

感觉是一个比较厉害的 trick,并且从来没见过,记录一下。

题意

给定 \(n\) 个数和 \(q\) 次操作:

  • 1 l r x:区间 \([l,r]\)\(x\)
  • 2 x v:查询在询问之前有多少时刻 \(a_x\ge v\)。一次操作定义为一个时刻,初始为 \(0\) 时刻。

\(n,q\le 10^5\)

分析

如果 \(x\ge 0\),那么 \(a_i\) 的值不降,直接二分+主席树维护即可。只是提一嘴我的原始思路,跟这题正解没关系。

但是 \(x<0\),上面的做法就假透了。考虑一个新做法。

假设对 \(a_i\) 的询问,我们找出了它在所有时间轴上的值 \(b_i\),原题的询问等价于询问时间轴在 \([0,t)\)\(b_i\ge v\)\(i\) 个数。这是分块的经典例题。如果我们只维护一个 \(a_i\),那么我们直接将值域分块,然后整块二分散块暴力即可。

但是我们要维护 \(n\) 个数的区间加。

区间加这个东西会给区间内的所有数加同一个偏移量废话,我们或许可以考虑从 \(i-1\) 继承过来 \(i\) 的所有版本的值。这样的话,我们只需要将 \([l,r]\) 拆成 \(l,r+1\) 两个单点,在 \(l\) 处增加贡献,在 \(r+1\) 处去除贡献。对于一个单点加,就相当于对 \([t,q]\) 的时间段里 \(a_i\) 的历史值做区间加。查询直接套用上文的解法。

时间复杂度 \(O(n\sqrt n\log n)\)

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#include<cassert>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define un using namespace
#define all(x) x.begin(),x.end()
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) (x&-x)
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mem(x,y) memset(x,y,sizeof x)
//#define double long double
#define int long long
//#define int __int128
using namespace std;
typedef long long i64;
typedef unsigned long long u64;
using pii=pair<int,int>;
bool greating(int x,int y){return x>y;}
bool greatingll(long long x,long long y){return x>y;}
inline int rd(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}return x*f;
}
inline void write(int x,char ch='\0'){if(x<0){x=-x;putchar('-');}int y=0;char z[40];while(x||!y){z[y++]=x%10+48;x/=10;}while(y--)putchar(z[y]);if(ch!='\0')putchar(ch);
}
bool Mbg;
const int maxn=1e5+5,maxm=4e5+5,inf=0x3f3f3f3f,B=320;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,Q,a[maxn];
vector<pii>mdf[maxn];
using piii=pair<pair<int,int>,int>;
vector<piii>ask[maxn];
int ans[maxn];
//b sorted c unsorted
int b[maxn],c[maxn],tag[maxn];
int L[maxn],R[maxn],bel[maxn],num;
void remake(int x){rep(i,L[x],R[x])c[i]+=tag[x],b[i]=c[i];tag[x]=0;sort(b+L[x],b+R[x]+1);
}
void upd(int l,int r,int x){if(bel[l]==bel[r]){rep(i,l,r)c[i]+=x;remake(bel[l]);return;}rep(i,l,R[bel[l]])c[i]+=x;remake(bel[l]);rep(i,bel[l]+1,bel[r]-1)tag[i]+=x;rep(i,L[bel[r]],r)c[i]+=x;remake(bel[r]);
}
int qry(int l,int r,int val){int res=0;if(bel[l]==bel[r]){rep(i,l,r)if(c[i]+tag[bel[l]]>=val)++res;return res;}rep(i,l,R[bel[l]])if(c[i]+tag[bel[l]]>=val)++res;rep(i,bel[l]+1,bel[r]-1){int ps=lower_bound(b+L[i],b+R[i]+1,val-tag[i])-b;res+=R[i]-ps+1;}rep(i,L[bel[r]],r)if(c[i]+tag[bel[r]]>=val)++res;return res;
}
inline void solve_the_problem(){n=rd(),Q=rd(),num=Q/B+1;rep(i,1,num){L[i]=(i-1)*B,R[i]=min(i*B-1,Q);rep(j,L[i],R[i])bel[j]=i;}rep(i,1,n)a[i]=rd();int qrycnt=0;rep(i,1,Q){int op=rd(),l=rd(),r=rd(),x;if(op==1){x=rd();mdf[l].emplace_back(mp(x,i)),mdf[r+1].emplace_back(mp(-x,i));}else{ask[l].emplace_back(mp(mp(r,i-1),++qrycnt));}}rep(i,1,n){for(pii j:mdf[i]){int val=j.fi,t=j.se;upd(t,Q-1,val);}for(piii j:ask[i]){int val=j.fi.fi,t=j.fi.se,id=j.se;ans[id]=qry(0,t,val-a[i]);}}rep(i,1,qrycnt)write(ans[i],10);
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
//	fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);int _=1;while(_--)solve_the_problem();
}
/**/

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

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

相关文章

图与网路——最大流问题精解

容量网络(Capacity Network)是一种特殊的有向图结构,其中每条边都有一个容量(Capacity),表示该边上可以通过的最大流量。在这种网络中,流量(Flow)是指从源点(Source)通过边到达汇点(Sink)的实际传输量。容量网络中的边具有方向性,且每条边的流量不能超过其容量。…

C++中的数组,字符串数组,pair数组

1.C++中的字符串数组: 2. C++中的常量数组 这个const pair<int, string> valueSymbols[]定义了一个常量数组,数组中的每个元素都是一个pair<int, string>类型的对象。pair是C++标准模板库(STL)中的一个模板类,用于将两个值组合成一个单一的对象。在这个特定的…

TensorFlow深度学习框架改进K-means、SOM自组织映射聚类算法及上海招生政策影响分析研究|附代码数据

全文链接:https://tecdat.cn/?p=37652 原文出处:拓端数据部落公众号 分析师:Chen Zhang在教育政策研究领域,准确评估政策对不同区域和学生群体的影响至关重要。2021 年上海市出台的《上海市初中学业水平考试实施办法》对招生政策进行了调整,其中名额分配综合评价模块的…

【python脚本】springboot检测脚本

原创 CatalyzeSecimport requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) session = requests.session()# 从文本文件中读取 with open(dic.txt, r) as file:paths = file.readlines()# 移除每个末尾的换行符 paths = [path.str…

STM32学习笔记——中断

中断:在主程序运行过程中,出现了特定事件(例如发生已经预知的一些情况),从而转入中断程序中,处理完成后再回到主程序中继续执行。(频繁的中断函数会影响主程序的运行,所以中断函数一边不处理特别复杂的逻辑) EXTI(Extern Interrupt)外部中断 支持的触发方式:上升沿…

面试-JS Web API-DOM

概览DOM(Document Object Model)DOM是哪种数据结构? ---树🌳 常用的API attr和property区别 一次性插入多个DOM节点?DOM节点操作DOM节点的property 通过获取JS属性来改变样式or页面渲染形式。DOM节点的attribute 修改节点的属性。建议尽量用property操作。

送给测试行业朋友们的一些中肯建议

在快速发展的科技时代,软件测试行业也在不断变化。如果你是一名测试人员,或正在考虑进入这个行业,你是否感到迷茫?该如何提升自己,以应对未来的挑战?今天,我为所有测试行业的朋友们带来一些切实的建议,助你们走得更远。 作为测试人员,你是否经常面对需求变化、测试工具…

【Azure Cloud Service】在Azure云服务中收集CPU监控指标和IIS进程的DUMP方法

问题描述 在使用Cloud Service服务时,发现服务的CPU占用很高,在业务请求并不大的情况下,需要直到到底是什么进程占用了大量的CPU资源,已经如何获取IIS进程(w3wp.exe)的DUMP文件?问题解答 一:收集云服务中CPU的性能数据 远程登录(RDP)到云服务的实例上,使用管理员身份运行…

Blazor开发框架Known-V2.0.10

Known今天迎来了2.0的第11个版本,同时网站网址和板块也进行了一次升级改造,虽不完美,但一直在努力改变,之前一直在完善框架功能,忽略了文档的重要性,所以这次更新了文档和API。交流互动板块也在进行当中,尽请期待。官方网站:http://known.org.cn 最新版本:V2.0.10下面…

个人项目:论文查重

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业的目标 独立完成一个论文查重的个人项目;在项目开发中学习PSP表格的使用;学习使用Github仓库进行代码管…