主席树||可持久化线段树||离散化||[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小的编号 然后考虑对字符串排序 那 ...
随机推荐
- 阿里云服务器Centos7.4开放80端口的记录
问题: 阿里云服务器安装的是centos7, 搭建网站安装lnmp1.5后发现访问不了, 不明所以, 在一论坛找到关于80端口未开放的原因. 需求: 开放80端口.于是有了下面第一,二,三部分关于开放 ...
- SQL语句调优三板斧
改装有顺序------常开的爱车下手 你的系统中有成千上万的语句,那么优化语句从何入手呢 ? 当然是系统中运行最频繁,最核心的语句了.废话不多说,上例子: 这是一天的语句执行情况,里面柱状图表示的是对 ...
- Android 使用WebView加载含有Canvas的页面截屏处理
无法截屏主要原因是webview渲染方式所导致:只需要AndroidManifest.xml中设置属性Android:hardwareAccelerated=”false”.
- Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题
根据已上线的app里总结出来的实用小技巧 相信大家都遇到过ScrollView嵌套RecyclerView或者RecyclerView嵌套RecyclerView来使用, 也会遇到一堆奇奇怪怪的问题, ...
- 蓝牙发现服务UUID(service UUID)
出至<蓝牙标准Core_V4.0>2.5.1 uuid(1576页) 其中 Bluetooth_Base_UUID定义为 00000000-0000-1000-8000-00805F9B3 ...
- springboot 中打印 sql 语句
在配置文件中 application.yml 配置如下其一即可 方式一: logging: level: com.xxx.com.dao.mapper: DEBUG //包路径为mapper文件包路径 ...
- makefile中的wildcard和notdir和patsubst
转自:https://blog.csdn.net/srw11/article/details/7516712 1.wildcard : 扩展通配符 2.notdir : 去除路径 3.patsubst ...
- --save与--save-dev的区别
--save安装的包会在生产和开发环境中都使用: --save-dev的包只在开发环境中使用,在生产环境中就不需要这个包了,不再打包:
- [C++]Qt文本操作(按行读写)
资料来源:https://blog.csdn.net/flyfish1986/article/details/79487104 #include <QDebug> #include < ...
- ambari安装 QA
1.在安装时 出现Public key for ambari-server-2.4.2.0-136.x86_64.rpm is not installed 安装ambari报错 在安装HST服务时也报 ...