假算求叉
  • 板块学术版
  • 楼主myee
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/2/24 19:14
  • 上次更新2023/10/28 07:49:51
查看原帖
假算求叉
105050
myee楼主2022/2/24 19:14

就是昨晚 CF 1D

我赛后把赛时打的假算完善了一下,然后过了???

就是这发提交

由于前面有巨大长码头,这里放一个简要代码。

#include <bits/stdc++.h>
typedef long long llt;
typedef unsigned uint;typedef unsigned long long ullt;
typedef bool bol;typedef char chr;typedef void voi;
typedef double dbl;
template<typename T>bol _max(T&a,T b){return(a<b)?a=b,true:false;}
template<typename T>bol _min(T&a,T b){return(b<a)?a=b,true:false;}
template<typename T>T power(T base,T index,T mod){return((index<=1)?(index?base:1):(power(base*base%mod,index>>1,mod)*power(base,index&1,mod)))%mod;}
template<typename T>T lowbit(T n){return n&-n;}
template<typename T>T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<typename T>T lcm(T a,T b){return(a!=0||b!=0)?a/gcd(a,b)*b:(T)0;}
template<typename T>T exgcd(T a,T b,T&x,T&y){if(!b)return y=0,x=1,a;T ans=exgcd(b,a%b,y,x);y-=a/b*x;return ans;}
uint W[100005],A[100005][5],Ans[6][6];
std::vector<uint>QAQ;
typedef std::pair<uint,uint>Pair;
Pair P[6][6];
uint m;
uint lcs(uint a,uint b)
{
    for(uint i=0;i<m;i++)for(uint j=0;j<m;j++)
        if(A[a][i]==A[b][j])Ans[i+1][j+1]=Ans[i][j]+1,P[i+1][j+1]=Pair(i,j);
        else Ans[i+1][j+1]=std::max(Ans[i+1][j],Ans[i][j+1]),P[i+1][j+1]=Ans[i+1][j]>Ans[i][j+1]?Pair(i+1,j):Pair(i,j+1);
    QAQ.clear();
    Pair now=Pair(m,m);
    while(now!=Pair())
    {
        if(P[now.first][now.second].first<now.first&&P[now.first][now.second].second<now.second)QAQ.push_back(A[a][now.first]);
        now=P[now.first][now.second];
    }
    return Ans[m][m];
}
uint Id[100005],Now[100005],cnt=0;
const uint Lim[]={0,1,5,15,40,100};
int main()
{
    uint n;uint ans=-1;
    scanf("%u%u",&n,&m);
    for(uint i=0;i<n;i++)
    {
        for(uint j=0;j<m;j++)scanf("%u",A[i]+j);
        scanf("%u",W+i);
        std::sort(A[i],A[i]+m);
        Id[i]=i;
    }
    std::sort(Id,Id+n,[&](uint a,uint b){return W[a]<W[b];});
    for(uint i=0;i<n;i++)
    {
        uint p=Id[i];
        std::map<std::vector<uint>,uint>LCNT;
        for(uint j=0;j<cnt;j++)
        {
            uint c=lcs(p,Now[j]);
            LCNT[QAQ]++;
            if(!c)_min(ans,W[p]+W[Now[j]]);
        }
        bol b=true;
        for(auto p:LCNT)if(p.second>Lim[m-p.first.size()]){b=false;break;}
        if(b)Now[cnt++]=p;
    }
    printf("%d\n",(int)ans);
    return 0;
}

2022/2/24 19:14
加载中...