传送门

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

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

刚开始脑抽了,想把(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. Ubantu【第一篇】:Ubantu中openssh连接

    h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...

  2. 配置eclipse J2EE环境

    早已习惯使用eclipse做Java相关的开发,因为之前安装的是RCP版本,今天发现对于J2EE的开发,在perference中居然没有Axis2的支持,需要添加J2EE的支持插件,特在此说明安装方式 ...

  3. [转] IIS配置文件的XML格式不正确 applicationHost.config崩溃 恢复解决办法

    IIS配置文件的XML格式不正确 applicationHost.config崩溃 恢复解决办法 源文件:http://www.cnblogs.com/yuejin/p/3385584.html   ...

  4. Unicode简介

    计算机只能处理二进制,因此需要把文字表示为二进制才能被计算机理解和识别. 一般的做法是为每一个字母或汉字分配一个id,然后用二进制表示这个id,存在内存或磁盘中.计算机可以根据二进制数据知道这个id是 ...

  5. iOS快速集成友盟社会化分享功能(v6.1.1)

    1.  U-Share SDK集成 1.1 下载U-Share SDK 通过iOS社会化组件选择所需的社交平台后进行下载,下载链接http://dev.umeng.com/social/ios/sdk ...

  6. Activity的释放

    1.ActivityTwo.finish(); 在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法.当你调用此方法的时候,系统只是将最上面的Activity移出了栈, ...

  7. 了解JavaScript 对象的属性操作

    提起操作, 很多人都会想到我们学习过程中最经常做的操作, 就是对数据库进行增, 删, 改, 查, 既然提到这个, 那么对于对象的属性操作也不例外, 基本上可以说也是这几个操作. JS中对象的属性标签 ...

  8. mysql半同步复制问题排查

    1.问题背景      默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制则 ...

  9. Sql Server 2016新功能之 Row-Level Security

    Sql Server 2016 有一个新功能叫 Row-Level Security ,大概意思是行版本的安全策略(原来我是个英语渣_(:з」∠)_) 直接上例子.这个功能相当通过对表添加一个函数作为 ...

  10. APUE学习之多线程编程(三):线程属性、同步属性

    一.线程属性      可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调 ...