超时求教!
查看原帖
超时求教!
1179604
ZEs0楼主2024/8/3 17:51

写的dfs疯狂超时/(ㄒoㄒ)/~~

用了set排除重复计算的元素;

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define lowbit(x) x&(-x)
#define N 200005
#define M 1005
#define MOD 1000000007

int t;
int n;
int ans ;
unordered_set<int>ck;
int finds(int a,int b){
    return a*(a-1)/2+b+1;
}
void ddfs(int i ,int k){
    if (k==1){
        return;
    }
    if (i==0){
        int lst = 0;
        int tis = finds(k-1,lst);
        if (ck.count(tis)<=0){
            ck.insert(tis);
            ans+=tis*tis;
        }
        ddfs(lst,k-1);
    }
    else if (i == k-1){
        int lst = k-2;
        int ls =finds(k-1,lst);
        if (ck.count(ls)<=0){
            ck.insert(ls);
            ans+=ls*ls;
            ddfs(lst,k-1);
        }
    }
    else{
        int lst = i;
        int ls =finds(k-1,lst);
        if(ck.count(ls)<=0){
            ck.insert(ls);
            ans+=ls*ls;
            ddfs(lst,k-1);
        }
        lst=i-1;
        ls=finds(k-1,lst);
        if(ck.count(ls)<=0){
            ck.insert(ls);
            ans+=ls*ls;
            ddfs(lst,k-1);
        }
    }

}

void solve()
{

    ans=0;
    ck.clear();
    cin>>n;
//    if (n==1000000){
//        cout<<58116199242129511<<endl;
//        return;
//    }
    int p=1;
    int r =1;
    if (n ==1){
        cout<<1<<endl;
        return;
    }
    for (int i = 1; i < 2024; ++i) {
        p+=i;
        r++;
        if (p+i+1>n){
            break;
        }
    }
    ck.insert(n);

    ans+=n*n;
    ddfs(n-p,r);
    cout<<ans<<endl;

}

signed main() {

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

2024/8/3 17:51
加载中...