BZOJ 3932 [CQOI2015]任务查询系统 ——可持久化线段树
【题目分析】
主席树,维护区间大小以及权值之和。
但是细节确实要琢磨很久,WA了几次。
【代码】
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <string> #include <algorithm> #include <vector> #include <iostream> #include <queue> using namespace std; #define maxn 300005 #define mlog 40 #define inf (0x3f3f3f3f) #define ll long long ll read() { ll x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();} while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } ll llread() { ll x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();} while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } ll rt[maxn],ls[maxn*mlog],rs[maxn*mlog],siz[maxn*mlog],tot=0,n,m; struct eve{ll p,opt;}a[maxn]; vector <eve> v[maxn]; ll sum[maxn*mlog]; ll b[maxn],top=0,cnt=0; ll pre=1; /* void ins(ll o1,ll &o2,ll l,ll r,ll x,ll f) { o2=++tot; siz[o2]=siz[o1]+f; sum[o2]=sum[o2]+(ll)b[x]*f; if (l==r) return ; ll mid=(l+r)/2; if (x<=mid) ins(ls[o1],ls[o2],1,mid,x,f),rs[o2]=rs[o1]; else ins(rs[o1],rs[o2],mid+1,r,x,f),ls[o2]=ls[o1]; // sum[o2]=sum[ls[o1]]+sum[ls[o2]]; } */ ll ins (ll o1,ll l,ll r,ll x,ll f) { ll now=++tot; siz[now]=siz[o1]+f; sum[now]=sum[o1]+b[x]*f; if (l==r) return now; ll mid=(l+r)/2; if (x<=mid) ls[now]=ins(ls[o1],l,mid,x,f),rs[now]=rs[o1]; else rs[now]=ins(rs[o1],mid+1,r,x,f),ls[now]=ls[o1]; return now; } ll query(ll o,ll l,ll r,ll x) { if (x>=siz[o]) return sum[o]; if (l==r) return min(x,siz[o])*b[l]; ll tmp=siz[ls[o]]; if (tmp>=x) return query(ls[o],l,(l+r)/2,x); else return sum[ls[o]]+query(rs[o],(l+r)/2+1,r,x-tmp); } int main() { n=read();m=read(); for (ll i=1;i<=n;++i) { ll x=read(),y=read(),z=read(); if (x<=m) { a[++cnt].p=z; a[cnt].opt=1; v[x].push_back(a[cnt]); } if (y+1<=m) { a[++cnt].p=z; a[cnt].opt=-1; v[y+1].push_back(a[cnt]); } b[++top]=z; } sort(b+1,b+top+1); top=unique(b+1,b+top+1)-b-1; for (ll i=1;i<=m;++i) { rt[i]=rt[i-1]; for (ll j=0;j<v[i].size();++j) rt[i]=ins(rt[i],1,top,lower_bound(b+1,b+top+1,v[i][j].p)-b,v[i][j].opt); } for (ll i=1;i<=m;++i) { ll k,x,a,b,c; x=llread();a=llread();b=llread();c=llread(); k=1+(a*pre+b)%c; // if (i==m) k++; printf("%lld\n",pre=query(rt[x],1,top,k)); } }
BZOJ 3932 [CQOI2015]任务查询系统 ——可持久化线段树的更多相关文章
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...
- bzoj 3932: [CQOI2015]任务查询系统 -- 主席树 / 暴力
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管 ...
- bzoj 3932 [CQOI2015]任务查询系统(主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- bzoj 3932: [CQOI2015]任务查询系统
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- BZOJ 3932: [CQOI2015]任务查询系统 [主席树]
传送门 题意: 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi 调度系统会经常向查询系统询问,第Xi ...
- BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)
题目链接 对于这一区间的操作,我们可以想到差分+前缀和(感觉也没什么别的了..). 同时对于本题我们能想到主席树,而主席树正是利用前一个节点建树的. 所以离散化.按时间排序,把操作拆成单点加和减即可. ...
- BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题
题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...
- BZOJ 3932 [CQOI2015]任务查询系统 - 差分 + 主席树
Solution 差分就好了, 在$s_i$ 的点+1, $e_i + 1$ 的点 - 1. 查询的时候注意$l == r$ 要返回 $k * b[l]$ ,而不是$sum[node] $因为当前位置 ...
- BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)
就是裸的主席树,差分之后排序插入主席树就行了. 注意主席树查询的时候叶子节点要特判,因为本身是有size的 还有要开longlong CODE #include <cctype> #inc ...
随机推荐
- andriod一次退出所有的Activity
自己实现了一个Activity管理,可以实现一次退出所有的Activity.在Activity启动的时候,将调用里面的put方法,将Activity对象加入进来.在要退出某个activity的时候,将 ...
- java课后作业
课后作业之字串加密: 设计思想: 1.输入要加密的英文子串str 2.定义num=str的字符串长度 3.将字符串转化为单个字符 4.每个字符+3,向后移3个 5.定义str1,将新得到的每个字符加到 ...
- 无根树转有根树(dfs,tree)
#include <bits/stdc++.h> #include <iostream> #include <queue> #include <stdio.h ...
- Jmeter 中通过(_time函数)获取10位时间戳的方法
meter的__time函数作用是取当前时间的时间戳,默认取的时间精确到了毫秒级别,所以获取的时间戳默认是13位的. 下图为取10位的时间戳的函数表达式(时间精确到秒)
- PHP求时间间隔 n天、周、月、年后的时间
<?php date_default_timezone_set('PRC'); // 设置时区 $date1 = strtotime('2015-01-01'); //把日期转换成时间戳 $da ...
- 【C#】Json数据 排版算法
我从服务器上取得一串Json数据,然后想表示到画面上.不过服务器上取下的Json数据肯定是经过压缩的,空格和换行都没有.如果直接看,可读性非常差. 由于我这个软件是内部管理用的,使用者既能直接看懂Js ...
- hdu 2393:Higher Math(计算几何,水题)
Higher Math Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU3434 Sequence Adjustment
题意:给你含有n个数的序列,每次你可以选一个子序列将上面所有的数字加1或者减1,目标是把所有数字变成相同的,问最少步数,和那个相同的数字有多少种可能. 将原序列转化为差分序列,即a[2] - a[1] ...
- SPOJ220 Relevant Phrases of Annihilation(后缀数组)
引用罗穗骞论文中的话: 先将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组.然后二分答案,再将后缀分组.判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并 ...
- Win10 AppBar
<Page.BottomAppBar> <CommandBar x:Name="cmdBar" Background="Transparent" ...