有没有强一点的数据
查看原帖
有没有强一点的数据
401215
xieziheng楼主2022/10/30 17:10

我太弱了,连暴力都写不对。

#include <bits/stdc++.h>
#define il inline
using namespace std;
typedef long long ll;
il ll read(){
    ll x=0,c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=x*10+c-48,c=getchar();
    return x;
}
void write(ll x){
    if(x>9) write(x/10);
    putchar(x%10+48);
}
il ll cmax(ll x,ll y){return x>y?x:y;}
const int N=2505,inf=1e9,T=2e8;
int n,m,k,dis[N][N],cnt;
ll s[N],ans;
struct node{
    int p,val;
    node(){p=val=0;}
    node(int a,int b){p=a,val=b;}
    bool operator<(const node &a) const {
        if(val==a.val) return p<a.p;
        return val>a.val;
    }
};
vector<int> e[N];
il void add(int x,int y){e[x].push_back(y);}
priority_queue<node> q;
int x,y,z,d;
il void dij(int s){
    while(q.size()) q.pop();
    for(int i=1;i<=n;++i) dis[s][i]=inf;
    q.push(node(s,0));dis[s][s]=0;
    while(q.size()){
        node cur=q.top();q.pop();
        x=cur.p,d=cur.val;
        if(dis[s][x]!=d) continue;
        for(int i=0;i<e[x].size();++i){
            y=e[x][i];
            if(dis[s][y]>d+1){
                dis[s][y]=d+1;
                q.push(node(y,dis[s][y]));
            }
        }
    }
}
int main() {
    freopen("holiday.in","r",stdin);
    freopen("holiday.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int i=2;i<=n;++i) scanf("%lld",&s[i]);
    for(int i=1;i<=m;++i){
        scanf("%d%d",&x,&y);
        add(x,y),add(y,x);
    }
    for(int i=1;i<=n;++i) dij(i);
    if(n<=300){
        for(int i=1;i<=n;++i){
            for(int j=i+1;j<=n;++j){
                for(int p=j+1;p<=n;++p){
                    for(int q=p+1;q<=n;++q){
                        if(dis[1][i]<=k+1 && dis[i][j]<=k+1 && dis[j][p]<=k+1 && dis[p][q]<=k+1 && dis[q][1]<=k+1)
                            ans=cmax(ans,s[i]+s[j]+s[p]+s[q]);
                    }
                }
            }
        }
        printf("%lld",ans);
        return 0;
    }
    if(k==0){
        for(int i=0;i<e[1].size();++i){
            x=e[1][i];
            for(int j=0;j<e[x].size();++j){
                y=e[x][j];
                for(int p=0;p<e[y].size();++p){
                    z=e[y][p];
                    for(int q=0;q<e[z].size();++q){
                        d=e[z][q];
                        if(dis[1][d]==1) ans=cmax(ans,s[x]+s[y]+s[z]+s[d]);
                    }
                }
            }
        }
        printf("%lld",ans);
        return 0;
    }
    for(int i=1;i<=n;++i){
        for(int j=i+1;j<=n;++j){
            for(int p=j+1;p<=n;++p){
                for(int q=p+1;q<=n;++q){
                    if(dis[1][i]<=k+1 && dis[i][j]<=k+1 && dis[j][p]<=k+1 && dis[p][q]<=k+1 && dis[q][1]<=k+1)
                        ans=cmax(ans,s[i]+s[j]+s[p]+s[q]);
                    ++cnt;
                    if(cnt>T) break;
                }
            }
        }
    }
    printf("%lld",ans);
    return 0;
}

洛谷上50,但infoj上只有20。CCF 的数据会很水吗?

2022/10/30 17:10
加载中...