【BZOJ 3932】[CQOI2015]任务查询系统 主席树

236 篇文章 0 订阅
38 篇文章 0 订阅

好像真的没什么好说的,主席树维护一个差分就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100020
#define LL long long
#define find(a) (lower_bound(cur+1,cur+1+cnt,(a))-cur)
using namespace std;
LL n,m,rt[maxn*10],cur[maxn*10],cnt,tot;
struct node{
	LL ls,rs,k;//一共有k个节点sum, 
	LL sum;
	node():ls(0),rs(0),k(0),sum(0){}
}nod[maxn*80];
struct quest{
	LL x,pos,v;
	quest(LL a=0,LL b=0,LL c=0):x(a),pos(b),v(c){}
	bool operator <(const quest& b)const{return x<b.x;}
}q[maxn*10];
//pos表示插入还是删除  v是插入或者删除的数值 
void insert(LL l,LL r,LL x,LL& y,LL v,LL pos){
	y=++tot;nod[y].k=nod[x].k+pos;
	nod[y].sum=nod[x].sum+(LL)cur[v]*pos;
	if(l==r)return;
	LL mid=l+r>>1;
	nod[y].ls=nod[x].ls,nod[y].rs=nod[x].rs;
	if(v>mid)insert(mid+1,r,nod[x].rs,nod[y].rs,v,pos);
	else insert(l,mid,nod[x].ls,nod[y].ls,v,pos);
}
//查询前k个优先级任务的和 
LL query(LL l,LL r,LL x,LL k){
	if(nod[x].k<=k)return nod[x].sum;
	if(l==r)return (LL)k*cur[l];
	LL mid=l+r>>1,ll=nod[x].ls,rr=nod[x].rs;
	if(nod[ll].k>=k)return query(l,mid,ll,k);
	else return query(mid+1,r,rr,k-nod[ll].k)+nod[ll].sum;
}
LL last[maxn*80];
int main(){
    scanf("%lld%lld",&n,&m);LL pp=0;
    for(LL a,b,c,i=1;i<=n;i++){
    	scanf("%lld%lld%lld",&a,&b,&c);
    	cur[++cnt]=c;
    	q[++pp]=quest(a,1,c);
    	if(b<n)q[++pp]=quest(b+1,-1,c);
    }sort(cur+1,cur+1+cnt);
    cnt=unique(cur+1,cur+1+cnt)-cur-1;
    sort(q+1,q+1+pp);
    LL now=0;
    for(LL i=1;i<=pp;i++){
    	insert(1,cnt,rt[i-1],rt[i],find(q[i].v),q[i].pos);
    	last[q[i].x]=rt[i];
    }LL pre=1;
    LL a,b,c,k;
    for(int i=1;i<=100000;i++){
    	if(last[i])now=last[i];
    	last[i]=now;
    }
    for(LL x,i=1;i<=m;i++){
    	scanf("%lld%lld%lld%lld",&x,&a,&b,&c);
    	k=1+(a*pre+b)%c;
    	pre=query(1,cnt,last[x],k);
    	printf("%lld\n",pre);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值