浅谈离线分治算法: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的更多相关文章

  1. 【bzoj4604】The kth maximum number

    暴力 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> ...

  2. hdu 4006 The kth great number (优先队列)

    /********************************************************** 题目: The kth great number(HDU 4006) 链接: h ...

  3. 转:java.io.IOException: Exceeeded maximum number of redirects: 5 解决版本

    Jmeter运行的时候出现的重定向超过n次的问题: When trying to test a Silverlight application, I get the below error. Has ...

  4. 错误:maximum number of expressions in a list is 1000

    某一日发现这么如下这么一个错误  --> maximum number of expressions in a list is 1000 原因:因为SQL语句中用到了IN字句,而IN中的元素个数 ...

  5. 【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 ...

  6. 错误: 实例 "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 ...

  7. leetcode解题报告(15):Third Maximum Number

    描述 Given a non-empty array of integers, return the third maximum number in this array. If it does no ...

  8. 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.免费应用程序调试最 ...

  9. [LeetCode] Third Maximum Number 第三大的数

    Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...

随机推荐

  1. Qt5.2.1交叉编译,带tslib插件

    一: 源码下载地址: 1.1: 平台: 主机:ubuntu 14.04 开发板: cpu arm-cortex-a8,故而我在配置我的qmake.conf的时候填写的为armV7-a QT版本: qt ...

  2. 基于SSM的单点登陆02

    pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http: ...

  3. linux下查找文件或目录(which,whereis,locate,find)

    命令 查找对象 查找速度 备注   which 可执行文件  根据PATH变量的内容去寻找可执行文件  不同的PATH配置会有不一样的结果   whereis 程序名的搜索  根据数据库来寻找,速度快 ...

  4. PHP类的变量与成员,及其继承、访问与重写要注意的问题

    PHP的类及其实例: <?php ?>  后期静态绑定:为了避免子类重写静态属性后,使用继承来的方法仍然方法父类的静态属性,PHP5.3增加了一个新的语法,后期静态绑定,使用static关 ...

  5. get_called_class--后期静态绑定("Late Static Binding")类的名称

    get_called_class--后期静态绑定("Late Static Binding")类的名称 string get_called_class ( void ) 获取静态方 ...

  6. 同类型元素,只有一个被选中js

    <div class="wrap-box flex_row"> <div class="wrap-block"> <div cla ...

  7. c# 图片 与 BASE64 字符串 互相转换。

    using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System. ...

  8. JSP--常用指令

    1.JSP中的page指令: jsp中指令格式:<%@   指令名字    key=value    key=value   ......%> <%@ page language=& ...

  9. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  10. django学习笔记整理(2)django的路由系统

    创建一个属于你的django框架.django-admin startproject 框架名 打开你的django框架,你会发现里面还有一个和框架名同名的文件夹,那个文件夹就称为一个app. 创建了d ...