2023.3.17 闲话

joke3579 不屑于称扫描线为扫描线而称之为顺着扫,orz .

早在若干年前就在多项式时间复杂度内解决 NP-Hard 问题的 joke3579 肆意锐评 —— 人类是不可能解决 NP-Hard 问题的!

我要给 joke3579 今日闲话引流:闲话 23.3.17 .

btw,不用 Kruskal 重构树的连通块重标号(封装):

struct Relabeler
{
	int nxt[N], lst[N], id[N], fa[N];
	int get(int x){return x == fa[x] ? x : fa[x] = get(fa[x]);}
	inline void merge(int u, int v)
	{
		u = get(u); v = get(v);
		if (u == v) return ;
		nxt[lst[u]] = v; lst[u] = lst[v];
		fa[v] = u;
	}
	inline void relabel(int n)
	{
		static bool uok[N];
		for (int i=1; i<=n; i++) uok[nxt[i]] = true;
		int cc = 0;
		for (int i=1; i<=n; i++)
		{
			if (uok[i]) continue;
			int u = i; id[u] = ++cc;
			while (~nxt[u]){u = nxt[u]; id[u] = ++cc;}
		}
	}
	inline pii range(const int& u){int _ = get(u); return make_pair(id[_], id[lst[_]]);}
	inline int at(const int& u) const {return id[u];}
	inline void clear(int n){iota(fa, fa+1+n, 0); memset(nxt, -1, sizeof nxt); iota(lst, lst+1+n, 0);}
	Relabeler(){clear(N-1);}
};

UPD. 看 SyadouHayami 博客选中的背景色是 #66CCFF 一类的东西(因为有背景干扰我拾色器没拾到准的),于是我就把我选中的背景色改成了 #39C5BB,不过如果刻意的去注意这一点确实不很漂亮,不知道为什么,不过平时看着也没有那么不漂亮啦 .


两个点 \(X(x_1,x_2,\cdots,x_k)\)\(Y(y_1,y_2,\cdots,y_k)\) 的 Manhattan 距离:\(\displaystyle d(X,Y)=\sum_{i=1}^k|x_i-y_i|\) .

一个 Trick:拆 \(|x|=\max\{x,-x\}\) .

这样的话 \(k\) 个绝对值就可以改成 \(2^k\) 个 max .

Luogu1648 看守

\(d\) 维空间 \(n\) 个点,求曼哈顿距离最大的两个点的曼哈顿距离 .

\(2\le n\le10^6\)\(d\le4\) .

暴力拆对于每种情况找出最大最小直接减 \(\Theta(n2^d)\) 可以通过 .

CF1093G Multidimensional Queries

维护 \(n\)\(k\) 维点支持单点修改区间查上面那个题的问题 .

\(1\le n,q\le 2\times 10^5\)\(1\le k\le 5\),6s .

暴力拆对于每种情况开 \(2^k\) 个线段树按上面问题维护即可 .

时间复杂度 \(\Theta(2^k(n+q)\log n)\) 可以通过 .

还挺有意思的,不过看起来难扩展 .

是不是有点水了 .

posted @ 2023-03-17 17:29  Jijidawang  阅读(65)  评论(0编辑  收藏  举报
😅​