题目

给定\(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. timeit测试函数执行时间

    def list_append(): l = [] for i in range(5000): l.append(i) def list_insert(): l = [] for i in range ...

  2. 万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程

    万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程 目录 万字长文学会对接 AI 模型:Semantic Kernel 和 Kerne ...

  3. 关于mv命令,系统是如何区分是移动还是重命名

    ​ 引入: 精简回答版:重命名的本质仍是移动覆盖 ,所以不存在应该如何区分的问题 最近学习到linux基础命令中的mv命令,了解到mv命令的作用是对文件的移动和重命名,但自己一直想不明白系统是如何分辨 ...

  4. 『Echarts』基本使用

    一.前言 本篇文章是『Echarts』文章的第 2 篇,主要介绍『Echarts』基本使用 在『Echarts』第 1 篇文章中,我们介绍了 Echarts 的概述及其强大的数据可视化功能.本篇将继续 ...

  5. C++ 模板的笔记2

    C++模板的笔记2 关于可变参函数模板借鉴了一部分笔记,感谢大佬 类模板中的嵌套 类模板可以嵌套其他类模板,就像普通类可以嵌套其他普通类一样.嵌套的类模板可以访问外部类模板的成员,包括私有成员. 示例 ...

  6. Jmeter参数化-用户自定义变量

    一  首先我们先来了解下jmeter 做参数化的目的: 1通过参数化来集中管理配置和测试数据 2通过参数化实现数据驱动测试 二 线程组添加配置元件中的用户自定义变量 添加变量名称,变量值 三 使用变量 ...

  7. redis同步锁的真实应用场景

    一.问题由来 现在正在做的小程序后台中,有一个功能叫做高光时刻,在操作高光时刻的时候,可能会有多个用户来同时想操作这个功能,可是在同一时间只能 有一个用户能够操作.刚开始做的时候,自己的做法是在red ...

  8. pip 安装requirements.txt 的问题

    用新环境 在进行pip 安装的时候, 如果出现不进行安装 ,但是不报错就是满足条件,这个时候重新起一个shell,然后进行pip的安装.

  9. 使用JdbcTemplate

    1.使用JdbcTemplate的execute()方法执行SQL语句 Java代码  收藏代码 jdbcTemplate.execute("CREATE TABLE USER (user_ ...

  10. 分析三维模型OBJ格式轻量化在网络传输中的重要性

    分析三维模型OBJ格式轻量化在网络传输中的重要性 三维模型的OBJ格式轻量化在网络传输中扮演着重要的角色.随着互联网的快速发展和普及,越来越多的三维模型需要通过网络进行传输,涉及到下载.上传.共享等场 ...