p3168 [CQOI2015]任务查询系统(差分+主席树)
恕我才学浅薄,一开始想到的是树状数组+线段树,然后看了题解才第一次见到了差分这种神奇的科技
仔细想想,主席树的本质不就是前缀和嘛,加上一个差分也是可以的,没想到真是罪过罪过
对时间维护一个差分
在Si处+Ki,在Ti+1处-Ki
用主席树维护插入的数即可
不是很复杂就是代码写了好长时间而且越debug越像题解
注意查前k大的时候比较这样写
if(lch<kth)
//向右
else
//向左
不能这样
if(lch<=kth)
//向右
else
//向左
因为这样在lch与kth相等的情况下,会一直向左走到还没有开的节点上,导致RE
丢人的和题解极其相似的代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct PTNode{
int lson, rson;
long long sum, sz;
}x[100100*40];
struct Task{
int Posi,Ki,changew;
bool operator < (const Task &b) const {
return Posi < b.Posi;
}
}b[100100*3];
int a[100100], n, m, Nodecnt = 0, cnt = 0, root[100100];
void pushup(int o){
x[o].sz = x[x[o].lson].sz + x[x[o].rson].sz;
x[o].sum = x[x[o].lson].sum + x[x[o].rson].sum;
}
void insert(int l, int r, int &now, int pos, int c){
x[++Nodecnt] = x[now];
now = Nodecnt;
x[now].sum += a[pos] *c ;
x[now].sz += c;
if(l == r)
return;
int mid=(l + r) >> 1;
if(pos <= mid)
insert(l, mid, x[now].lson, pos, c);
else
insert(mid + 1, r, x[now].rson, pos, c);
}
int query(int l, int r, int o, int kth){//前k小
if(l==r)
return x[o].sum/x[o].sz*kth;
int mid=(l+r)>>1,lch=x[x[o].lson].sz;
if(lch<kth)
return query(mid+1,r,x[o].rson,kth-lch)+x[x[o].lson].sum;
else
return query(l,mid,x[o].lson,kth);
}
int main(){
scanf("%d %d",&m ,&n);
for(int i = 1; i <= m; i++){
int x, y, z;
scanf("%d %d %d",&x, &y, &z);
b[++cnt] = (Task){x, z, 1};
b[++cnt] = (Task){y+1, z, -1};
a[i] = z;
}
sort(a + 1, a + m + 1);
sort(b + 1, b + cnt + 1);
int j = 1;
for(int i = 1; i <= n; i++){
root[i] = root[i-1];
for(;j <= cnt && b[j].Posi == i;j++){
int num = lower_bound(a + 1, a + n + 1 , b[j].Ki) - a;
insert(1, n, root[i], num, b[j].changew);
}
}
long long preans = 1;
for(int i = 1;i <= n;i++){
long long xi,ki,a,b,c;
scanf("%lld %lld %lld %lld", &xi, &a, &b, &c);
ki = 1 + (a * preans + b) % c;
if(ki<=x[root[xi]].sz)
preans = query(1, n, root[xi], ki);
else
preans = x[root[xi]].sum;
printf("%lld\n",preans);
}
return 0;
}
p3168 [CQOI2015]任务查询系统(差分+主席树)的更多相关文章
- bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...
- [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...
- BZOJ 3932 [CQOI2015]任务查询系统 - 差分 + 主席树
Solution 差分就好了, 在$s_i$ 的点+1, $e_i + 1$ 的点 - 1. 查询的时候注意$l == r$ 要返回 $k * b[l]$ ,而不是$sum[node] $因为当前位置 ...
- BZOJ_3932_[CQOI2015]任务查询系统_主席树
BZOJ_3932_[CQOI2015]任务查询系统_主席树 题意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,P ...
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...
- BZOJ3932 CQOI2015 任务查询系统 【主席树】
BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...
- 【洛谷 P3168】 [CQOI2015]任务查询系统(主席树)
题目链接 被自己的sb错误调到自闭.. 主席树的进阶应用. 把\(P_i\)离散化一下,得到每个\(P_i\)的排名,然后建一棵维护\(m\)个位置的主席树,每个结点记录区间总和和正在进行的任务数. ...
- [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)
传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...
- [bzoj3932][CQOI2015]任务查询系统_主席树
任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
随机推荐
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- 取n的第k位
实例二:取n的第k位 方法:a>> k & 1 某值a右移K位后与整数“1”进行与运算.即把需要第几位就右移几位. 例子: 0000 1000 ------8右移3位 0000 0 ...
- JavaScript--元素对象方法setAttribute() 和appendChild()
appendChild() 方法可向节点的子节点列表的末尾添加新的子节点 setAttribute() 方法创建或改变某个新属性.如果指定属性已经存在,则只设置该值 <!DOCTYPE html ...
- Chess (SG + 状态压缩预处理)
#include<bits/stdc++.h> #define bit(t) (1 << t) using namespace std; <<; ;//k是集合s的 ...
- uva 1322 Minimizing Maximizer
题意: 有n个数,m个排序器,每个排序器可以把区间ai到bi的数从小到大排序.这m个排序器的输出就是m个排序之后的第n个数. 现在发现有些排序器是多余的.问至少需要多少个排序器可以使得输出不变.排序器 ...
- Linux基础命令---ifcfg
ifcfg ifcfg是一个简单的脚本替换iconfig命令,它可以设置网络接口的ip地址. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedo ...
- idea下导入Tomcat源码
对于web开发者来说,如果明白了tomcat那对于开发还是后面的学习都是有很大益处的,但在网上看了很多的文章,总是没弄好,经历了很久才弄好了,写个文章记录下,希望也能帮助到其他人.下载Tomcat源码 ...
- 如何给webview页面自定义404页面
//示例地图类 package com.can2do.doimobile.news; import android.os.Bundle; import android.os.Handler; impo ...
- GoldenGate实时投递数据到大数据平台(1)-MongoDB
mongodb安装 安装 linux下可使用apt-get install mongodb-server 或 yum install mongodb-server 进行安装. 也可以在windows上 ...
- 基于spring框架的jt项目分页查询知识点(二)
知识点汇总 1. 日志记录方法 private Logger log= Logger.getLogger(SysLogServiceImpl.class.getName()); 记录SysLogSer ...