题目

给定\(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. 2021-10-11 vue的第三方组件二次封装

    原理 v-bind="$attrs"继承所有属性和props. v-on="$listeners"继承所有的方法. <template> <d ...

  2. 异常处理try...except...finally---day26

    1.认识异常处理 # ### 认识异常处理 #IndexError 索引超出序列范围 #lst = [1,2,3,4] #print(lst[10]) #KeyError 字典中查找一个不存在的关键字 ...

  3. django的orm多表查询作业第五题答案

    5.每个作者出版的所有书的最高价格以及最高价格的那本书的名称. 用django的模型类写不出来的,只能用原生sql写这题 关于第五题,mysql5.7及以上版本,使用下面的答案 set sql_mod ...

  4. ioutil.ReadDir读取目录下的内容

    func dirents(dir string) []os.FileInfo{ entries, err := ioutil.ReadDir(dir) // 读取目录并返回排好序的文件以及子目录名 i ...

  5. python开发接口时,使用jsonschema模块对数据进行校验

    import jsonschema schema = { "type": "object", # 先声明每个键都是对象 "properties&quo ...

  6. docker中container相关命令

    1.以tomcat镜像为例运行tomcat容器(运行tomcat实例) docker run tomcat 2.宿主机端口与容器端口进行映射 -p docker run -p 8080(系统上外部端口 ...

  7. iOS的Runtime知识点繁杂难啃,真的理解它的思想,你就豁然开朗了

    一.Runtime 1.概念: 概念:Runtime是Objective-c语言动态的核心,即运行时.在面向对象的基础上增加了动态运行,达到很多在编译时确定方法推迟到了运行时,从而达到动态修改.确定. ...

  8. 问答:C程序为何for循环和while循环无法相互替代?

    百鸡百钱问题: C代码: include <stdio.h> main() { int cock, hen, chicken; for(cock=0;cock<=20;cock++) ...

  9. Learning by teaching --- 费曼学习法

    世界上存在成千上万种学习法,如果上天只让我掌握一种,那一定就是"费曼学习法". 介绍 费曼学习法是由诺贝尔物理学奖获得者理查德·费曼提出的一种学习方法,其核心思想是将所学内容用自己 ...

  10. 解决windows11远程连接阿里云Centos7

    本地连接CentOs7时报错   Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 网上大部分说的是去修改 vim /etc/ss ...