主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168
题目: [CQOI2015]任务查询系统
题解:
是一道很经典的题目。大体思路是抓优先级来当下标做主席树,用时刻作为主席树的版本。然而优先级范围到1e7去了,就离散化一遍。然后把每个事件的开始(s)、结束(e)(e记得+1,因为一个事件是第e+1时刻结束的)时间点抓出来排序一遍,按时刻从早到晚维护主席树。差不多就是这样。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=+,maxm=maxn,maxnum_p=maxm,maxnum_b=maxm<<;
int N,M,cnt_p=,num_b=,num_treenode,root[maxnum_b],X,A,B,C,belong_root[maxn];
ll Pre=,belong[maxm],K;
struct _A{int p,s,e,hp;}a[maxm];
bool cmp1(const _A&c,const _A&d){return(c.p<d.p);}
struct _B{int p,o,data;}b[maxm<<];//b数组负责记录把每个时间点都拆出来后的数据 ,data记录时间点,o是时间点的类型
bool cmp2(const _B&c,const _B&d){return(c.data<d.data);}
struct Tree{int l,r,ls,rs,cnt;ll sum;}t[(maxnum_p<<)+maxnum_b*];
void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;int mid=(l+r)>>;
if(l==r)return;
Build(t[x].ls=++num_treenode,l,mid);Build(t[x].rs=++num_treenode,mid+,r);
return;
}
void Update(int u,int x,int p,int o){
int l=t[u].l,r=t[u].r,mid=(l+r)>>;
t[x].l=l;t[x].r=r;
if(l==r&&l==p){
if(o==){t[x].cnt=t[u].cnt+; t[x].sum=t[u].sum+belong[p];}
else{t[x].cnt=t[u].cnt-; t[x].sum=t[u].sum-belong[p];}
return;
}
if(p<=mid){t[x].rs=t[u].rs; Update(t[u].ls,t[x].ls=++num_treenode,p,o);}
else{t[x].ls=t[u].ls; Update(t[u].rs,t[x].rs=++num_treenode,p,o);}
t[x].cnt=t[t[x].ls].cnt+t[t[x].rs].cnt;
t[x].sum=t[t[x].ls].sum+t[t[x].rs].sum;
return;
}
ll Query(int x,ll k){
if(k==)return ;
if(k>=t[x].cnt)return t[x].sum;
int l=t[x].l,r=t[x].r,ls=t[x].ls,rs=t[x].rs;
if(l==r)return (k*belong[l]);
if(t[ls].cnt>=k)return Query(ls,k);
else return (t[ls].sum+Query(rs,k-t[ls].cnt));
}
int main(){
scanf("%d%d",&M,&N);
for(int i=;i<=M;i++)scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].p),a[i].e++;
sort(a+,a+M+,cmp1);
for(int i=;i<=M;i++)
if(a[i].p!=a[i-].p)belong[a[i].hp=++cnt_p]=a[i].p;else a[i].hp=cnt_p;
for(int i=;i<=M;i++){
b[++num_b].data=a[i].s;b[num_b].o=;b[num_b].p=a[i].hp;
b[++num_b].data=a[i].e;b[num_b].o=;b[num_b].p=a[i].hp;
}
Build(root[]=++num_treenode,,cnt_p);
sort(b+,b+num_b+,cmp2);
for(int i=;i<=num_b;i++){
int v=b[i].data,o=b[i].o,p=b[i].p;
Update(root[i-],root[i]=++num_treenode,p,o);
if(v!=b[i+].data)belong_root[v]=i;
}
for(int i=;i<=N;i++)if(belong_root[i]==)belong_root[i]=belong_root[i-];
while(N--){
scanf("%d%d%d%d",&X,&A,&B,&C);
K=+(Pre*A+B)%C;
Pre=Query(root[belong_root[X]],K);
printf("%lld\n",Pre);
}
return ;
}
By:AlenaNuna
主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168的更多相关文章
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- [BZOJ 4771]七彩树(可持久化线段树+树上差分)
[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...
- 权值线段树&&可持久化线段树&&主席树
权值线段树 顾名思义,就是以权值为下标建立的线段树. 现在让我们来考虑考虑上面那句话的产生的三个小问题: 1. 如果说权值作为下标了,那这颗线段树里存什么呢? ----- 这颗线段树中, 记录每个值出 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA
给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义dept ...
- BZOJ.4771.七彩树(可持久化线段树)
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
随机推荐
- .NET 同步与异步 之 警惕闭包(十)
本随笔续接:.NET 同步与异步 之 原子操作和自旋锁(Interlocked.SpinLock)(九) 至此.同步与异步 相关的常规操作(比较常见的操作).差不多已经介绍完毕. 本随笔就着重说一下闭 ...
- 启用phpstorm代码提示功能
参考:http://www.dawnfly.cn/article-1-331.html mac下实际上将省电禁用即可
- 团队工作效率分析工具gitstats
如果你是团队领导,关心团队的开发效率和工作激情:如果你是开源软件开发者,维护者某个repo:又或者,你关心某个开源软件的开发进度,那么你可以试一试gitstats. gitstats 是一个git仓库 ...
- Android UI系列-----长度单位和内外边距
这篇随笔将会记录一下在控件布局时,设定距离的三种长度单位:px.dp.sp以及内外边距的属性 1.三种长度单位 ①px:px是我们常见的一种距离单位,它表示的是一个单位像素,我们经常说我们手机或者电脑 ...
- ThreadPoolExecutor 线程池浅析
作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它. 下面我们就通过源码来一步一步弄清楚它. 内部状态 线程有五种状态:新 ...
- sublime text 3 安装ES6插件
- 编译错误 ld: cannot find -lz
[时间:2017-04] [状态:Open] [关键词:makefile,gcc,linux,ld,libz.so] 在新安装的centos上编译程序遇到上述问题,找了半天,原来是没有安装 需要安装z ...
- pycharm如何在debug的时候动态执行python语句
在调试MATLAB的时候,这一点很容易实现,比如动态修改变量的值,在VS2017中调试python程序,这一点也很容易实现,但是我在pycharm里面找了半天,如下图:
- <我的股票交易知识汇总与个人感悟_v1.0 (By geman)>
书在这里 一个完整的股票交易包括选股.买股.持股.卖股四个阶段. 右侧交易,顶是跌出来的,底是涨出来的 一定要敢于止损,设好止损位,严格执行,即使踏空也无怨无悔:资金安全第一位 坚持只买处于上升通道的 ...
- EntLib 自动数据库连接字符串加密
const string provider = "RsaProtectedConfigurationProvider"; Configuration config = null; ...