传送门

真不知道我没学主席树之前是有什么勇气说自己高级数据结构以及学的七七八八了。

这道题应该也是算是主席树的经典运用。

刚开始脑抽了,想把(S,E,P)的处理直接在线用树状数组xjb搞搞算了。写完后才意识到树状数组无法(很难?)实现区间修改。

然后想了想既然这个是一下子把所有修改都放上了直接用树状数组差分一下不就好了!

然后又深感自己制杖,为什么要用树状数组差分呢,直接开几个vector维护一下就行了。

说是修改,本质上是不带修改的主席树,很快搞完。WA,眼查,无果,跟踪,无果。

拍了几组小数组测了测,最后发现问题是这样的:以往的线段树在更新对应的权值线段树时只需要更新一个pos,而这个要更新很多个pos,就会导致一些层直接修改到以前的版本。

最后的解决办法就是对于每个点,开两个交叉更新即可。

语文不好QAQ,直接看代码比较清晰。

//BZOJ 3932
//by Cydiater
//2016.12.8
#include <iostream>
#include <cmath>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <ctime>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
#define ll long long
#define up(i,j,n)		for(int i=j;i<=n;i++)
#define down(i,j,n)		for(int i=j;i>=n;i--)
#define cmax(a,b)		a=max(a,b)
#define cmin(a,b)		a=min(a,b)
#define pii 			pair<int,int>
#define FILE "cqoi15_query"
const int MAXN=1e5+5;
const int oo=0x3f3f3f3f;
inline int read(){
	char ch=getchar();int x=0,f=1;
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int N,M,fsort[MAXN],rnum=0,cnt=0,root[MAXN<<5];
ll Pre=1;
struct Query{
	int S,T,P;
}query[MAXN];
struct Chair_man_Tree{
	int tol,son[2];
	ll sum;
}t[MAXN<<6];
vector<pii> op[MAXN];
namespace solution{
	int NewNode(int tol,ll sum,int son0,int son1){
		t[++cnt].tol=tol;t[cnt].sum=sum;
		t[cnt].son[0]=son0;t[cnt].son[1]=son1;
		return cnt;
	}
	void insert(int leftt,int rightt,int &Root,int last,int pos,int flag){
		Root=NewNode(t[last].tol+flag,t[last].sum+fsort[pos]*flag,t[last].son[0],t[last].son[1]);
		if(leftt==rightt)		return;
		int mid=(leftt+rightt)>>1;
		if(pos<=mid)		insert(leftt,mid,t[Root].son[0],t[last].son[0],pos,flag);
		else 			insert(mid+1,rightt,t[Root].son[1],t[last].son[1],pos,flag);
	}
	void Build(){
		N=read();M=read();
		up(i,1,N){
			int S=read(),T=read(),P=read();
			fsort[++rnum]=P;
			query[i]=(Query){S,T,P};
		}
		sort(fsort+1,fsort+rnum+1);
		rnum=unique(fsort+1,fsort+rnum+1)-(fsort+1);
		up(i,1,N){
			int S=query[i].S,T=query[i].T,P=query[i].P,pos=lower_bound(fsort+1,fsort+rnum+1,P)-fsort;
			op[S].push_back(make_pair(pos,1));op[T+1].push_back(make_pair(pos,-1));
		}
		up(i,1,M){
			int last=root[i-1],now;
			up(j,0,(int)op[i].size()-1){
				pii tmp=op[i][j];
				int pos=tmp.first,flag=tmp.second;
				insert(1,rnum,now,last,pos,flag);
				last=now;
			}
			root[i]=last;
		}
	}
	ll Get(int leftt,int rightt,int Root,ll rnk){
		ll sum=t[Root].sum,tol=t[Root].tol;
		if(leftt==rightt)	return min(tol,rnk)*fsort[leftt];
		sum=t[t[Root].son[0]].sum;tol=t[t[Root].son[0]].tol;
		int mid=(leftt+rightt)>>1;
		if(rnk>=tol)	return sum+Get(mid+1,rightt,t[Root].son[1],rnk-tol);
		else 		return Get(leftt,mid,t[Root].son[0],rnk);
	}
	void Slove(){
		while(M--){
			ll X,A,B,C,K;
			X=read();A=read();B=read();C=read();
			K=1+(A*Pre+B)%C;
			printf("%lld\n",(Pre=Get(1,rnum,root[X],K)));
		}
	}
}
int main(){
	//freopen("input.in","r",stdin);
	//freopen("out1.out","w",stdout);
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
	using namespace solution;
	Build();
	Slove();
	return 0;
}

BZOJ3932: [CQOI2015]任务查询系统的更多相关文章

  1. BZOJ3932 CQOI2015 任务查询系统 【主席树】

    BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...

  2. BZOJ3932: [CQOI2015]任务查询系统 主席树

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4869  Solved: 1652[Submit][St ...

  3. [bzoj3932][CQOI2015]任务查询系统_主席树

    任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...

  4. [bzoj3932][CQOI2015][任务查询系统] (主席树)

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...

  5. BZOJ3932[CQOI2015]任务查询系统——主席树

    题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第E ...

  6. 并不对劲的bzoj3932: [CQOI2015]任务查询系统

    传送门-> 离线操作听上去很简单,遗憾的是它强制在线. 每个时刻可以看成可持久化线段树中的一个版本,而每一个版本的线段树维护的是值某一段区间且在这个版本对应的时刻出现的数之和. 会发现同一时刻可 ...

  7. [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)

    传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...

  8. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)

    题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...

  9. BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化

    记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...

随机推荐

  1. MarkdownPad 2 常用快捷键

    Ctrl + I : 斜体 Ctrl + B : 粗体 Ctrl + G : 图片 Ctrl + Q : 引用 Ctrl + 1 : 标题 1 Ctrl + 2 : 标题 2 Ctrl + 3 : 标 ...

  2. 记一次git amend事故处理方案

    一.问题回顾 问题是git commit --amend 引起的. 一条commit已经push到远端develop了,但是后来又在这条commit上进行了amend操作,导致这条commit的哈希码 ...

  3. 阶段一:用Handler和Message实现计时效果及其中一些疑问

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...

  4. iOS 如何使用Safari浏览器打开app

    1.首先在info.plist添加一个键值对,如下图 或 2.在appdelegate.m文件如下方法写代码 -(BOOL)application:(UIApplication*)app openUR ...

  5. Linux-学习前言

    本随笔会持续,不定期更新.我有上网找与Linux相关的博客,发现很多人只写了几篇就没更新了,没有坚持下来!希望我能keep  on. 最近一个月是考试月,可能更新会比较少.

  6. Mac电脑如何读取Android手机上的文件

    问题 一般Android手机用usb数据线连接到windows操作系统的电脑上后,会自动将手机存储卡以移动存储的方式显示在电脑里. 但是如果操作系统是Mac的,就没有这个存储设备.问题来了,Mac电脑 ...

  7. 【转】你所不知道的HTML <head/> 头标签

    HTML的头部内容特别多,有针对SEO的头部信息,也有针对移动设备的头部信息.而且各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,有很多差异性.移动端的工作已经越来越成为前端工作的重要内容, ...

  8. Oracle forall bulk collect批量数据更新

    对于数据量较大的插入操作可采用此种方法操作,注意: limit减少内存占用,如果数据量较大一次性全部加载到内存中,对PGA来说压力太大,可采用limit的方法一次加载一定数量的数据,建议值通常为100 ...

  9. RabbitMQ 高可用集群搭建及电商平台使用经验总结

    面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...

  10. php类中的魔术方法

    1.构造函数 析构函数class pt{ function __construct($data) { echo "pt is start ..."; $this->pr($d ...