首页 > 其他分享 >test20231030

test20231030

时间:2023-10-30 15:38:06浏览次数:41  
标签:test20231030 Rand k4 k3 k2 ull 等于

rp 大爆发(别一次用完就行了)。

来晚了,差点没赶上考试。

先看 T1,看上去很像一个三维偏序问题,一看数据范围 \(n\le 3\times 10^7\),image

不行,再看一眼题目,发现一句话 请选手仔细观察给出的数据生成器,数据生成方式与解题强相关

阿这,原来是一道分析代码题。

看他数据生成器:

typedef unsigned long long ull;
int n,A,B,C,u[N],v[N],w[N];
inline ull Rand(ull &k1, ull &k2){
	ull k3 = k1, k4 = k2;
	k1 = k4;
	k3 ^= (k3 << 23);
	k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
	return k2 + k4;
} 
inline void GetData () {
	ull x, y;
 	cin >> n >> A >> B >> C >> x >> y;
	up(i,1,n){
 		u[i] = Rand(x, y) % A + 1;
 		v[i] = Rand(x, y) % B + 1;
 		w[i] = Rand(x, y) % C + 1;
 		if (Rand(x, y) % 3 == 0) u[i] = A;
 		if (Rand(x, y) % 3 == 0) v[i] = B;
 		if ((u[i] != A) && (v[i] != B)) w[i] = C;
 	} 
}

我们发现 \(u_i\),\(v_i\) 有三分之一的概率等于 \(A\),\(B\),\(w_i\) 有九分之四的概率等于 \(C\)。

而且 \(w_i\) 等于 \(C\) 时,\(u_i\),\(v_i\) 分别不等于 \(A\),\(B\)(大概率)。

然后我灵机一动,将操作分成两部分,第一种是 \(u_i\),\(v_i\) 分别等于 \(A\),\(B\),这个时候就只用找到\(\max w_i\) 就行了,另一部分是 \(w_i\) 等于 \(C\) 的,然后把 \(u_i\),\(w_i\) 撒在二维平面,一个点代表一个矩形,求矩形面积就行了,我开始还用单调栈,写一半发现因为矩形的高度具有单调性,所以只用记录后缀最大值扫一遍就行了。

但是这有一个问题,就是有一些点没有被统计,所以我们可以 把所有的 \(\max<w_i\le C\) 都进行一次如下操作~ ,桥豆麻袋,这样复杂度不就 \(n^2\) 了吗?

哎呀~,观察最大的样例,我们发现这个 \(\max C\),而且数据纯随机,自信。

复杂度 \(O(玄学)\)。


标签:test20231030,Rand,k4,k3,k2,ull,等于
From: https://www.cnblogs.com/LiQXing/p/17797966.html

相关文章