| 5396 | 2023-05-09 14:12:52 | mraron | Autópálya infláció | cpp17 | Accepted 100/100 | 1.291s | 7484 KiB |
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cassert>
#include<array>
using namespace std;
using ll = long long;
#define xx first
#define yy second
const int MAXN=3001;
const int mod=1e9+7;
int n,m;
vector<pair<int,int>> adj[MAXN];
vector<array<int, 4>> par[MAXN];
int get_len(int x, int y) {
int res=0;
while(x!=par[x][y][0]) {
array<int, 4> p=par[x][y];
x=p[0];
y=p[1];
res++;
}
return res;
}
ll compare(int a, int b, int w1, int l1, int x, int y, int w2, int l2) {
ll bal=0;
int i=l1, j=l2;
while(i>0 || j>0) {
array<int, 4> p1=par[a][b],
p2=par[x][y];
if(i>j) {
bal=(bal-w1)*2-p1[2];
w1=0;
a=p1[0];
b=p1[1];
i--;
}else if(i<j) {
bal=(bal+w2)*2+p2[2];
w2=0;
x=p2[0];
y=p2[1];
j--;
}else {
bal=(bal-w1+w2)*2-p1[2]+p2[2];
w1=w2=0;
a=p1[0];
b=p1[1];
x=p2[0];
y=p2[1];
i--;j--;
}
if(abs(bal)>(ll)2e9) {
return bal;
}
}
bal-=w1;bal+=w2;
return bal;
}
int get_ans(int x, int y) {
int res=0;
while(x!=par[x][y][0]) {
array<int, 4> p=par[x][y];
res=(res*2%mod+p[2])%mod;
x=p[0];
y=p[1];
}
return res;
}
struct state {
int x;
int pa, pb, pw;
int len;
bool operator<(const state& masik) const {
ll b=compare(pa, pb, pw, len, masik.pa, masik.pb, masik.pw, masik.len);
if(b>0) return true;
if(b<0) return false;
return len<masik.len;
}
bool operator>(const state& masik) const {
return !(*this<masik);
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=0;i<m;++i) {
int a,b,c;
cin>>a>>b>>c;
adj[a].push_back({b,c});
adj[b].push_back({a,c});
}
vector<int> ans(n+1, -1);
priority_queue<state, vector<state>, greater<state>> pq;
pq.push(state{1, 1, 0, 0, 0});
while(!pq.empty()) {
state curr=pq.top();
pq.pop();
//cerr<<curr.x<<" "<<curr.pa<<" "<<curr.pb<<" "<<curr.pw<<"\n";
int x=curr.x;
if(!par[x].empty() && par[x].back()[3]<=curr.len) continue ;
par[x].push_back({curr.pa, curr.pb, curr.pw, curr.len});
if(par[x].size()==1) {
ans[x]=get_ans(x, 0);
}
for(auto i:adj[x]) {
pq.push(state{i.xx, x, (int)par[x].size()-1, i.yy, curr.len+1});
}
}
int sum=0;
for(int i=2;i<=n;++i) {
sum+=par[i].size();
cout<<ans[i]<<"\n";
}
cerr<<double(sum)/n<<"\n";
}| Subtask | Sum | Test | Verdict | Time | Memory | ||
|---|---|---|---|---|---|---|---|
| subtask1 | 0/0 | ||||||
| 1 | Accepted | 3ms | 2028 KiB | ||||
| 2 | Accepted | 26ms | 3192 KiB | ||||
| subtask2 | 8/8 | ||||||
| 3 | Accepted | 9ms | 3036 KiB | ||||
| 4 | Accepted | 19ms | 2984 KiB | ||||
| 5 | Accepted | 12ms | 3108 KiB | ||||
| 6 | Accepted | 8ms | 3500 KiB | ||||
| 7 | Accepted | 52ms | 3504 KiB | ||||
| subtask3 | 15/15 | ||||||
| 8 | Accepted | 3ms | 3388 KiB | ||||
| 9 | Accepted | 3ms | 3712 KiB | ||||
| 10 | Accepted | 3ms | 3672 KiB | ||||
| 11 | Accepted | 3ms | 3664 KiB | ||||
| 12 | Accepted | 3ms | 3672 KiB | ||||
| 13 | Accepted | 3ms | 4008 KiB | ||||
| 14 | Accepted | 3ms | 4148 KiB | ||||
| 15 | Accepted | 3ms | 4096 KiB | ||||
| 16 | Accepted | 3ms | 4356 KiB | ||||
| 17 | Accepted | 3ms | 4440 KiB | ||||
| 18 | Accepted | 3ms | 4384 KiB | ||||
| subtask4 | 34/34 | ||||||
| 19 | Accepted | 16ms | 5204 KiB | ||||
| 20 | Accepted | 50ms | 5140 KiB | ||||
| 21 | Accepted | 57ms | 5320 KiB | ||||
| 22 | Accepted | 30ms | 5240 KiB | ||||
| 23 | Accepted | 29ms | 5284 KiB | ||||
| 24 | Accepted | 107ms | 4956 KiB | ||||
| 25 | Accepted | 12ms | 5512 KiB | ||||
| 26 | Accepted | 9ms | 5912 KiB | ||||
| 27 | Accepted | 98ms | 5236 KiB | ||||
| 28 | Accepted | 21ms | 5176 KiB | ||||
| 29 | Accepted | 26ms | 5200 KiB | ||||
| 30 | Accepted | 64ms | 5164 KiB | ||||
| 31 | Accepted | 54ms | 5300 KiB | ||||
| 32 | Accepted | 173ms | 5380 KiB | ||||
| 33 | Accepted | 177ms | 5576 KiB | ||||
| subtask5 | 21/21 | ||||||
| 34 | Accepted | 4ms | 5060 KiB | ||||
| 35 | Accepted | 8ms | 5196 KiB | ||||
| 36 | Accepted | 7ms | 5388 KiB | ||||
| 37 | Accepted | 7ms | 5520 KiB | ||||
| 38 | Accepted | 6ms | 5492 KiB | ||||
| 39 | Accepted | 6ms | 5272 KiB | ||||
| 40 | Accepted | 70ms | 5144 KiB | ||||
| 41 | Accepted | 59ms | 5088 KiB | ||||
| 42 | Accepted | 4ms | 4908 KiB | ||||
| 43 | Accepted | 4ms | 4848 KiB | ||||
| 44 | Accepted | 4ms | 5144 KiB | ||||
| 45 | Accepted | 4ms | 5188 KiB | ||||
| 46 | Accepted | 4ms | 5060 KiB | ||||
| 47 | Accepted | 4ms | 5104 KiB | ||||
| 48 | Accepted | 4ms | 5076 KiB | ||||
| 49 | Accepted | 4ms | 5100 KiB | ||||
| subtask6 | 22/22 | ||||||
| 50 | Accepted | 27ms | 5572 KiB | ||||
| 51 | Accepted | 25ms | 5796 KiB | ||||
| 52 | Accepted | 26ms | 6196 KiB | ||||
| 53 | Accepted | 21ms | 6120 KiB | ||||
| 54 | Accepted | 13ms | 6228 KiB | ||||
| 55 | Accepted | 13ms | 6360 KiB | ||||
| 56 | Accepted | 1.291s | 7484 KiB | ||||
| 57 | Accepted | 836ms | 7436 KiB | ||||
| 58 | Accepted | 8ms | 5628 KiB | ||||
| 59 | Accepted | 14ms | 5788 KiB | ||||
| 60 | Accepted | 17ms | 5784 KiB | ||||
| 61 | Accepted | 20ms | 5704 KiB | ||||
| 62 | Accepted | 20ms | 5692 KiB | ||||
| 63 | Accepted | 14ms | 5812 KiB | ||||
| 64 | Accepted | 71ms | 5764 KiB | ||||
| 65 | Accepted | 71ms | 5768 KiB | ||||
| 66 | Accepted | 223ms | 5780 KiB | ||||