LibreOJ2097 - 「CQOI2015」任务查询系统
Description
给出\(n(n\leq10^5)\)个任务,和总时间范围\(m(m\leq10^5)\)。每个任务有开始/结束时间\(s_i,e_i(1\leq s_i \leq e_i \leq m)\)和优先级\(p_i(p_i\leq10^9)\)。接下来\(m\)个询问,每次询问在时刻\(t_i\)时优先级前\(k\)大的任务的优先级之和,若\(k\)大于此时正在进行的任务总数则输出此时优先级之和。其中\(\{t_m\}\)是\(1..m\)的一个排列。
Solution
可持久化线段树。
将优先级\(p\)离散化,然后对于每个时刻建立线段树,记录此时正在进行的任务情况,线段树上第\(i\)个位置记录优先级为\(i\)的任务个数。在线段树上同时维护区间任务个数和区间优先级之和即可完成询问。
时间复杂度\(O(nlogn)\)。
Code
//「CQOI2015」任务查询系统
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long lint;
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
const int N=2e5+10;
int n,m;
struct optn{int opt,t,x;} seq[N];
bool cmpT(optn a,optn b) {return a.t<b.t;}
int n0,map[N];
void discrete()
{
for(int i=1;i<=n+n;i++) map[i]=seq[i].x;
sort(map+1,map+n+n+1); n0=unique(map+1,map+n+n+1)-map-1;
for(int i=1;i<=n+n;i++) seq[i].x=lower_bound(map+1,map+n0+1,seq[i].x)-map;
}
const int N1=22*N;
int ndCnt,rt[N],ch[N1][2],cnt[N1] ;lint sum[N1];
void update(int p) {cnt[p]=cnt[ch[p][0]]+cnt[ch[p][1]],sum[p]=sum[ch[p][0]]+sum[ch[p][1]];}
void ndCopy(int p,int q) {ch[q][0]=ch[p][0],ch[q][1]=ch[p][1],cnt[q]=cnt[p],sum[q]=sum[p];}
void ins(int &p,int L0,int R0,int x,int v)
{
ndCopy(p,++ndCnt); p=ndCnt;
if(L0==R0) {cnt[p]+=v,sum[p]+=v*map[L0]; return;}
int mid=L0+R0>>1;
if(x<=mid) ins(ch[p][0],L0,mid,x,v);
else ins(ch[p][1],mid+1,R0,x,v);
update(p);
}
lint query(int p,int L0,int R0,int k)
{
if(L0==R0) return 1LL*k*map[L0];
if(cnt[p]<=k) return sum[p];
int mid=L0+R0>>1;
if(cnt[ch[p][0]]>=k) return query(ch[p][0],L0,mid,k);
else return sum[ch[p][0]]+query(ch[p][1],mid+1,R0,k-cnt[ch[p][0]]);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
int t1=read(),t2=read(),x=read();
int i2=i<<1,i1=i2-1;
seq[i1].opt=1,seq[i1].t=t1,seq[i1].x=x;
seq[i2].opt=-1,seq[i2].t=t2+1,seq[i2].x=x;
}
discrete();
sort(seq+1,seq+n+n+1,cmpT);
for(int i=1,k=1;i<=1e5+10;i++)
{
rt[i]=rt[i-1];
for(k;seq[k].t==i;k++) ins(rt[i],1,n0,seq[k].x,seq[k].opt);
}
lint pre=1;
for(int i=1;i<=m;i++)
{
int t=read(); lint a=read(),b=read(),c=read();
pre=query(rt[t],1,n0,1+(a*pre+b)%c);
printf("%lld\n",pre);
}
return 0;
}
LibreOJ2097 - 「CQOI2015」任务查询系统的更多相关文章
- 「CQOI2015」任务查询系统
「CQOI2015」任务查询系统 传送门 好像也是板子题??? 区间修改,单点查询,考虑差分. 然后每次查询时就直接在对应的主席树上二分即可. 参考代码: #include <cstdio> ...
- LibreOJ2095 - 「CQOI2015」选数
Portal Description 给出\(n,k,L,R(\leq10^9)\),求从\([L,R]\)中选出\(n\)个可相同有顺序的数使得其gcd为\(k\)的方案数. Solution 记\ ...
- 「CQOI2015」选数
「CQOI2015」选数 题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都 ...
- 【LOJ】#2098. 「CQOI2015」多项式
题解 令x = x - t代换一下会发现 \(\sum_{i = 0}^{n}a_i (x + t)^i = \sum_{i = 0}^{n} b_{i} x^{i}\) 剩下的就需要写高精度爆算了- ...
- Linux 小知识翻译 - 「LDAP」
这次聊聊「LDAP」. LDAP是「Lightweight Directory Access Protocol」的所有,从名字上可以看出是协议的一种. LDAP是访问数据库(层次型数据库)的组件.管理 ...
- BZOJ_3932_[CQOI2015]任务查询系统_主席树
BZOJ_3932_[CQOI2015]任务查询系统_主席树 题意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,P ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- P3168 [CQOI2015]任务查询系统
题目地址:P3168 [CQOI2015]任务查询系统 主席树的模板题 更模板的在这儿:P3834 [模板]可持久化线段树 1(主席树) 形象的说,P3834是"单点修改,区间查询" ...
- 主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168
题目: [CQOI2015]任务查询系统 题解: 是一道很经典的题目.大体思路是抓优先级来当下标做主席树,用时刻作为主席树的版本.然而优先级范围到1e7去了,就离散化一遍.然后把每个事件的开始(s). ...
随机推荐
- 禁止DataGridView控件中添加和删除行
实现效果: 知识运用: DataGridView控件的AllowUserToAddRows AllowUserDeleteRows和ReadOnly属性 实现代码: private void btn_ ...
- 队列的add与offer的区别
两个方法都表示往队列里添加元素 但是当出现异常时,add方法抛出异常 而offer则返回的是false,就是啥事也没有,也不抛异常,也没有添加成功!
- 简易数据分析 02 | Web Scraper 的下载与安装
这是简易数据分析系列的第 2 篇文章. 上篇说了数据分析在生活中的重要性,从这篇开始,我们就要进入分析的实战内容了.数据分析数据分析,没有数据怎么分析?所以我们首先要学会采集数据. 我调研了很多采集数 ...
- python 嵌套作用域 闭包函数
#闭包函数 def multiplier(factor): def multiplyByFactory(number): return number*factor return multiplyByF ...
- Linux学习日记:第二天
今天学习vi编辑命令: root@ubuntu:vi hello.java 使用到的命令: 插入命令: a 和 i:在当前光标前或后插入文本(A 和 I 分别在当前行行末或行首插入文本): o 和 ...
- virtualvenv+django+uWSGI+nginx 部署 踩坑记录
原创博文 转载请注明出处! uwsgi: unrecognized option '--http:8089' uwsgi: unrecognized option '--http' uwsgi trk ...
- stack与heap、new的内存分配、static对象。(effective c++ 04)
阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下. 目录 sta ...
- MySQL写delete语句时不支持表别名
今天写代码时发现了下面一个比较奇怪的问题: 有下面的删除数据的SQL ; 这个sql本来没有问题,但是在MySQL中执行时会报错 ; 原因是 MySQL写delete语句时不支持表别名,困扰了我一会儿 ...
- Java多线程之Deque与LinkedBlockingDeque深入分析
有大小的队列就叫有界队列 如 ArrayBlockingquue, 反之是无界队列 如 LinkedBlockingDeque. 单词写错了. 是的,LinkedBlockingDeque 永远满不 ...
- exp分析
1 from pwn import* 2 3 local =1 4 debug = 1 5 6 if local: 7 p = process('./pwn1') 8 else: 9 p = remo ...