ICode9

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

CF1093G Multidimensional Queries

2022-07-14 22:33:39  阅读:156  来源: 互联网

标签:ch CF1093G int void mid read Queries isdigit Multidimensional


\(\text{Code}\)

分析在 2022暑假集训

#include <cstdio>
#include <iostream>
#define IN inline
using namespace std;

const int N = 2e5 + 5, INF = 0x3f3f3f3f;
int n, d, a[N][5];

IN void read(int &x) {
	x = 0; char ch = getchar(); int f = 1;
	for(; !isdigit(ch); f = (ch == '-' ? -1 : f), ch = getchar());
	for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
	x *= f;
}

struct node{
	int a[33][2];
	IN node() {for(int S = 0; S < (1 << d); S++) a[S][0] = -INF, a[S][1] = INF;}
	IN void merge(node b) {
		for(int S = 0; S < (1 << d); S++)
			a[S][0] = max(a[S][0], b.a[S][0]), a[S][1] = min(a[S][1], b.a[S][1]);
	}
};
	
struct SegmentTree {
	#define ls (p << 1)
	#define rs (ls | 1)
	
	int Mx[N << 2][33], Mn[N << 2][33], tg[33][5];
	IN void Init() {
		for(int S = 0; S < (1 << d); S++)
			for(int i = 0; i < d; i++) if ((S >> i) & 1) tg[S][i] = 1; else tg[S][i] = -1;
	}
	
	IN void pushup(int p) {
		for(int S = 0; S < (1 << d); S++)
			Mx[p][S] = max(Mx[ls][S], Mx[rs][S]), Mn[p][S] = min(Mn[ls][S], Mn[rs][S]);
	}
	void build(int p, int l, int r) {
		if (l == r) {
			for(int S = 0; S < (1 << d); S++) {
				Mx[p][S] = Mn[p][S] = 0;
				for(int i = 0; i < 5; i++)
					Mx[p][S] += tg[S][i] * a[l][i], Mn[p][S] += tg[S][i] * a[l][i];
			}
			return;
		}
		int mid = l + r >> 1;
		build(ls, l, mid), build(rs, mid + 1, r), pushup(p);
	}
	
	void Modify(int p, int l, int r, int x) {
		if (l == r) {
			for(int S = 0; S < (1 << d); S++) {
				Mx[p][S] = Mn[p][S] = 0;
				for(int i = 0; i < 5; i++)
					Mx[p][S] += tg[S][i] * a[x][i], Mn[p][S] += tg[S][i] * a[x][i];
			}
			return;
		}
		int mid = l + r >> 1;
		if (x <= mid) Modify(ls, l, mid, x);
		else Modify(rs, mid + 1, r, x);
		pushup(p);
	}
	node Query(int p, int l, int r, int x, int y) {
		node res;
		if (x <= l && r <= y) {
			for(int S = 0; S < (1 << d); S++)
				res.a[S][0] = max(res.a[S][0], Mx[p][S]), res.a[S][1] = min(res.a[S][1], Mn[p][S]);
			return res;
		}
		int mid = l + r >> 1;
		if (x <= mid) res = Query(ls, l, mid, x, y);
		if (y > mid) res.merge(Query(rs, mid + 1, r, x, y));
		return res;
	}
}T;

int main() {
	read(n), read(d);
	for(int i = 1; i <= n; i++)
		for(int j = 0; j < d; j++) read(a[i][j]);
	int m;
	T.Init(), T.build(1, 1, n), read(m);
	for(int op, l, r; m; --m) {
		read(op), read(l);
		if (op == 1) {
			for(int i = 0; i < d; i++) read(a[l][i]);
			T.Modify(1, 1, n, l);
		}
		else {
			read(r); int ans = 0; node k = T.Query(1, 1, n, l, r);
			for(int S = 0; S < (1 << d); S++) ans = max(ans, k.a[S][0] - k.a[S][1]);
			printf("%d\n", ans);
		}
	}
}

标签:ch,CF1093G,int,void,mid,read,Queries,isdigit,Multidimensional
来源: https://www.cnblogs.com/leiyuanze/p/16479607.html

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

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

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

ICode9版权所有