题目

给定\(n\)条线段\(x_i,y_i,k_i\)和\(m\)个点(点有顺序),

对于每个点,问有多少条线段是第\(k_i\)次被该点经过。


分析(主席树)

将点按坐标排序建主席树那么就是一道静态第\(k\)小问题


代码(主席树)

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011;
struct rec{int l,r,kth;}q[N];
int a[N],rk[N],ans[N],cnt,n,m,ls[N<<5],rs[N<<5],w[N<<5],rt[N];
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
bool cmp(int x,int y){return a[x]<a[y];}
inline void update(int &rt,int l,int r,int x){
rr int trt=++cnt,mid=(l+r)>>1;
w[trt]=w[rt]+1,ls[trt]=ls[rt],rs[trt]=rs[rt],rt=trt;
if (l==r) return;
if (x<=mid) update(ls[rt],l,mid,x);
else update(rs[rt],mid+1,r,x);
}
inline signed query(int lt,int rt,int l,int r,int kth){
if (l==r) return l;
rr int mid=(l+r)>>1;
if (kth<=w[ls[rt]]-w[ls[lt]]) return query(ls[lt],ls[rt],l,mid,kth);
else return query(rs[lt],rs[rt],mid+1,r,kth-w[ls[rt]]+w[ls[lt]]);
}
signed main(){
n=iut(),m=iut();
for (rr int i=1;i<=n;++i) q[i]=(rec){iut(),iut(),iut()};
for (rr int i=1;i<=m;++i) a[i]=iut(),rk[i]=i;
sort(rk+1,rk+1+m,cmp);
for (rr int i=1,j=1;i<N;++i){
rt[i]=rt[i-1];
for (;j<=m&&a[rk[j]]<=i;++j)
update(rt[i],1,n,rk[j]);
}
for (rr int i=1;i<=n;++i){
if (q[i].kth>w[rt[q[i].r]]-w[rt[q[i].l-1]]) continue;
++ans[query(rt[q[i].l-1],rt[q[i].r],1,n,q[i].kth)];
}
for (rr int i=1;i<=m;++i) print(ans[i]),putchar(10);
return 0;
}

分析(整体二分)

同样,可以二分在第几个点时线段恰好被经过\(k_i\)次,整体二分即可,

虽然整体二分两个log,但是比主席树一个log常数小


代码(整体二分)

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=200011;
struct rec{int l,r,x;}q[N],q1[N],q2[N];
int ans[N],a[N],c[N],n,m;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void update(int x,int y){
for (;x<N;x+=-x&x) c[x]+=y;
}
inline signed query(int x){
rr int ans=0;
for (;x;x-=-x&x) ans+=c[x];
return ans;
}
inline void dfs(int L,int R,int l,int r){
if (l>r) return;
if (L==R){
ans[L]=r-l+1;
return;
}
rr int mid=(L+R)>>1,tot1=0,tot2=0;
for (rr int i=L;i<=mid;++i) update(a[i],1);
for (rr int i=l;i<=r;++i){
rr int now=query(q[i].r)-query(q[i].l-1);
if (q[i].x<=now) q1[++tot1]=q[i];
else q[i].x-=now,q2[++tot2]=q[i];
}
for (rr int i=L;i<=mid;++i) update(a[i],-1);
for (rr int i=1;i<=tot1;++i) q[l+i-1]=q1[i];
for (rr int i=1;i<=tot2;++i) q[l+i+tot1-1]=q2[i];
dfs(L,mid,l,l+tot1-1),dfs(mid+1,R,l+tot1,r);
}
signed main(){
n=iut(),m=iut();
for (rr int i=1;i<=n;++i)
q[i]=(rec){iut(),iut(),iut()};
for (rr int i=1;i<=m;++i) a[i]=iut();
dfs(1,m+1,1,n);
for (rr int i=1;i<=m;++i) print(ans[i]),putchar(10);
return 0;
}

#整体二分 or 主席树#洛谷 7424 [THUPC2017] 天天爱射击的更多相关文章

  1. 静态区间第K小(整体二分、主席树)

    题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...

  2. 带修主席树 洛谷2617 支持单点更新以及区间kth大查询

    题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...

  3. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  4. BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树

    分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...

  5. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  6. BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树

    BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...

  7. 2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)

    K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明 ...

  8. 【LOJ#2402】[THUPC2017]天天爱射击(整体二分)

    [LOJ#2402][THUPC2017]天天爱射击(整体二分) 题面 LOJ 题解 显然对于每块木板可以二分被打烂的时间. 那么直接上整体二分处理就行了. #include<iostream& ...

  9. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  10. P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)

    解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...

随机推荐

  1. LayUI样式优化

    如下是LayUI框架中页面元素的CSS优化样式: /* 表单输入框宽度 */ .layui-form-item .layui-input-inline { width: 295px; } /* 下拉框 ...

  2. 解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题

    django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题.如何解决请继续看. sched ...

  3. java数组案例

    数组:         数组就是用来存储一批同类型数据的内存区域(容器) 数组中的最大值实现方法:   数据拿到程序中去,用数组装起来. 定义一个变量,用于记录最大值.这个变量建议默认存储第一个元素作 ...

  4. Java //100以内的质数的输出(从2开始,到这个数-1结束为止,都不能被这个数本身整除)+优化

    1 //100以内的质数的输出(从2开始,到这个数-1结束为止,都不能被这个数本身整除) 2 boolean isFlag = true; //标识i是否被j除尽,修改其值 3 4 for(int i ...

  5. 完整塔建一个spring 注解版 mybaties 过程可供复制代码

    第一步引导包.新建工程maven模块 pom.xml 中导入相对应包 ++++++++++++++++++++++++++++++++++++++++++++       1      +++++++ ...

  6. Python-使用openpyxl读取excel内容

    1. 本篇文章目标 将下面的excel中的寄存器表单读入并构建一个字典 2. openpyxl的各种基本使用方法 2.1 打开工作簿 wb = openpyxl.load_workbook('test ...

  7. python tcp socket 源码分享

    服务端的源码: import socketserver class Handler_TCPServer(socketserver.BaseRequestHandler): ""&q ...

  8. 超低延时超低功耗的2.4G无线音频收发解决方案特色解析

    为什么是我们?   团队从做芯片开始,一直在无线领域这个圈子里面混.从刚开始的wifi芯片,到后面的bt芯片,再到后面的音频算法,再到后面一起创业,做无线音频解决方案.随着和客户关系的逐渐深入,团队慢 ...

  9. Github下载release附件变相提速方法

    最近找到了个油猴插件,下载2M/s,推荐大家使用Github 镜像访问,加速下载 描述 github上面有许多开源的软件,作者们都打包发布为release版本,我们可以下载打包好的软件,但是,由于国内 ...

  10. 一个简易的ORM框架的实现(一)

    一个简易的ORM框架的实现 ORM ORM---操作数据库---对象关系映射 ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节.只要提供了持久化类与 ...