#整体二分 or 主席树#洛谷 7424 [THUPC2017] 天天爱射击
题目
给定\(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] 天天爱射击的更多相关文章
- 静态区间第K小(整体二分、主席树)
题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...
- 带修主席树 洛谷2617 支持单点更新以及区间kth大查询
题目链接:https://www.luogu.com.cn/problem/P2617 参考博客:https://blog.csdn.net/dreaming__ldx/article/details ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树
分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...
- 【bzoj2738】矩阵乘法 整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...
- BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树
BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...
- 2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)
K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明 ...
- 【LOJ#2402】[THUPC2017]天天爱射击(整体二分)
[LOJ#2402][THUPC2017]天天爱射击(整体二分) 题面 LOJ 题解 显然对于每块木板可以二分被打烂的时间. 那么直接上整体二分处理就行了. #include<iostream& ...
- BZOJ.2738.矩阵乘法(整体二分 二维树状数组)
题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...
- P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)
解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...
随机推荐
- 运用 Argo Workflows 协调 CI/CD 流水线
Argo Workflows 是一个开源的容器原生工作流引擎,用于协调 CI/CD 在 Kubernetes 中的运作.它以 Kubernetes 自定义资源(CRD)的形式实现,使开发人员能够创建自 ...
- 项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)
需求 1. 全屏软键盘: 2. 输入英文: 3. 输入中文: 4. 支持触摸.键盘和输入混合输入: 5. 目前有黑色系皮肤: 6. Qt4和Qt5区分2个版本: Demo:Qt5 ...
- Java 重写equals
1 package com.bytezreo.objectclass; 2 /** 3 * 4 * @Description 重写equals 5 * @author Bytezero·zhengle ...
- 万字博文让我们携手一起走进bs4的世界【python Beautifulsoup】bs4入门 find()与find_all()
目录 Beautiful Soup BeautifulSoup类的基本元素 1.Tag的name 2.Tag的attrs(属性) 3.Tag的NavigableString 二.遍历文档树 下行遍历 ...
- C语言趣味编程之三天打鱼两天晒网
include <stdio.h> typedef struct date {//定义一个日期结构体date,三个成员变量year\month\day,使得年月日作为一个整体,相互联系. ...
- (完美解决)chatGPT登陆正常却无法发送消息
这几天要写关于项目的文字性材料,登陆上chatgpt,结果发现登陆正常,各方面都正常,但是点击发送消息就会不停转圈圈,无法发送出去,然后联想到之前看到朋友圈有人说chatGPT崩了,就没多在意,结果今 ...
- vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码
vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码
- 使用 libreoffice 批量化转化文件为 .pdf 并合并
介绍使用 libreoffice 批量化将文件转化为 .pdf 然后合并.pdf文件的方法 很多人知道,在 Linux 系统中 WPS 是办公软件中很棒的选择.但其实 libreoffice 也是一个 ...
- 基于泰凌微的TLSR8355芯片的2.4G无线私有协议PCBA设计调试总结
一 前记 经常做物联网的类的产品,TLSR8355凭借着它的射频距离远,功能强大等优点成为很多客户的首选.TLSR8355系列专用于2.4GHz射频系统芯片解决方案,如零售/物流.专用网络.Beaco ...
- URL URI URN
总结如下: 1.简写: URI (uniform resource identifier)统一资源标志符: URL(uniform resource location )统一资源定位符(或统一资源定位 ...