rp 大爆发(别一次用完就行了)。
来晚了,差点没赶上考试。
先看 T1,看上去很像一个三维偏序问题,一看数据范围 \(n\le 3\times 10^7\),
不行,再看一眼题目,发现一句话 请选手仔细观察给出的数据生成器,数据生成方式与解题强相关
。
阿这,原来是一道分析代码题。
看他数据生成器:
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