为什么将unsigned long long改成__int128后样例全错却过了
查看原帖
为什么将unsigned long long改成__int128后样例全错却过了
984450
zhoujinhong楼主2024/7/11 11:33
#include<bits/stdc++.h>
using namespace std;
#define int __int128
#define lowbit(x) x&-x
#define maxx(a,b) a>b?a:b
const int N=1000010,MOD=9712176;
int n,a[N],tmp[N],tot,ans,tree1[N],tree2[N],f1[N],f2[N],dp1[N],dp2[N];
struct node{
	int l,r,cnt;
}mnlen[N],mxlen[N];
stack<int>stk;
void pre_work(){
	for(int i=1;i<=n;i++){
		tot=0;
		while(stk.size() && a[stk.top()]>a[i]){
			mnlen[stk.top()].r+=tot;
			tot+=(1+tmp[stk.top()]);
			stk.pop();
		}
		tmp[i]=tot;
		mnlen[i].l+=tmp[i];
		stk.push(i);
	}
	tot=0;
	while(stk.size()){
		mnlen[stk.top()].r+=tot;
		tot+=(1+tmp[stk.top()]);
		stk.pop();	
	}
	for(int i=1;i<=n;i++){
		tot=0;
		while(stk.size() && a[stk.top()]<a[i]){
			mxlen[stk.top()].r+=tot;
			tot+=(1+tmp[stk.top()]);
			stk.pop();
		}
		tmp[i]=tot;
		mxlen[i].l+=tmp[i];
		stk.push(i);
	}
	tot=0;
	while(stk.size()){
		mxlen[stk.top()].r+=tot;
		tot+=(1+tmp[stk.top()]);
		stk.pop();	
	}
	for(int i=1;i<=n;i++){
		mnlen[i].l=maxx(mnlen[i].l,1);
		mnlen[i].r=maxx(mnlen[i].r,1);
		mnlen[i].cnt=mnlen[i].l*mnlen[i].r;
		mxlen[i].l=maxx(mxlen[i].l,1);
		mxlen[i].r=maxx(mxlen[i].r,1);
		mxlen[i].cnt=mxlen[i].l*mxlen[i].r;
	}
}
void add1(int x,int sum){
	while(x<=n) tree1[x]=tree1[x]+sum,x+=lowbit(x);
}
void add2(int x,int sum){
	while(x<=n) tree2[x]=tree2[x]+sum,x+=lowbit(x);
}
int query1(int x){
	int sum=0;
	while(x) sum=sum+tree1[x],x-=lowbit(x);
	return sum;
}
int query2(int x){
	int sum=0;
	while(x) sum=sum+tree2[x],x-=lowbit(x);
	return sum;
}
signed main(){
	scanf("%lu",&n);
	for(int i=1;i<=n;i++){
		mnlen[i].l=mnlen[i].r=mxlen[i].l=mxlen[i].r=1;
		scanf("%lu",&a[i]);
	}
	pre_work();
	for(int i=1;i<=n;i++){
		f1[i]=query1(a[i]-1);
		dp1[i]=query2(a[i]-1);
		add1(a[i],a[i]*mxlen[i].cnt);
		add2(a[i],mxlen[i].cnt);
	}
	for(int i=1;i<=n;i++){
		tree1[i]=tree2[i]=0;
	}
	for(int i=n;i>=1;i--){
		f2[i]=query1(a[i]-1);
		dp2[i]=query2(a[i]-1);
		add1(a[i],a[i]*mxlen[i].cnt);
		add2(a[i],mxlen[i].cnt);
	}
	for(int i=1;i<=n;i++){
		ans=(ans+(mnlen[i].cnt*((f1[i]*f2[i])%MOD))%MOD)%MOD;
		ans=(ans+(((a[i]*a[i]*mnlen[i].cnt)%MOD)*((dp1[i]*dp2[i])%MOD)%MOD))%MOD;
		ans=(ans-((a[i]*mnlen[i].cnt)%MOD*(f1[i]*dp2[i])%MOD)%MOD+MOD)%MOD;
		ans=(ans-((a[i]*mnlen[i].cnt)%MOD*(f2[i]*dp1[i])%MOD)%MOD+MOD)%MOD;
	}
	printf("%lu",ans);
	return 0;
}
2024/7/11 11:33
加载中...