mxqz,关于 while 和 if 的常数
  • 板块学术版
  • 楼主NATURAL6
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/22 22:49
  • 上次更新2023/11/2 18:39:48
查看原帖
mxqz,关于 while 和 if 的常数
416521
NATURAL6楼主2023/9/22 22:49
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
inline int qread()
{
    int a=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){(a*=10)+=(ch^48);ch=getchar();}
    return a*f;
}
int T,n,k,tot,op,to[9000][10],f[9000],g[9000],l[1010],r[1010],ans;
inline void Mod(int &x)
{
    if(x>=mod)x-=mod;
    return ;
}
map< vector<int> , int >mp;
inline int dfs(vector<int>s)
{
    if(mp[s])return mp[s];
    int id=mp[s]=++tot;
    for(int i=0;i<=6;++i)
    {
        vector<int>cx(9,101);
        for(int j=0;j<=2;++j)for(int k=0,nd;k<=2;++k)
        {
            nd=s[j*3+k];
            if(nd==101)continue;
            for(int p=0,x;p<=2;++p)
            {
                x=i-j-k-p;
                x=x<0?-x:(x==1?1:0);
                for(int l=k;l<=min(2,k+j);++l)cx[l*3+p]=min(cx[l*3+p],nd+x);
            }
        }
        to[id][i]=dfs(cx);
    }
    return id;
}
int main() 
{
    vector<int>iS(9,101);iS[0]=0;
    dfs(iS);
	T=qread();
    while(T--)
    {
        n=qread();k=qread();ans=0;
        for(int i=1;i<=n;++i)l[i]=qread(),r[i]=qread();
        memset(f,0,sizeof(f));f[1]=1;
        for(int i=1;i<=n;++i)
        {
            memset(g,0,sizeof(g));
            for(int j=1;j<=8765;++j)
            {
                if(!f[j])continue;
                for(int k=0,x;k<=6;++k)
                {
                    x=0;
                    if(k<6)x=(l[i]<=k&&k<=r[i]);
                    else if(r[i]>=6)x=r[i]-max(6,l[i])+1;
                    Mod(g[to[j][k]]+=(1ll*f[j]*x)%mod);
                }
            }
            swap(f,g);
        }
        for(pair< vector<int> , int >i:mp)if(i.first[0]<=k)Mod(ans+=f[i.second]);
        if(k==1)
        {
            op=1;
            for(int i=1;i<=n;++i)op&=!l[i];
            if(op)--ans;
            if(n==3&&l[1]<=1&&r[1]>=1&&l[2]<=1&&r[2]>=1&&l[3]<=1&&r[3]>=1)--ans;
        }
        Mod(ans+=mod);
        printf("%d\n",ans);
    }
	return 0;
}

这份代码仅将第 15 行处的 if 换成 while 便会 TLE,在洛谷和 LOJ 都是这样,效率差距在两倍以上

但是在本地跑同样的数据,两份代码几乎没有效率的差距,这是为什么???qwq

2023/9/22 22:49
加载中...