关于昨晚CFdiv2的C题
  • 板块学术版
  • 楼主__vector__
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/3/21 13:07
  • 上次更新2023/10/28 06:01:45
查看原帖
关于昨晚CFdiv2的C题
507348
__vector__楼主2022/3/21 13:07

我不能明白,为什么我赛场上写的代码一直 TLE ,但是赛后卡了卡常就过了。。。。
想问一下是不是复杂度不一样。
这是我赛场上写的:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+5;
int a[maxn];
int t;
int n;
int sum;
map<int,int> im;
void dfs(int x)
{
    if(im[x]>0)
    {
        im[x]--;
        return;
    }
    if(x<=1)return;
    int sum2=x>>1;
    if(x&1)
    {
        dfs(sum2+1);
        dfs(sum2);
    }
    if(!(x&1))
    {
        dfs(sum2);
        dfs(sum2);
    }
}
signed main()
{
    scanf("%lld",&t);
    while(t--)
    {
        sum=0;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            sum+=a[i];
            im[a[i]]++;
        }
        dfs(sum);
        bool flag=1;
        for(int i=1;i<=n;i++)
        {
            if(im[a[i]]!=0)
            {
                printf("NO\n");
                flag=0;
                break;
            }
        }
        if(flag)printf("YES\n");
        for(int i=1;i<=n;i++)
        {
            im[a[i]]=0;
        }
    }
    return 0;
}

这是赛后在原来的基础上卡常的:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+5;
int a[maxn];
int t;
int n;
int sum;
map<int,int> im;
bool dfs(int x)
{
    if(im[x])
    {
        im[x]--;
        return 1;
    }
    if(x==1)return 0;
    int sum2=x>>1;
     return dfs(sum2+(x&1))&&dfs(sum2);
}
signed main()
{
    scanf("%lld",&t);
    while(t--)
    {
        sum=0;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            sum+=a[i];
            im[a[i]]++;
        }
        if(dfs(sum))printf("YES\n");
        else printf("NO\n");
        for(int i=1;i<=n;i++)
        {
            im[a[i]]=0;
        }
    }
    return 0;
}

它们的复杂度是否有区别?

2022/3/21 13:07
加载中...