本文分享了VK Cup 2017 Round 3的比赛经历,重点解析了806D - Perishable Roads和806E - Blog Post Rating两道题目。对于Perishable Roads,通过转化问题为求最短路,利用Dijkstra算法求解。在Blog Post Rating题目中,通过挖掘数据特性,采用set和线段树进行分类讨论和状态维护,强调了解题过程中思维的细致和模型简化的重要性。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(register int i = l ; i <= r ; i++)
#define repd(i,r,l) for(register int i = r ; i >= l ; i--)
#define rvc(i,S) for(register int i = 0 ; i < (int)S.size() ; i++)
#define rvcd(i,S) for(register int i = ((int)S.size()) - 1 ; i >= 0 ; i--)
#define fore(i,x)for (register int i = head[x] ; i ; i = e[i].next)
#define forup(i,l,r) for (register int i = l ; i <= r ; i += lowbit(i))
#define fordown(i,id) for (register int i = id ; i ; i -= lowbit(i))
#define pb push_back
#define prev prev_
#define stack stack_
#define mp make_pair
#define fi first
#define se second
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pr;
const int inf = 1e9 + 10;
const int N = 6e6 + 10;
const int maxn = 3020;
const ll mod = 1e9 + 7;
int n,e[maxn][maxn],mn[maxn],allmn;
int vis[maxn];
ll ans;
ll dis[maxn];
void dij(){
dis[0] = 1e18;
while ( 1 ){
int x = 0;
rep(i,1,n) if ( !vis[i] && dis[i] < dis[x] ) x = i;
if ( !x ) break;
vis[x] = 1;
rep(i,1,n){
if ( x == i ) continue;
dis[i] = min(dis[i],dis[x] + e[x][i]);
}
}
}
int main(){
scanf("%d",&n);
rep(i,1,n){
rep(j,i + 1,n){
scanf("%d",&e[i][j]) , e[j][i] = e[i][j];
}
}
allmn = inf;
rep(i,1,n){
mn[i] = inf;
rep(j,1,n){
if ( i == j ) continue;
mn[i] = min(mn[i],e[i][j]);
}
allmn = min(allmn,mn[i]);
}
rep(i,1,n){
dis[i] = (mn[i] - allmn) * 2;
rep(j,1,n){
if ( i != j ) e[i][j] -= allmn;
}
}
dij();
rep(i,1,n) printf("%lld\n",dis[i] + (ll)allmn * (n - 1));
}