【题解】CF1157E:Minimum Array

只谈情不闲聊 提交于 2019-11-28 19:30:55

原题传送门
刚刚自己研究出了一个小技巧
对于每一个aia_i,找nain-a_i是否存在,不存在就找nai+1,nai+2n-a_i+1,n-a_i+2…以此类推
想到用链表去实现一个查询的操作,但是一个一个找还是太慢,这让我想到了并查集
并查集的路径压缩的思路正好可以用在这里优化链表的查找
Code:

#include <bits/stdc++.h>
#define maxn 200010
using namespace std;
int n, a[maxn], cnt[maxn], nxt[maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int get(int x){ return cnt[x] ? x : nxt[x] = get(nxt[x]); }

int main(){
	n = read();
	for (int i = 1; i <= n; ++i) a[i] = read();
	for (int i = 1; i <= n; ++i){
		int x = read();
		++cnt[x];
	}
	for (int i = 0; i < n; ++i) nxt[i] = i + 1; nxt[n] = 0;
	for (int i = 1; i <= n; ++i){
		int x = get(n - a[i]);
		--cnt[x]; printf("%d ", (a[i] + x) % n);
	}
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!