两份代码,一份ans加longlong就能a,一个ans加long却30
查看原帖
两份代码,一份ans加longlong就能a,一个ans加long却30
759274
Stevehim楼主2023/3/26 21:14

RT

这个是不加long过的

#include <bits/stdc++.h>
using namespace std;
int n, p[10000005], lc[10000005], rc[10000005], fa[10000005];
long long lans = 0, rans = 0;

template<typename T>inline void read(T &ff) {
	T rr = 1;
	ff = 0;
	register char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-')
			rr = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		ff = (ff << 1) + (ff << 3) + (ch ^ 48);
		ch = getchar();
	}
	ff *= rr;
}

int main() {
	read(n);
	for (int i = 1; i <= n; i++) {
		read(p[i]);
		fa[i] = i - 1;
		while (p[fa[i]] > p[i])
			fa[i] = fa[fa[i]];
		int modify = rc[fa[i]];
		rc[fa[i]] = i;
		fa[modify] = i;
		lc[i] = modify;
	}
	for (int i = 1; i <= n; i++) {
		lans ^= 1ll * i * (1 + lc[i]);
		rans ^= 1ll * i * (1 + rc[i]);
	}
	printf("%lld %lld\n", lans, rans);
	return 0;
}

这是我的,只有三十

#include <bits/stdc++.h>
#define maxn 10000005
using namespace std;
//本代码给出的是小根的笛卡尔树
int n;
int a[maxn];
int root; //存取根节点
int ls[maxn]; //存左孩子
int rs[maxn]; //存右孩子
vector<long long> v; //单调栈用

template<typename T>inline void read(T &ff) {
	T rr = 1;
	ff = 0;
	register char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-')
			rr = -1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		ff = (ff << 1) + (ff << 3) + (ch ^ 48);
		ch = getchar();
	}
	ff *= rr;
}

void build() {
	for (register int i = 1; i <= n; i++) {
		long long j = 0;
		while (v.size() && a[v.back()] > a[i]) { //丹钓战操作
			j = v.back();
			v.pop_back();
		}
		if (!v.size())
			root = i;
		else
			rs[v.back()] = i;
		ls[i] = j;
		v.push_back(i);
	}
}

int main() {
//	freopen("1.in", "r", stdin);
	read(n);
	for (register int i = 1; i <= n; i++) {
		read(a[i]);
	}
	build();
	long long ans1 = 0;
	long long ans2 = 0;
	for (register int i = 1; i <= n; i++) {
		ans1 ^= 1ll * (i * (ls[i] + 1));
		ans2 ^= 1ll * (i * (rs[i] + 1));
	}
	printf("%lld %lld", ans1, ans2);
	return 0;
}
2023/3/26 21:14
加载中...