BZOJ4604:The kth maximum number
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4604
整体二分套\(CDQ\)分治,判断一个询问的答案是否大于等于\(mid\)的时候用\(cdq\)分治数点就行了。
注意\(x\)相同的时候先修改。
时间复杂度:\(O(nlog^3n)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
#define low(i) ((i)&(-(i)))
const int maxn=5e5+5;
bool bo[maxn];
int ans[maxn];
int n,Q,ans_cnt,maxv;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct query {
int id,x1,x2,y1,y2,k;
query() {}
query(int _id,int _x1,int _y1,int _x2,int _y2,int _k) {
id=_id,x1=_x1,x2=_x2,y1=_y1,y2=_y2,k=_k;
}
bool operator<(const query &a)const {
if(x1==a.x1)return id<a.id;
return x1<a.x1;
}
}p[maxn],tmp[maxn<<2];
struct tree_array {
int c[maxn];
void add(int pos,int v) {
for(int i=pos;i<=n;i+=low(i))
c[i]+=v;
}
int query(int pos) {
int res=0;
for(int i=pos;i;i-=low(i))
res+=c[i];
return res;
}
}T;
void cdq_solve(int l,int r) {
if(l>=r)return;
int mid=(l+r)>>1;
cdq_solve(l,mid),cdq_solve(mid+1,r);
sort(tmp+l,tmp+r+1);
for(int i=l;i<=r;i++)
if(!tmp[i].id&&tmp[i].y2<=mid)T.add(tmp[i].y1,1);
else if(tmp[i].id&&tmp[i].y2>mid)
ans[tmp[i].id]+=tmp[i].x2*T.query(tmp[i].y1);
for(int i=l;i<=r;i++)
if(!tmp[i].id&&tmp[i].y2<=mid)T.add(tmp[i].y1,-1);
}
void solve(int l,int r,int st,int ed) {
if(ed<st)return;
if(l==r) {
for(int i=st;i<=ed;i++)
ans[p[i].id]=l;
return;
}
int mid=(l+r)>>1;
int cnt=0;
for(int i=st;i<=ed;i++)
if(!p[i].id) {
if(p[i].k>mid)
tmp[++cnt]=p[i],tmp[cnt].y2=cnt;
}
else {
ans[p[i].id]=0;
++cnt,tmp[cnt]=query(p[i].id,p[i].x2,p[i].y2,1,cnt,0);
++cnt,tmp[cnt]=query(p[i].id,p[i].x2,p[i].y1-1,-1,cnt,0);
++cnt,tmp[cnt]=query(p[i].id,p[i].x1-1,p[i].y2,-1,cnt,0);
++cnt,tmp[cnt]=query(p[i].id,p[i].x1-1,p[i].y1-1,1,cnt,0);
}
cdq_solve(1,cnt),cnt=0;
for(int i=st;i<=ed;i++)
if(!p[i].id) {
if(p[i].k>mid)bo[i]=0;
else bo[i]=1,cnt++;
}
else {
if(ans[p[i].id]>=p[i].k)bo[i]=0;
else bo[i]=1,cnt++,p[i].k-=ans[p[i].id];
}
int ED=st,ST=st+cnt;
for(int i=st;i<=ed;i++)
if(bo[i])tmp[ED++]=p[i];
else tmp[ST++]=p[i];
for(int i=st;i<=ed;i++)p[i]=tmp[i];
solve(l,mid,st,ED-1),solve(mid+1,r,ED,ed);
}
int main() {
n=read(),Q=read();
for(int i=1;i<=Q;i++) {
int opt=read();
if(opt==1) {
int x=read(),y=read(),k=read();
p[i]=query(0,x,y,0,0,k),maxv=max(maxv,k);
}
else {
int x1=read(),y1=read(),x2=read(),y2=read(),k=read();
p[i]=query(++ans_cnt,x1,y1,x2,y2,k);
}
}
solve(0,maxv,1,Q);
for(int i=1;i<=ans_cnt;i++)
if(ans[i])printf("%d\n",ans[i]);
else puts("NAIVE!ORZzyz.");
return 0;
}
BZOJ4604:The kth maximum number的更多相关文章
- 【bzoj4604】The kth maximum number
暴力 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> ...
- hdu 4006 The kth great number (优先队列)
/********************************************************** 题目: The kth great number(HDU 4006) 链接: h ...
- 转:java.io.IOException: Exceeeded maximum number of redirects: 5 解决版本
Jmeter运行的时候出现的重定向超过n次的问题: When trying to test a Silverlight application, I get the below error. Has ...
- 错误:maximum number of expressions in a list is 1000
某一日发现这么如下这么一个错误 --> maximum number of expressions in a list is 1000 原因:因为SQL语句中用到了IN字句,而IN中的元素个数 ...
- 【POI】导出xls文件报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
使用POI导出xls文件,由于数据过多,导致导出xls报错如下: The maximum number of cell styles was exceeded. You can define up t ...
- 错误: 实例 "ahwater-linux-core" 执行所请求操作失败,实例处于错误状态。: 请稍后再试 [错误: Exceeded maximum number of retries. Exceeded max scheduling attempts 3 for instance 7c1609c9-9d0f-4836-85b3-cefd45f942a7. Last exception: [u
错误: 实例 "ahwater-linux-core" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Exceeded maximum number of ret ...
- leetcode解题报告(15):Third Maximum Number
描述 Given a non-empty array of integers, return the third maximum number in this array. If it does no ...
- iOS---The maximum number of apps for free development profiles has been reached.
真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...
- [LeetCode] Third Maximum Number 第三大的数
Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...
随机推荐
- Linux软件包管理 RMP包
RPM 包的安装虽然很方便和快捷,但是依赖性实在是很麻烦,尤其是库文件依赖,还要去 rpmfind 网站査找库文件到底属于哪个 RPM 包,从而导致 RPM 包的安装非常烦琐.那么,有没有可以自动解决 ...
- nand flash详解及驱动编写
https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...
- webstrom突然不显示文件夹
不知道什么原因,webstrom突然不显示文件夹了,弄得几乎都不能用了... 百度搜了一下解决方案: 问题原因:webstorm自动生成的配置文件 .idea/modules.xml损坏(就是我一开始 ...
- tree 命令【转】
本文转载自:http://www.jb51.net/LINUXjishu/283874.html linux下怎么用tree命令以树形结构显示文件目录结构?tree命令可以以树形结构显示文件目录结构, ...
- CentOS 7防火墙设置开放80端口
在CentOS 6.x版本中,默认使用的是iptables防火墙.到了CentOS 7.x版本,默认防火墙变成了firewalld.本篇通过使用firewalld开启.关闭 HTTP(80)端口,来讲 ...
- qq在线客服代码
http://wpa.qq.com/msgrd?v=3&uin=1456262869&site=www.cactussoft.cn&menu=yes
- LeetCode——palindrome-partitioning
Question Given a string s, partition s such that every substring of the partition is a palindrome. R ...
- JavaWeb -- Servlet Filter 过滤器
1. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在 ...
- Python中MySQL插入数据
sql = 'INSERT INTO course(class_name, credit, properties, teacher_name, college_given, classroom) ' ...
- review13
Date与Calendar类 Date类和Calendar类属于java.util包. Date类 1.使用无参数构造方法 使用Date类的无参构造方法创建的对象可以获取本机的当前日期和时间,例如: ...