题目:

洛谷也能评测


题解:

De了好长时间BUG发现是自己sort前面有一行for没删,气死.

题目询问第x秒时候前k小的P值之和.

朴素想法:

我们可以把P值离散化,然后对于每个时刻建一棵定义域是离散化后P值的线段树

每个节点维护了这个节点代表区间的任务个数和这些任务离散化之前的P值之和,

对于每个在这个时间段的任务,插入,即在p位置单点修改

询问就是类似二叉查找树的写法

高级想法:

首先把一段任务拆成两个:添加和删除,用三元组(t,p,d)表示,d=1表示插入,d=-1表示删除

对于第maxt棵线段树,我们把操作按t值排序之后进行,

这岂不是就变成可以一棵可以访问历史版本的线段树---主席树了!

那么写棵主席树,插入操作按t排序就O**K了

#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
#define N 200100
#define Nlogn N*20
using namespace std;
ll root[Nlogn],n,A,B,C,pre=,m,b[N],K,pcnt,opcnt,lim;
struct node
{
ll lc,rc,sum,val;
}t[Nlogn];
struct Op
{
ll t,p,d;
bool operator < (const Op &a) const{return t<a.t;}
}op[*N];
ll read()
{
ll ret=,neg=;char j=getchar();
for (;j>'' || j<'';j=getchar())
if (j=='-') neg=-;
for (;j>='' && j<='';j=getchar())
ret=ret*+j-'';
return ret*neg;
}
void Insert(ll y,ll &x,ll l,ll r,ll p,ll d)
{
t[x=++pcnt]=t[y];
t[x].sum+=d;t[x].val+=b[p]*d;
if (l==r) return;
ll mid=l+r>>;
if (p<=mid) Insert(t[y].lc,t[x].lc,l,mid,p,d);
else Insert(t[y].rc,t[x].rc,mid+,r,p,d);
}
ll query(ll u,ll l,ll r,ll k)
{
ll mid,ret=;
while (l<r)
{
if (t[u].sum==) return ret;
mid=l+r>>;
if (k<=t[t[u].lc].sum) r=mid,u=t[u].lc;
else k-=t[t[u].lc].sum,ret+=t[t[u].lc].val,l=mid+,u=t[u].rc;
}
return ret+b[l]*k;
}
int getroot(int x)
{
return root[x-]=(root[x-]!= || x==)?root[x-]:getroot(x-);
}
int main()
{
m=read(),n=read();
for (ll i=,s,e,p;i<=m;i++)
{
s=read(),e=read(),p=read();
op[++opcnt].t=s,b[opcnt]=op[opcnt].p=p,op[opcnt].d=;
op[++opcnt].t=e+,b[opcnt]=op[opcnt].p=p,op[opcnt].d=-;
}
//离散化
sort(b+,b++opcnt);
lim=unique(b+,b++opcnt)-b-;
for (ll i=;i<=opcnt;i++)
op[i].p=lower_bound(b+,b+lim+,op[i].p)-b;
//按操作时间插入节点
sort(op+,op++opcnt);
for (ll i=,j=;i<=opcnt;i++)
{
if (root[op[i].t]==) root[op[i].t]=getroot(op[i].t);
Insert(root[op[i].t],root[op[i].t],,lim+,op[i].p,op[i].d);
}
for (ll i=,x;i<=n;i++)
{
x=read(),A=read(),B=read(),C=read();
K=+(A*pre+B)%C;
printf("%lld\n",pre=query(root[x],,lim+,K));
}
return ;
}

BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题的更多相关文章

  1. bzoj 3932: [CQOI2015]任务查询系统 -- 主席树 / 暴力

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管 ...

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

    传送门 题意: 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi 调度系统会经常向查询系统询问,第Xi ...

  3. BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)

    题目链接 对于这一区间的操作,我们可以想到差分+前缀和(感觉也没什么别的了..). 同时对于本题我们能想到主席树,而主席树正是利用前一个节点建树的. 所以离散化.按时间排序,把操作拆成单点加和减即可. ...

  4. BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)

    就是裸的主席树,差分之后排序插入主席树就行了. 注意主席树查询的时候叶子节点要特判,因为本身是有size的 还有要开longlong CODE #include <cctype> #inc ...

  5. 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...

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

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

  7. [CQOI2015]任务查询系统 主席树

    [CQOI2015]任务查询系统 LG传送门 以前还没见过主席树的这种写法. 考虑使用差分的思想处理每一个任务,然后所有的东西就都能顺理成章地用主席树维护了,查询的时候和平时的主席树有一点不同,详见代 ...

  8. 【BZOJ3932】[CQOI2015]任务查询系统 主席树

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

  9. bzoj 3932 [CQOI2015]任务查询系统(主席树)

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

随机推荐

  1. java使用优先级队列实现哈夫曼编码

    思路: 构建小根堆 根据小根堆实现哈夫曼树 根据哈夫曼树对数据进行编码 代码实现如下: /** * @Author: DaleyZou * @Description: 使用java实现一个哈夫曼编码的 ...

  2. python生成xml文件

    先上代码: #!/usr/bin/env python3 # _*_ coding: utf-8 _*_ from xml.dom.minidom import Document def readFi ...

  3. python网络爬虫入门范例

    python网络爬虫入门范例 Windows用户建议安装anaconda,因为有些套件难以安装. 安装使用pip install * 找出所有含有特定标签的HTML元素 找出含有特定CSS属性的元素 ...

  4. pytorch中词向量生成的原理

    pytorch中的词向量的使用 在pytorch我们使用nn.embedding进行词嵌入的工作. 具体用法就是: import torch word_to_ix={'hello':0,'world' ...

  5. pyplot基础图表函数概述

    pyplot饼图的绘制 pyplot直方图的绘制 极坐标图的绘制

  6. spring源码学习中的知识点

    一.循环依赖 循环依赖就是循环引用,就是两个或多个bean之间互相持有对方. 1.构造器循环依赖 表示通过构造器注入造成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreat ...

  7. Windows usb设备正在使用中

    每次插上u盘之后,弹出的时候,总是提示正在使用中.后来我发现了技巧, 1.打开任务管理器 2.打开底部的 打开资源监视器 按钮 3.然后点击磁盘 4.再次弹出usb 就可以弹出了.

  8. Android Stadio 相关

    这几天,电脑坏了.重装系统,慢慢的学到了很多Android stadio 的相关知识.总结一下吧: 1.gradle 编译工具:在工程的gradle/wrapper/gradle–wrapper.pr ...

  9. 运行SparkStreaming程序时出现 Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowA异常

    Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowA 这个问题是版本不统一导致的 ...

  10. ElasticSearch学习笔记(三)-- 查询

    1. URISearch详解与演示 2. QueryDSL简介 3. 字段类查询简介及match-query 4. 相关性算分 5. match-phrase-query 6. query-strin ...