警示后人
查看原帖
警示后人
1379742
Xiaohaoyu1020明天见_xj楼主2024/7/24 18:53

众所周知,不开long long见祖宗,如果你Wa on 8且和我一样一身反骨把斜率比较写成乘法的形式,那么你的long long被这组数据卡炸了

以下为警戒代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+10;
struct edge{
    int v,w;
};
vector<edge> bian[N];
struct node{
    int dis,idx;
    friend bool operator<(node a,node b){
        return a.dis>b.dis;
    }
};
priority_queue<node> pque;
bool vis[N];
int dis[N];
void dij(){
    memset(vis,0,sizeof(vis));
    pque.push((node) {dis[1],1});
    while(!pque.empty()){
        node no = pque.top();
        pque.pop();
        if(vis[no.idx]){
            continue;
        }
        vis[no.idx] = true;
        for(edge e : bian[no.idx]){
            if(dis[e.v] > dis[no.idx]+e.w){
                dis[e.v] = dis[no.idx]+e.w;
                pque.push((node) {dis[no.idx]+e.w,e.v});
            }
        }
    }

}
deque<int> que;
int f[N],X[N],Y[N];
signed main(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i = 1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        bian[u].push_back((edge){v,w});
        bian[v].push_back((edge){u,w});
    }
    memset(dis,0x3f,sizeof(dis));
    dis[1] = 0;
    dij();
/*
dp[i][j] = min(dp[i][j],dp[x][j-1]+(i-x)*(i-x))
dp[i][j] -i*i= dp[x][j-1]+x*x -2*i*x;
b = dp[i][j] - i*i
y = dp[x][j-1] + x*x
k = +2i
x = x;
*/
 
    for(int b = 1;b<=k;b++){
        que.clear();
        for(int i = 1;i<=n;i++){
            f[i] = dis[i];
        }
        for(int i = 1;i<=n;i++){
            X[i] = i;
            Y[i] = f[i] + i*i;
            while(que.size()>1 && (Y[que[que.size()-1]] - Y[que[que.size()-2]])*(X[i] - X[que[que.size()-1]]) > (Y[i] - Y[que[que.size()-1]])*(X[que[que.size()-1]] - X[que[que.size()-2]])){
                que.pop_back();
            }
            que.push_back(i);
        }
        for(int i = 1;i<=n;i++){
            while(que.size()>1 && (Y[que[0]] - Y[que[1]]) > 2*i*(X[que[0]] - X[que[1]])){
                que.pop_front();
            }
            int x = que.front();
            if(!x){
                continue;
            }
            if(f[i] > f[x] + (i - x)*(i - x)){
                dis[i] = f[x] + (i - x)*(i - x);
                pque.push((node){dis[i],i});
            }
        }
        dij();
    }
    for(int i = 1;i<=n;i++){
        cout<<dis[i]<<' ';
    }
}

神仙错法硬控我一下午。。。。

2024/7/24 18:53
加载中...