这题到底哪里要开ll啊
查看原帖
这题到底哪里要开ll啊
292029
幽理家的男人楼主2021/3/2 21:09
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
inline int read() {
	int X = 0, flag = 0;
	char ch = 0;
	while (!isdigit(ch))
		flag |= ch == '-', ch = getchar();
	while (isdigit(ch))
		X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
	return flag ? -X : X;
}
int n,num,z[maxn],cur,top=1,si[maxn],ch[maxn][2];
int main(){
	n=read();
	for(int i=1;i<=n;++i) si[i]=read();
	z[++cur]=1;
	for(int i=2;i<=n;++i){
		int temp=-1;
		while(cur&&si[z[cur]]>si[i]){
			cur--;
			temp=z[cur]; 
		}
		if(!cur){//i变为根 
			ch[i][0]=z[cur+1];
		}
		else if(temp==-1){//i变成右儿子 
			ch[z[cur]][1]=i;
		}
		else{//temp记录第一个小于i的节点 
			ch[temp][1]=i;
			ch[i][0]=z[cur+1]; 
		} 
		z[++cur]=i;
	}
	long long ans1=0,ans2=0;//开long long啊QAQ
	for(int i=1;i<=n;++i){
		ans1^=(long long)(i*(ch[i][0]+1));
		ans2^=(long long)(i*(ch[i][1]+1));
	}
	cout<<ans1<<' '<<ans2;
	return 0;
} 

把int全都define成了long long然后a了,可是这题不是只有在计算答案时会溢出么,为什么只有30分呢?

2021/3/2 21:09
加载中...