求教手写高精卡常
查看原帖
求教手写高精卡常
592380
David_Mercury楼主2023/4/25 17:46

rt

孩子调了几天人要傻了 qwq

#include<bits/stdc++.h>
#define rei register int
using namespace std;

const int SIZE = 40;

struct GJ{
	long long data[SIZE];
	
	inline void clear(){
		for(rei i = data[0]; i >= 0; --i)	data[i] = 0;
		return;
	}
	
	inline void output(){
		for(rei i = data[0]; i >= 1; --i)	putchar(48^data[i]);
		return;
	}
	
	inline void operator = (const long long &x){
		data[0] = 0;
		if(x == 0)							{data[0] = 1; return;}
		for(long long i = x; i; i /= 10)	data[++data[0]] = i%10;
		return;
	}
	
} ans, tmp, pro;

inline GJ operator * (const GJ &x, const long long &y){
	pro.clear();
	pro.data[0] = x.data[0];
	for(rei i = 1; i <= pro.data[0]; ++i){
		pro.data[i] += x.data[i]*y;
		if(pro.data[i] < 10)	continue;
		pro.data[i+1] += pro.data[i]/10;
		pro.data[i] %= 10;
	}
	while(pro.data[pro.data[0]+1]){
		pro.data[pro.data[0]+1] += pro.data[pro.data[0]]/10;
		pro.data[pro.data[0]] %= 10;
		++pro.data[0];
	}
	while(pro.data[0] > 1 and !pro.data[pro.data[0]])	--pro.data[0];
	return pro;
}

inline void operator += (GJ &x, const GJ &y){
	x.data[0] = max(x.data[0], y.data[0]);
	for(rei i = 1; i <= x.data[0]; ++i){
		x.data[i] += y.data[i];
		if(x.data[i] < 10)	continue;
		x.data[i+1] += x.data[i]/10;
		x.data[i] %= 10;
	}
	if(x.data[x.data[0]+1])	++x.data[0];
	return;
}






const int MAXN = 4e7+5;
const long long Mod = 1<<30;
int n, tp, pre[MAXN], l, r, dq[MAXN*2];
long long sum[MAXN];

//struct Deque{
//	int l, r
//	inline void clear()				{l = 4e7+1, r = 4e7; return;}
//	inline int front()				{return data[l];}
//	inline int back()				{return data[r];}
//	inline void pop_front()			{++l; return;}
//	inline void pop_back()			{--r; return;}
//	inline void push_front(int x)	{data[--l] = x; return;}
//	inline void push_back(int x)	{data[++r] = x; return;}
//	inline bool empty()				{return l > r;}
//} dq;
//deque<int>	dq;

inline long long calc(int x){
	return -(sum[x]<<1)+sum[pre[x]];	//(sum[x]-sum[y])-(sum[y]-sum[pre[y]])
}

inline int read(){
	rei x = 0; int f = 1;
	register char c = getchar();
	while(!isdigit(c))	{if(c == '-') f = -1;		c = getchar();}
	while(isdigit(c))	{x = (x<<3)+(x<<1)+(c^48);	c = getchar();}
	return x*f;
}

inline void input(){
	n = read(), tp = read();
	if(tp == 0)	{for(rei i = 1; i <= n; i++) sum[i] = sum[i-1]+read(); return;}
	int x, y, z, m;
	x = read(), y = read(), z = read(), sum[1] = read(), sum[2] = read(), m = read();
	for(rei i = 3; i <= n; ++i)	sum[i] = (x*sum[i-1]+y*sum[i-2]+z)%Mod;
	for(rei i = 1, j = 1; i <= m; ++i){
		int pi = read(), li = read(), ri = read();
		for(; j <= pi; ++j)	sum[j] = sum[j-1]+sum[j]%(ri-li+1)+li;
	}
	return;
}

int main(){
//	freopen("P5665_23.in", "r", stdin);
	input();
	l = 4e7+1, r = 4e7; dq[++r] = 0;
	for(rei i = 1; i <= n; ++i){
		while(l < r and -calc(dq[r-1]) <= sum[i])	--r;
		if(l <= r)	pre[i] = dq[r];
		while(l <= r and calc(i) >= calc(dq[l]))	++l;
		dq[--l] = i;
	}
	for(rei i = n; i; i = pre[i]){
		tmp = sum[i]-sum[pre[i]];
		ans += tmp*(sum[i]-sum[pre[i]]);
	}
	ans.output();
	
	return 0;
}
2023/4/25 17:46
加载中...