zoukankan      html  css  js  c++  java
  • 【bzoj3932】 CQOI2015—任务查询系统

    http://www.lydsy.com/JudgeOnline/problem.php?id=3932 (题目链接)

    题意

      给出$m$个区间,每个区间有一个权值,$n$组询问,每次询问在位置$x$权值前$k$大的区间的权值和。

    Solution

      扫描线搞一下然后主席树维护即可。

    细节

      查询的时候注意叶子节的情况

    代码

    // bzoj3932
    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define LL long long
    #define lim 10000000
    #define inf 2147483640
    #define Pi acos(-1.0)
    #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
    using namespace std;
    
    const int maxn=200010;
    int n,m,sz,rt[maxn];
    struct data {
    	int pos,w,op;
    	friend bool operator < (data a,data b) {return a.pos<b.pos;}
    }t[maxn];
    struct node {
    	int son[2],s;LL val;
    	int& operator [] (int x) {return son[x];}
    }tr[maxn*50];
    
    namespace Chairtree {
    	void insert(int &u,int v,int l,int r,int val,int op) {
    		if (!u) u=++sz;
    		if (l==r) {tr[u].s=tr[v].s+op;tr[u].val=tr[u].s*l;return;}
    		int mid=(l+r)>>1;
    		if (val<=mid) insert(tr[u][0],tr[v][0],l,mid,val,op),tr[u][1]=tr[v][1];
    		else insert(tr[u][1],tr[v][1],mid+1,r,val,op),tr[u][0]=tr[v][0];
    		tr[u].s=tr[tr[u][0]].s+tr[tr[u][1]].s;
    		tr[u].val=tr[tr[u][0]].val+tr[tr[u][1]].val;
    	}
    	LL query(int k,int l,int r,int x) {
    		if (!k) return 0;
    		if (l==r) return (LL)l*x;
    		int mid=(l+r)>>1,c=tr[tr[k][0]].s;
    		if (x==c) return tr[tr[k][0]].val;
    		else if (x<c) return query(tr[k][0],l,mid,x);
    		else return query(tr[k][1],mid+1,r,x-c)+tr[tr[k][0]].val;
    	}
    }
    using namespace Chairtree;
    
    int main() {
    	scanf("%d%d",&m,&n);
    	for (int u,v,w,i=1;i<=m;i++) {
    		scanf("%d%d%d",&u,&v,&w);
    		t[(i<<1)-1]=(data){u,w,1};
    		t[i<<1]=(data){v+1,w,-1};
    	}
    	sort(t+1,t+1+m*2);
    	for (int i=1,p=1;i<=m<<1;i++,p++) {
    		for (;p<t[i].pos;p++) rt[p]=rt[p-1];
    		insert(rt[p],rt[p-1],1,lim,t[i].w,t[i].op);
    		while (t[i+1].pos==t[i].pos) {
    			int tmp=0;i++;
    			insert(tmp,rt[p],1,lim,t[i].w,t[i].op);
    			rt[p]=tmp;
    		}
    	}
    	LL ans=1;
    	for (int x,k,i=1;i<=n;i++) {
    		LL a,b,c;
    		scanf("%d%lld%lld%lld",&x,&a,&b,&c);
    		k=1+(a*ans+b)%c;
    		ans=query(rt[x],1,lim,k);
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    JSP 中文乱码显示处理解决方案
    jsp的9大对象
    获取各种路径
    输出自绘制图片
    Emmet基本使用方法
    <input type="file" />浏览时只显示指定文件类型
    使用dockerfile文件创建image
    gunicorn 访问日志配置与项目启动
    制作符合自己需求的镜像 docker image
    linux 查看系统信息
  • 原文地址:https://www.cnblogs.com/MashiroSky/p/6489607.html
Copyright © 2011-2022 走看看