ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「JOISC2016」俄罗斯套娃

2020-05-16 15:51:41  阅读:250  来源: 互联网

标签:node JOISC2016 return int res id 套娃 include 俄罗斯


传送门

我们可以把这些套娃抽象成平面直角坐标系里的点(不妨设 R 为横坐标,H 为纵坐标)。

然后我们离线,把每个询问也抽象成这样的点。

然后我们从右下至左上依次加点。

那么我们每次的询问就是询问该点右下区域内的答案。

考虑怎么计算:类似网络流最小割的,我们不难发现,一个区域内点的答案就是这些点可以构成的最长的一条链,满足这条链的形态是从左上到右下的。

可以自己画图理解一下。

然后拿一个树状数组就可以轻松维护了。

参考代码:

#include <algorithm>
#include <cstdio>
using namespace std;

const int _ = 4e5 + 5;

int n, q, x, y, X[_], c[_], ans[_];
struct node { int x, y, id; } t[_];

void update(int x, int v) { while (x < _) c[x] = max(c[x], v), x += x & -x; }
int query(int x) { int res = 0; while (x) res = max(res, c[x]), x -= x & -x; return res; }

int cmp(node a, node b) { 
	if (a.x != b.x) return a.x > b.x;
	if (a.y != b.y) return a.y < b.y;
	return a.id < b.id;
}

int main() {
	scanf("%d %d", &n, &q);
	for (int i = 1; i <= n + q; ++i)
		scanf("%d %d", &x, &y), X[++X[0]] = y, t[i] = (node) { x, y, i > n ? i - n : 0 };
	sort(t + 1, t + n + q + 1, cmp);
	sort(X + 1, X + X[0] + 1);
	X[0] = unique(X + 1, X + X[0] + 1) - X - 1;
	for (int i = 1; i <= n + q; ++i)
		t[i].y = lower_bound(X + 1, X + X[0] + 1, t[i].y) - X;
	for (int i = 1; i <= n + q; ++i) {
		if (t[i].id) 
			ans[t[i].id] = query(t[i].y);
		else
			x = query(t[i].y), update(t[i].y, x + 1);
	}
	for (int i = 1; i <= q; ++i) printf("%d\n", ans[i]);
	return 0;
}

标签:node,JOISC2016,return,int,res,id,套娃,include,俄罗斯
来源: https://www.cnblogs.com/zsbzsb/p/12900816.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有