这道题题意很好理解就是给一个n然后1—n的n个数;在分割时1.必须前面的set笔后面的set多一个元素或者两者都元素个数都相同;2.如果最后一有一个了那么就丢去(也就是拖出去送玫瑰了,嘻嘻);3.如果最后只有两个那么就把这两个相乘;4.每两个的乘积和其余两个的乘积相加求和就是ans了;
所以这道题很明显全局a[],ans然后递归,二叉树就可以搞定了:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int ans=0;
int n;
int a[maxn];
void F(int L,int R){
if(L==R)return;//如果只有一个元素,就丢掉,也就是不计算
else if(R-L==1){//如果只有两个元素了
int sum=1;
for(int i=L;i<=R;i++){
sum*=a[i];
// cout<<a[i]<<" ";
}
ans+=sum;
//cout<<endl;
return;
}
int mid=(L+R)/2;//递归区间,因为这里奇数偶数都可以用一个mid来计算,因为奇数/2小数部分自动丢弃
F(L,mid);//左边
F(mid+1,R);//右边,如果这里对线段树和二叉树的三种遍历方式很熟悉就很好理解了;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
a[i]=i;
}
F(1,n);
printf("%d\n",ans);
return 0;
}