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 Shell编程 条件判断语法
if条件判断语句 单分支 if 条件语句 语法格式: if [条件判断式];then 程序 fi 或者 if [条件判断式] then 程序 fi 在使用单分支 if 条件查询时需要注意几点: if ...
- Android驱动开发全过程(有图有真相)
转:https://wenku.baidu.com/view/349bd159b7360b4c2e3f64b1.html
- [SCOI2005]超级格雷码
题目 BZOJ 洛谷 做法 爆搜真有意思 满足不重复且异或后仅一位为\(1\) 利用奇偶性交叉搜索(仅改变一位) My complete code #include<bits/stdc++.h& ...
- jquery图片过滤归类应用
在线演示 本地下载
- iOS下的WiFi开发
iOS下Wi-Fi开发需要添加依赖库SystemConfiguration.framework,在需要使用Wi-Fi信息的控制器下引入头文件#import <SystemConfiguratio ...
- unbunto关闭触摸屏
sudo rmmod psmouse 这个是禁用的 sudo modprobe psmouse 这个是启用的
- linux 安装mysql服务
1.检查是否已安装,grep的-i选项表示匹配时忽略大小写 rpm -qa|grep -i mysql *可见已经安装了库文件,应该先卸载,不然会出现覆盖错误.注意卸:载时使用了--nodeps选项, ...
- springboot 配置过滤器
能配置例外 先写配置文件类 FilterConfig.java package com.ty.tyzxtj.config; import javax.servlet.Filter; import or ...
- java学习小笔记(三.socket通信)【转】
三,socket通信1.http://blog.csdn.net/kongxx/article/details/7288896这个人写的关于socket通信不错,循序渐进式的讲解,用代码示例说明,运用 ...
- Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等
实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ...