洛谷P3863 序列(离线+分块)

博客介绍了如何解决洛谷P3863问题,通过离线处理和分块算法来优化问题的求解。离线方法将修改和查询按位置排序,用两个操作表示修改,并逐一处理询问。分块策略用于处理跨越多个块的查询,通过对每个块排序并使用二分查找来高效地确定符合条件的元素数量。
摘要由CSDN通过智能技术生成

传送门
最直观的想法是维护N个元素每个时间的状态.这个做法显然不切实际,但似乎在线去做又没有什么很好的办法,所以只能考虑离线.
离线做法:因为只有单点查询,所以我们可以按照每个修改和询问的位置排序.然后只维护每个时间点的状态.修改可以拆分成两个操作,在l位置上修改time-m的值,在r+1位置撤销这次修改.然后离线的一个一个处理询问就可以了.而询问可以转化成1-time-1有多少个数>=y-a[pos].这个可以用分块来处理.对每个块排序然后跨块的时候二分就可以了.

#define LL long long
#define pq priority_queue
#define ULL unsigned long long
#define pb push_back
#define mem(a,x) memset(a,x,sizeof a)
#define pii pair<int,int>
#define fir(i,a,b) for(int i=a;i<=(int)b;++i)
#define afir(i,a,b) for(int i=(int)a;i>=b;--i)
#define ft first
#define vi vector<int>
#define sd second
#define ALL(a) a.begin(),a.end()
#define bug puts("-------")
#define mpr(a,b) make_pair(a,b)
#include <bits/stdc++.h>

using namespace std;
const int N = 2e5+10;

inline void read(int &a){
   
    int x = 0,f=1;char ch = getchar();
    while(ch<'0'||ch>'9'){
   if(ch=='-')f=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){
   x=x*10+ch-'0';ch=getchar();}
    a = x*f;
}
struct C{
   
    int p,x,tim;
}c[N];
struct Q{
   
    int p,x,tim,id;
}q[N];
int n,m,blo,num,L[N],R[N],pos[N],a[N],ans[N],siz[N];
LL t[N],v[N],tag[N];
void build(){
   
    int n = m+1;
    blo = sqrt(n);
    num = n/blo;
    fir
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值