博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3168 [CQOI2015]任务查询系统
阅读量:4487 次
发布时间:2019-06-08

本文共 1076 字,大约阅读时间需要 3 分钟。

求前 $K$ 小的数的和,考虑主席树

但是如果每个时间都暴力插入显然会GG

发现每个任务都是区间,查询是单点查询

所以考虑维护差分数组

直接用主席树维护差分数组,因为同一时间差分可能有多次修改,所以要把当前修改全部搞完才算当前时间的线段树

询问就在相应时间点的线段树上走

具体看代码理解吧

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;inline 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<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}const int N=2e5+7,M=2e7+7;int n,m;int rt[N],L[M],R[M],sz[M],cnt;ll S[M];//注意long long!int val,K;ll res;//long long !void ins(int &o,int l,int r,int pre)//插入{ o=++cnt; S[o]=S[pre]+val; sz[o]=sz[pre]+(val>0 ? 1 : -1); //注意我们维护的是差分数组,要根据val的正负来判断加还是删 if(l==r) return; int mid=l+r>>1; if(abs(val)<=mid) ins(L[o],l,mid,L[pre]),R[o]=R[pre];//注意val要取绝对值 else ins(R[o],mid+1,r,R[pre]),L[o]=L[pre];}void query(int o,int l,int r){ if(l==r) { res+=l*K; return; } int mid=l+r>>1; if(sz[L[o]]

 

转载于:https://www.cnblogs.com/LLTYYC/p/10596178.html

你可能感兴趣的文章
mysql 添加[取消]timestamp的自动更新
查看>>
码农的半衰期只有15年?
查看>>
手工释放linux内存
查看>>
2014-5-30 总结
查看>>
【H3 BPM工作流程管理产品小故事】第四篇 子表创建
查看>>
洛谷P1148 拱猪计分
查看>>
MySQL服务器的安装和配置,MySQL Workbench 8.0.12安装,MySQL的基本使用
查看>>
扑克序列
查看>>
java笔记--适配器模式的运用
查看>>
Replace Nested Conditional with Guard Clauses(用卫语句代替嵌套循环)
查看>>
jsp中${}是EL表达式的常规表示方式
查看>>
GoldenGate常见问题及处理
查看>>
Android JNI学习(五)——Demo演示
查看>>
java map合并_java 实现合并map示例Demo1
查看>>
java 8 string_String.join() --Java8中String类新增方法
查看>>
java 布局教程_java布局学习(新)
查看>>
你真的会写Java吗?
查看>>
alibaba.fastjson.JSONObject 解析
查看>>
终于有人把Elasticsearch原理讲透了
查看>>
Java使用POI 读取和写入Excel指南
查看>>