30pts求调QwQ
查看原帖
30pts求调QwQ
1255488
__notTrueLight__楼主2025/7/28 16:12
#include<iostream>
using namespace std;
struct tre{
//下标,权值,父结点编号,左儿子
	long long id,w,f,l,r;
}dkrt[10000007];//笛卡尔树
long long n,lis[10000007];
long long ans=0,bns=0;//两个答案
template<typename T>
inline void read(T &x){
	T w=1;x=0; 
	char c=getchar(); 
	while(!isdigit(c)){if(c=='-'){w=-1;}c=getchar();}  
	while(isdigit(c)){x=x*10+(c-'0');c=getchar();} 
	x=x*w;
}//快读
void bld(){
	for(long long i=1,k;i<=n;i++){
		k=i-1;dkrt[i].w=lis[i];dkrt[i].id=i; 
		while(dkrt[k].w>lis[i]){k=dkrt[k].f;}
		dkrt[i].l=dkrt[k].r;
		dkrt[dkrt[i].l].f=i;
		dkrt[k].r=i;
		dkrt[i].f=k;
	}return ; 
}//建树
int main(){
	read(n);
	for(long long i=1;i<=n;i++){
		read(lis[i]);
	}
	dkrt[0]=(tre){0,0,0,0,0};
	bld();
	for(long long i=1;i<=n;i++){
		ans^=i*(dkrt[i].l+1);
		bns^=i*(dkrt[i].r+1);
	}printf("%d %d",ans,bns);
	return/*结束*/0;
}
2025/7/28 16:12
加载中...