ICode9

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

【YBTOJ】【Luogu P1527】[国家集训队]矩阵乘法

2021-06-12 14:01:55  阅读:164  来源: 互联网

标签:10 P1527 int YBTOJ ll while && Luogu getchar


链接:

洛谷

题目大意:

二维区间第 \(k\) 小。

正文:

就是区间第 \(k\) 小的升维版,详见 区间第 \(k\) 小

代码:

const int N = 510 + 10, M = 6e4 + 10, P = 25e4 + 10;

inline ll Read()
{
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
	return x * f;
}

int n, m, tot;
ll t[N][N], ans[M];

void modify(int x, int y, ll val) 
{
	for (int i = x; i <= n; i += i & -i) 
		for (int j = y; j <= n; j += j & -j) 
			t[i][j] += val;
} 
int Query(int x, int y) 
{
	int ans = 0;
	for (int i = x; i; i -= i & -i) 
		for (int j = y; j; j -= j & -j) 
			ans += t[i][j]; 
	return ans;
} 

int query(int Lx, int Ly, int Rx, int Ry)
{
	return Query(Rx, Ry) - Query(Lx - 1, Ry) - Query(Rx, Ly - 1) + Query(Lx - 1, Ly - 1);
}

struct node
{
	int Lx, Ly, Rx, Ry, k, id;
	node(){	}
	node(int a, int b, int c, int d, int val, int i) 
	{
		Lx = a, Ly = b, Rx = c, Ry = d, k = val, id = i;
	} 
}q[P + M], q1[P + M], q2[P + M];

void Solve (int l, int r, int L, int R)
{
	if (l > r || L > R) return ; 
	if(l == r)
	{
		for (int i = L; i <= R; i++) if(q[i].id) ans[q[i].id] = l;
		return ;
	}
	int mid = l + r >> 1;
	int n1 = 0, n2 = 0;
	for (int i = L; i <= R; i ++)
		if (q[i].id) 
		{
			ll tmp = query(q[i].Lx, q[i].Ly, q[i].Rx, q[i].Ry);
			if (q[i].k <= tmp) q1[++n1] = q[i];
			else q[i].k -= tmp, q2[++n2] = q[i];
		}
		else
			if (q[i].k <= mid) modify(q[i].Lx, q[i].Ly, 1), q1[++n1] = q[i];
			else q2[++n2] = q[i];
	for (int i = 1; i <= n1; i++) if(!q1[i].id) modify(q1[i].Lx, q1[i].Ly, -1);
	
	for (int i = 1; i <= n1; i++) q[L + i - 1] = q1[i];
	for (int i = 1; i <= n2; i++) q[L + n1 + i - 1] = q2[i];
	
	Solve(l, mid, L, L + n1 - 1), Solve(mid + 1, r, L + n1, R);
}

int main()
{
	n = Read(), m = Read();
	for (int i = 1; i <= n; i++) 
		for (int j = 1; j <= n; j++)
			q[++tot] = node(i, j, 0, 0, Read(), 0);
	for (int i = 1; i <= m; i++) 
		q[++tot].Lx = Read(), q[tot].Ly = Read(), q[tot].Rx = Read(), q[tot].Ry = Read(), 
		q[tot].k = Read(), q[tot].id = i;
	Solve(0, 1e9, 1, tot);
	for (int i = 1; i <= m; i++) printf ("%lld\n", ans[i]);
	return 0;
}

标签:10,P1527,int,YBTOJ,ll,while,&&,Luogu,getchar
来源: https://www.cnblogs.com/GJY-JURUO/p/14878142.html

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

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

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

ICode9版权所有