zoukankan      html  css  js  c++  java
  • #主席树,离散,扫描线#洛谷 3168 [CQOI2015]任务查询系统

    题目


    分析

    询问显然得预处理,考虑以优先级建权值线段树,
    将优先级离散化处理,那么第(k)大可以用线段树来求
    那任务怎么办,考虑时间用扫描线的方法,按照时间建新的线段树
    把任务分成两部分,在两端差分,实际上每次修改只会修改一小部分,
    所以用主席树做,空间复杂度就能得到保证


    代码

    #include <cstdio>
    #include <cctype>
    #include <algorithm>
    #define rr register
    using namespace std;
    typedef long long lll; 
    const int N=100011;
    int n,m,T,b[N],rt[N];
    struct rec{int x,p;}a[N<<1];
    struct Chair{
        lll ww[N<<6],wc[N<<6];
    	int ls[N<<6],rs[N<<6],cnt;
        inline void build(int &rt,int l,int r){
        	rt=++cnt,ww[rt]=wc[rt]=0;
        	if (l==r) return;
        	rr int mid=(l+r)>>1;
        	build(ls[rt],l,mid);
        	build(rs[rt],mid+1,r);
    	}
    	inline void update(int &rt,int l,int r,int x,int z){
    		rr int trt=++cnt;
    		ls[trt]=ls[rt],rs[trt]=rs[rt],
    		ww[trt]=ww[rt],wc[trt]=wc[rt],rt=trt;
    		if (l==r){
    			wc[rt]+=z,ww[rt]+=z*b[l];
    			return;
    		}
    		rr int mid=(l+r)>>1;
    		if (x<=mid) update(ls[rt],l,mid,x,z);
    		    else update(rs[rt],mid+1,r,x,z);
    		wc[rt]=wc[ls[rt]]+wc[rs[rt]],
    		ww[rt]=ww[ls[rt]]+ww[rs[rt]];
    	}
    	inline lll query(int rt,int l,int r,int kth){
    		if (l==r) return kth*b[l];
    		rr int mid=(l+r)>>1;
    		return kth<=wc[ls[rt]]?query(ls[rt],l,mid,kth):
    		    query(rs[rt],mid+1,r,kth-wc[ls[rt]])+ww[ls[rt]];
    	}
    }Tre;
    inline signed iut(){
    	rr int ans=0; rr char c=getchar();
    	while (!isdigit(c)) c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans;
    }
    inline void print(lll ans){
    	if (ans>9) print(ans/10);
    	putchar(ans%10+48);
    }
    bool cmp(rec a,rec b){return a.x<b.x;}
    signed main(){
    	m=iut()<<1,T=iut(),Tre.cnt=0;
    	for (rr int i=1;i<=m;i+=2){
    		a[i].x=iut(),a[i+1].x=iut()+1,
    		a[i].p=iut(),a[i+1].p=-a[i].p,
    		b[++n]=a[i].p;
    	}
    	sort(b+1,b+1+n),sort(a+1,a+1+m,cmp),
    	n=unique(b+1,b+1+n)-b-1,Tre.build(rt[0],1,n);
    	for (rr int i=1,j=0;i<=m;++i){
    		rr int op=1; if (a[i].p<0) op=-1,a[i].p*=op;
    		for (;j<a[i].x;++j) rt[j+1]=rt[j]; if (j==T+1) break;
    		rr int t=lower_bound(b+1,b+1+n,a[i].p)-b;
    		Tre.update(rt[j],1,n,t,op);
    	}
    	for (rr lll lans=1;T;--T){
    		rr int X=iut(),A=iut(),B=iut(),C=iut();
    		rr int kth=1+(1ll*A*lans+B)%C;
    		if (Tre.wc[rt[X]]<=kth) lans=Tre.ww[rt[X]];
    		    else lans=Tre.query(rt[X],1,n,kth);
    		print(lans),putchar(10);
    	}
    	return 0;
    }
    
  • 相关阅读:
    峰Spring4学习(1)HelloWorld
    小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
    前端实现某一列不能重复不能且不能为空
    jquery:给正则表达式添加变量
    css:width height
    让heigh:100%起作用
    jquery:选择器 过滤器
    vs:如何添加.dll文件
    jq:正则表达式
    css:html() text() val()
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13531500.html
Copyright © 2011-2022 走看看