月赛2B求助
  • 板块学术版
  • 楼主Hisaishi_Kanade
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/8/14 18:24
  • 上次更新2023/10/27 15:27:09
查看原帖
月赛2B求助
575994
Hisaishi_Kanade楼主2022/8/14 18:24

Subtask 1 过不去

#include <stdio.h>

const int MAXN = 10000001; // Set a right value according to your solution.
int n, a[MAXN], f[MAXN];
namespace Generator {
#define swap(a,b) a^=b^=a^=b
unsigned long long k1, k2;
int thres;

inline unsigned long long xorShift128Plus() {
    unsigned long long k3 = k1, k4 = k2;
    k1 = k4, k3 ^= (k3 << 23), k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
    return k2 + k4;
}

inline void generate() {
    for (int i = 1; i <= n; ++i) {
        a[i] = xorShift128Plus() % thres;
    }
}

} // namespace Generator.

int main() {
	int i;
	unsigned long long ans(0);
    scanf("%d", &n);
    scanf("%llu %llu %d", &Generator::k1, &Generator::k2, &Generator::thres);
    Generator::generate();
    // Now array a[1..n] represents the sequence A in the statement.
	f[n]=n;
	for(i=n-1;i;--i)
		f[i]=a[i]<a[f[i+1]]?i:f[i+1];
	for(i=1;i<=n;){
		if(i==f[i]){
			++i;
			continue;
		}else{
			swap(a[i],a[f[i]]);
			i=f[i]+1;
		}
	}
	for(i=1;i<=n;++i)
		ans+=1ull*i*a[i];
	printf("%llu",ans);
    return 0;
}
2022/8/14 18:24
加载中...