我不能明白,为什么我赛场上写的代码一直 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;
}
它们的复杂度是否有区别?