浅谈离线分治算法: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. Linux Shell编程 条件判断语法

    if条件判断语句 单分支 if 条件语句 语法格式: if [条件判断式];then 程序 fi 或者 if [条件判断式] then 程序 fi 在使用单分支 if 条件查询时需要注意几点: if ...

  2. Android驱动开发全过程(有图有真相)

    转:https://wenku.baidu.com/view/349bd159b7360b4c2e3f64b1.html

  3. [SCOI2005]超级格雷码

    题目 BZOJ 洛谷 做法 爆搜真有意思 满足不重复且异或后仅一位为\(1\) 利用奇偶性交叉搜索(仅改变一位) My complete code #include<bits/stdc++.h& ...

  4. jquery图片过滤归类应用

    在线演示 本地下载

  5. iOS下的WiFi开发

    iOS下Wi-Fi开发需要添加依赖库SystemConfiguration.framework,在需要使用Wi-Fi信息的控制器下引入头文件#import <SystemConfiguratio ...

  6. unbunto关闭触摸屏

    sudo rmmod psmouse 这个是禁用的 sudo modprobe psmouse 这个是启用的

  7. linux 安装mysql服务

    1.检查是否已安装,grep的-i选项表示匹配时忽略大小写 rpm -qa|grep -i mysql *可见已经安装了库文件,应该先卸载,不然会出现覆盖错误.注意卸:载时使用了--nodeps选项, ...

  8. springboot 配置过滤器

    能配置例外 先写配置文件类 FilterConfig.java package com.ty.tyzxtj.config; import javax.servlet.Filter; import or ...

  9. java学习小笔记(三.socket通信)【转】

    三,socket通信1.http://blog.csdn.net/kongxx/article/details/7288896这个人写的关于socket通信不错,循序渐进式的讲解,用代码示例说明,运用 ...

  10. Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等

    实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ...