全部评论 9

  • 我运行出来是RE,建议你那边看一下是有数组开小了还是输入装错了,方便的话写注释会很清晰

    2024-12-03 来自 江苏

    1
  • 666骗我提交

    2024-11-23 来自 广东

    1
  • 6

    2024-02-03 来自 浙江

    1
  • 另一种
    #include<cstdio>
    #include<iomanip>
    #include<cstring>
    #define N 30005
    #define M (1<<18)+5
    #define ll long long
    #define mod 1000000007
    #define O4 inline attribute((always_inline))
    using namespace std;
    int las=1,cnt[M][7],tr[M][7];
    int n,k,now,he[N][7],su[N][7],vis[M];
    const int Mxdt=180000;
    O4 char gc() {
    static char buf[Mxdt],*p1=buf,p2=buf;
    return p1p2&&(p2=(p1=buf)+fread(buf,1,Mxdt,stdin),p1p2)?EOF:p1++;
    }
    O4 int read() {
    int res=0,bj=0;
    char ch=gc();
    while(ch<'0'||ch>'9')bj|=(ch=='-'),ch=gc();
    while(ch>='0'&&ch<='9')res=(res<<3)+(res<<1)+(ch^48),ch=gc();
    return bj?-res:res;
    }
    O4 int Mod(int x) {
    return x<=mod?x:x-mod;
    }
    struct at {
    ll val;
    int cnt;
    at() {
    val=1e18,cnt=0;
    } at(ll _v,int _c):val(_v),cnt(_c) {}
    };
    O4 at operator (at a,at b) {
    return (a.val!=b.val)?(a.val<b.val?a:b):(at(a.val,Mod(a.cnt+b.cnt)));
    }
    O4 at operator +(at a,ll b) {
    return at(a.val+b,a.cnt);
    }
    struct Node {
    pair<at,bool>val[M];
    int s[M],top;
    Node() {}
    O4 void clear() {
    for(int i=1; i<=top; ++i)val[s[i]].second=0;
    top=0;
    }
    at &operator[](int x) {
    if(!val[x].second)val[x]=make_pair(at(),1),s[++top]=x;
    return val[x].first;
    }
    } dp[2];
    O4 void Init(ll val=0) {
    for(int st=0,s=0,ct=0; st<(1<<k-1); dp[now][s]=at(val,1),++st,s=ct=val=0)
    for(int t=1; t<k; ++t)((st&(1<<t-1))?val+=he[0][t]:++ct),s|=ct<<(t
    3);
    }
    O4 int Get(int s,int x) {
    return (s>>3
    x)&7;
    }
    O4 int Change(int s,int x,int y) {
    return s((Get(s,x)y)<<3
    x);
    }
    O4 void Work(int s,int x) {
    for(int i=0; i<k; ++i)
    if(Get(s,i)x&&++cnt[s][x]>1)return;
    }
    O4 void CSH(int s) {
    if(vis[s])return;
    static int cnt,tmp,id[7];
    memset(id,-1,sizeof(id)),cnt=0,tmp=s;
    for(int i=0,x; i<k; i)x=Get(s,i),s=Change(s,i,(~id[x])?id[x]:id[x]=cnt);
    return vis[tmp]=s,void();
    }
    O4 void Merge(int s,int x) {
    int t1=Get(s,x-1),t2=Get(s,x),tmp=s;
    if(t1
    t2)return tr[tmp][x]=s,void();
    for(int i=0; i<k; ++i)if(Get(s,i)==t2)s=Change(s,i,t1);
    tr[tmp][x]=s;
    }
    O4 void Calc(int s) {
    static int vis[M]= {0};

    1周前 来自 广东

    0
  • 2026-03-09 来自 天津

    0
  • 优化时间复杂度通常涉及减少冗余计算、使用更高效的数据结构或算法,以及避免不必要的操作。以下是一些可能的优化策略:

    减少重复计算:在代码中,有些函数如normal, cipher, bitcount, nbit, cbit, 和 merge可能会被多次调用,并且每次调用都进行相同的计算。可以考虑缓存这些函数的结果,以避免重复计算。

    优化数据结构:当前代码使用了map<vector<int>, int>来存储状态,这可能导致较高的内存消耗和查找时间。可以考虑使用其他数据结构,如哈希表(例如unordered_map),以提高效率。

    并行处理:如果问题允许,可以尝试将独立的任务并行化处理。例如,在初始化状态时,可以并行地生成不同的状态。

    剪枝技术:在搜索过程中,如果发现某个分支不可能产生更好的结果,可以提前终止该分支的搜索。

    循环展开和代码优化:检查循环中的操作,看是否有可能通过改变循环结构或使用更有效的算法来减少迭代次数。

    使用更快的I/O操作:标准输入输出流相对较慢,特别是在处理大量数据时。可以考虑使用更快的I/O方法,如scanf和printf,或者使用缓冲区。

    分析热点代码:使用性能分析工具找出程序中耗时最多的部分,并针对这些热点进行优化。

    算法改进:重新考虑和设计算法逻辑,寻找更优的解决方案。例如,在某些情况下,动态规划可能不是解决问题的最佳选择,而贪心算法或其他算法可能更有效。

    减少递归深度:递归函数可能会导致大量的栈调用,尝试将其转换为迭代形式,或者使用尾递归优化。

    编译优化:确保编译器优化选项已开启,以便充分利用现代CPU的指令集和缓存机制。

    通过实施上述策略之一或组合,可以显著提高程序的性能和效率。

    该内容由AI生成

    2024-12-04 来自 浙江

    0
  • 你看我提交记录

    2024-12-04 来自 浙江

    0
  • 666

    2024-03-17 来自 广东

    0
  • 6

    2024-02-03 来自 广东

    0

热门讨论