1007B逆序对(二维数点问题 窗口星星)

news/2024/10/8 16:25:00/

http://cplusoj.com/d/senior/p/SS241007B

显然这题是一个二维数点问题,我们要求在确定 [ l , r ] [l,r] [l,r] i i i 个数的最大值:

  • l < i < r l<i<r l<i<r
  • a r < i < a l a_r<i<a_l ar<i<al

考场上想了各种扫描线,cdq,kdtree,可持久化,树套树都想不起这个套路是啥,这其实是一个经典的套路,窗口的星星

矩阵和点的相互转化

而在此题,我们也就看每个 i i i 能作用哪些 [ l , r ] [l,r] [l,r],我们把这个覆盖区域变成一个矩形,那么就是求最多矩形覆盖的有多少,这个可以就是裸的二维数点

而为了让它张成一个矩形,我们发现只需要维护前后的上升/下降序列作为关键点即可

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL#define debug(...) fprintf(stdout, ##__VA_ARGS__)#define debag(...) fprintf(stderr, ##__VA_ARGS__)
#else#define debug(...) void(0)#define debag(...) void(0)
#endif
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//#define M
//#define mo
#define N 1000010
int n, m, i, j, k, T;
int a[N], x, y, s1, s2; 
int lmx[N], rmx[N], lst, ans; int find_L(int i) {int l = 1, r = lmx[i], mid; while(l < r) {mid = (l + r) >> 1; if(a[lmx[mid]] >= a[i]) r = mid; else l = mid + 1; }return l; 
}int find_R(int i) {int l = rmx[i], r = n, mid; while(l < r) {mid = (l + r + 1) >> 1; if(a[rmx[mid]] <= a[i]) l = mid; else r = mid - 1; }return r; 
}namespace Scan {struct Segment_tree {#define ls (k << 1)#define rs (k << 1 | 1) #define mid ((l + r) >> 1)int tag[N << 2], mx[N << 2]; void push_down(int k) {tag[ls] += tag[k]; tag[rs] += tag[k]; mx[ls] += tag[k]; mx[rs] += tag[k]; tag[k] = 0; }void add(int k, int l, int r, int x, int y, int z) {if(l >= x && r <= y) return tag[k] += z, mx[k] += z, void(); push_down(k); if(x <= mid) add(ls, l, mid, x, y, z); if(y >= mid + 1) add(rs, mid + 1, r, x, y, z); mx[k] = max(mx[ls], mx[rs]); }#undef ls#undef rs#undef mid}Seg;struct node { int l, r, v; };vector<node>G[N]; void insert(int lx, int ly, int rx, int ry) {
//		debug("Polygon\n%lld %lld\n%lld %lld\n%lld %lld\n%lld %lld\n", 
//			lx, rx, lx, ry + 1, ly + 1, ry + 1, ly + 1, rx); debug("%lld %lld %lld %lld\n", lx, ly, rx, ry); G[rx].pb({lx, ly, 1}); G[ry + 1].pb({lx, ly, -1}); }int run() {int i, ans = 0; for(i = 1; i <= n; ++i) {for(auto t : G[i]) {Seg.add(1, 1, n, t.l, t.r, t.v); }ans = max(ans, Seg.mx[1]); }return ans; }
}signed main()
{freopen("inverse.in", "r", stdin);freopen("inverse.out", "w", stdout);
//	srand(time(NULL));
//	T = read();
//	while(T--) {
//
//	}n = read(); for(i = 1; i <= n; ++i) a[i] = read(); for(i = 1, lst = 0; i <= n; ++i) {if(a[i] > lst) lst = a[i], lmx[i] = i; else lmx[i] = lmx[i - 1]; }for(i = n, lst = 1e9; i >= 1; --i) {if(a[i] < lst) lst = a[i], rmx[i] = i; else rmx[i] = rmx[i + 1]; }for(i = 1; i <= n; ++i) debug("%lld ", lmx[i]); debug("\n"); for(i = 1; i <= n; ++i) debug("%lld ", rmx[i]); debug("\n"); for(i = 1; i <= n; ++i) {int L = find_L(i), R = find_R(i); Scan :: insert(L, lmx[i], rmx[i], R); }ans = Scan :: run(); printf("%lld", 2 * ans - 3); return 0;
}

http://www.ppmy.cn/news/1536220.html

相关文章

浅谈新能源电动汽车充电站建设与运营模式分析

摘要&#xff1a;电动汽车是当前新能源汽车中重要的组成部分&#xff0c;具有广阔的发展前景&#xff0c;能够实现“以电代油”&#xff0c;与传统的燃油汽车相比&#xff0c;电动汽车在噪音及废气排放量方面相对较少&#xff0c;具有节能环保的显著特点。而电动汽车充电站则是…

sql练习:不及格课程数大于2的学生的平均成绩及其排名

有学生每科科目成绩&#xff0c;求不及格课程数大于2的学生的平均成绩及其成绩平均值后所在的排名。 CREATE TABLE t6_scores ( sid bigint COMMENT 学生ID, cid bigint COMMENT 课程ID, score bigint COMMENT 得分 ) COMMENT 用户课程分数; -- 插入数据 insert into t6_scores…

无人机培训机构配套教学无人机技术详解

无人机培训机构配套的教学无人机技术&#xff0c;是一个涉及多学科交叉、技术密集型的领域。以下是对该技术的详细解析&#xff1a; 一、无人机技术概述 无人机技术是一个涵盖航空工程、电子工程、计算机科学、材料科学和人工智能等多个学科的综合性领域。其核心在于实现无人…

Linux安装virtualenvwrapper

workon 是 virtualenvwrapper 工具的一部分&#xff0c;用于管理 Python 虚拟环境。如果你看到这个错误&#xff0c;可能是因为 virtualenvwrapper 没有正确安装或配置。 解决步骤 安装 virtualenv 和 virtualenvwrapper 首先&#xff0c;确保你已经安装了 virtualenv 和 virt…

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline&#xff0c;通过frp让外网访问内部web网站服务&#xff0c;让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器&#xff1a;192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…

基于大数据的二手房价数据可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【软件推荐】Linux上使用的文本内容搜索工具--recollgui _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【软件推荐】一款Linux上使用的文本内容搜索工具–recollgui | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在Linux系统上使用RecollGUI的文章。Recoll是一款功能强大的全文检索工具&#xff0c;它可以帮助用户快…

黑马JavaWeb开发跟学(十一)SpringBootWeb案例

黑马JavaWeb开发跟学十一.SpringBootWeb案例 SpringBootWeb案例1. 新增员工1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 功能测试1.6 前后端联调 2. 文件上传2.1 简介2.2 本地存储2.3 阿里云OSS2.3.1 准备2.3.2 入门2.3.3 集成 3. 修改员工3.1 查询回显3.1.1 接口文档3.1…