QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#259184 | #7790. 最短路求和 | zhouhuanyi | 10 | 42ms | 61836kb | C++14 | 5.8kb | 2023-11-20 18:03:43 | 2023-11-20 18:03:43 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
#define N 200000
#define M 8000
using namespace std;
const int inf=(int)(1e9);
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
struct reads
{
int num,data,snum;
};
struct node
{
int x,y;
bool operator < (const node &t)const
{
return x!=t.x?x<t.x:y<t.y;
}
};
node st[N+1];
struct rds
{
int num,data;
bool operator < (const rds &t)const
{
return data>t.data;
}
};
int n,m,lg[N+1],tfa[N+1],num[N+1],length,leng,smz[N+1],tong[N+1],fa[N+1],nt[N+1],nt2[N+1],rst[N+1],sz[N+1],szt[N+1],dque[N+1],top,dque2[N+1],top2;
long long depth[N+1],delta[N+1],delta2[N+1],ans,dis[M+1][M+1],W[N+1],wdelta[N+1];
bool used[N+1],vis[N+1],vst[N+1],dst[N+1],vist[N+1];
vector<reads>E[N+1];
vector<reads>ES[N+1];
vector<int>v[N+1];
vector<long long>cnt[N+1];
vector<long long>cnt2[N+1];
map<node,int>p;
void add(int x,int y,int z,int w)
{
E[x].push_back((reads){y,z,w}),E[y].push_back((reads){x,z,w});
return;
}
void add2(int x,int y,int z)
{
ES[x].push_back((reads){y,z}),ES[y].push_back((reads){x,z});
return;
}
void dfs(int x)
{
used[x]=1;
for (int i=0;i<E[x].size();++i)
if (!used[E[x][i].num])
depth[E[x][i].num]=depth[x]+E[x][i].data,fa[E[x][i].num]=x,vis[E[x][i].snum]=1,dfs(E[x][i].num);
return;
}
void dfs2(int x)
{
int cnt=0,y=0;
dst[x]=vst[x];
for (int i=0;i<E[x].size();++i)
if (fa[E[x][i].num]==x)
{
dfs2(E[x][i].num),dst[x]|=dst[E[x][i].num],cnt+=dst[E[x][i].num];
if (dst[E[x][i].num]) y=E[x][i].num;
}
if (cnt>=2) vst[x]=1;
else nt[x]=nt[y];
if (vst[x]) nt[x]=x;
return;
}
void dfs3(int x)
{
if (dst[x]) rst[x]=x;
if (vst[x]) nt2[x]=x;
for (int i=0;i<E[x].size();++i)
if (fa[E[x][i].num]==x)
{
if (dst[E[x][i].num]) nt2[E[x][i].num]=nt2[x];
rst[E[x][i].num]=rst[x],dfs3(E[x][i].num);
}
return;
}
void dijkstra(int x)
{
int top;
priority_queue<rds>q;
for (int i=1;i<=length;++i) dis[x][i]=inf,used[i]=0;
q.push((rds){x,0}),dis[x][x]=0;
while (!q.empty())
{
top=q.top().num,q.pop();
if (used[top]) continue;
used[top]=1;
for (int i=0;i<ES[top].size();++i)
if (dis[x][ES[top][i].num]>dis[x][top]+ES[top][i].data)
dis[x][ES[top][i].num]=dis[x][top]+ES[top][i].data,q.push((rds){ES[top][i].num,dis[x][ES[top][i].num]});
}
return;
}
bool cmp(int x,int y)
{
return W[x]<W[y];
}
void dfs4(int x)
{
dque[++top]=x,vist[x]=szt[x]=1;
for (int i=0;i<E[x].size();++i)
if (!vist[E[x][i].num]&&nt[x]==nt[E[x][i].num]&&nt2[x]==nt2[E[x][i].num])
tfa[E[x][i].num]=E[x][i].data,dfs4(E[x][i].num),szt[x]+=szt[E[x][i].num];
return;
}
bool cmp2(int x,int y)
{
return depth[x]<depth[y];
}
int main()
{
int x,y,z,ps,cnts;
long long d1,d2,d3,d4,ds,ds1,ds2,ds3,res;
for (int i=2;i<=N;++i) lg[i]=lg[i>>1]+1;
n=read(),m=read();
for (int i=1;i<=m;++i) x=read(),y=read(),z=read(),add(x,y,z,i);
dfs(1);
for (int i=1;i<=n;++i)
for (int j=0;j<E[i].size();++j)
if (!vis[E[i][j].snum])
vst[i]=1;
dfs2(1),dfs3(1);
for (int i=1;i<=n;++i)
{
nt[i]=nt[rst[i]],nt2[i]=nt2[rst[i]];
if (nt[i]) delta[i]=depth[nt[i]]-depth[rst[i]]+depth[i]-depth[rst[i]];
if (nt2[i]) delta2[i]=depth[i]-depth[nt2[i]];
}
for (int i=1;i<=n;++i)
if (vst[i])
tong[++length]=i,num[i]=length;
for (int i=1;i<=n;++i)
for (int j=0;j<E[i].size();++j)
if (num[i]<num[E[i][j].num]&&!vis[E[i][j].snum])
add2(num[i],num[E[i][j].num],E[i][j].data);
for (int i=1;i<=length;++i)
if (fa[tong[i]])
add2(i,num[nt2[fa[tong[i]]]],depth[tong[i]]-depth[nt2[fa[tong[i]]]]);
for (int i=0;i<=length;++i) dis[0][i]=dis[i][0]=inf;
for (int i=1;i<=length;++i) dijkstra(i);
for (int i=1;i<=n;++i)
{
if (p.find((node){nt[i],nt2[i]})==p.end()) st[++leng]=(node){num[nt[i]],num[nt2[i]]},p[(node){nt[i],nt2[i]}]=leng;
v[p[(node){nt[i],nt2[i]}]].push_back(i);
}
for (int i=1;i<=n;++i) W[i]=delta2[i]-delta[i];
for (int i=1;i<=leng;++i)
{
sort(v[i].begin(),v[i].end(),cmp),cnt[i].resize(v[i].size()),cnt2[i].resize(v[i].size());
for (int j=0;j<v[i].size();++j) cnt[i][j]=(j?cnt[i][j-1]:0)+delta[v[i][j]];
for (int j=(int)(v[i].size())-1;j>=0;--j) cnt2[i][j]=(j+1!=v[i].size()?cnt2[i][j+1]:0)+delta2[v[i][j]];
}
for (int j=1;j<=leng;++j)
if (!v[j].empty())
{
for (int k=0;k<v[j].size();++k) wdelta[k]=W[v[j][k]];
for (int i=1;i<=j-1;++i)
if (!v[i].empty())
{
d1=dis[st[i].x][st[j].x],d2=dis[st[i].x][st[j].y],d3=dis[st[i].y][st[j].x],d4=dis[st[i].y][st[j].y];
for (int k=0;k<v[i].size();++k)
{
ds1=min(delta[v[i][k]]+d1,delta2[v[i][k]]+d3),ds2=min(delta[v[i][k]]+d2,delta2[v[i][k]]+d4),ds3=ds2-ds1,ps=lower_bound(wdelta,wdelta+v[j].size(),ds3)-wdelta-1;
if (ps!=-1) ans+=1ll*ds1*(ps+1)+cnt[j][ps];
if (ps+1!=v[j].size()) ans+=1ll*ds2*(v[j].size()-1-ps)+cnt2[j][ps+1];
}
}
}
for (int i=1;i<=n;++i) smz[rst[i]]++;
for (int i=1;i<=n;++i)
if (!vist[i])
{
if (!nt[i]||!nt2[i]||nt[i]==nt2[i])
{
top=0,dfs4(i);
for (int j=2;j<=top;++j) ans+=1ll*(szt[dque[1]]-szt[dque[j]])*szt[dque[j]]*tfa[dque[j]];
}
else
{
top=top2=ps=cnts=res=0,dfs4(i);
for (int j=2;j<=top;++j) ans+=1ll*(szt[dque[1]]-szt[dque[j]])*szt[dque[j]]*tfa[dque[j]];
for (int j=1;j<=top;++j)
if (dst[dque[j]])
dque2[++top2]=dque[j];
sort(dque2+1,dque2+top2+1,cmp2),ds=dis[num[nt[i]]][num[nt2[i]]]+depth[nt[i]]-depth[nt2[i]];
for (int j=1;j<=top2;++j)
{
while (ps+1<=j&&((depth[dque2[j]]-depth[dque2[ps+1]])<<1)>=ds) ++ps,cnts+=smz[dque2[ps]],res+=smz[dque2[ps]]*(depth[dque2[ps]]<<1);
ans-=(((depth[dque2[j]]<<1)-ds)*cnts-res)*smz[dque2[j]];
}
}
}
printf("%lld\n",ans);
return 0;
}
詳細信息
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 10
Accepted
time: 18ms
memory: 61836kb
input:
300 1300 90 125 9397 157 77 3704 197 112 8218 152 235 1702 271 107 5600 117 92 1401 104 61 2242 127 230 1471 91 116 2740 29 127 4326 151 78 2569 273 241 7487 170 115 3100 152 171 2504 193 95 5921 30 281 1309 285 262 6462 100 265 8151 200 90 277 237 151 1123 231 219 974 238 176 2239 89 147 2256 233 2...
output:
324731073
result:
ok single line: '324731073'
Test #2:
score: 0
Accepted
time: 0ms
memory: 36936kb
input:
300 299 168 161 181 71 254 4119 160 298 8533 148 29 4098 277 279 73 204 174 644 230 113 1265 89 194 6883 296 21 1759 280 190 4793 298 86 3667 185 67 7427 163 257 7845 15 54 8936 52 22 2786 154 199 5543 136 278 4548 256 27 9557 147 34 4208 255 292 1753 242 300 619 263 37 2565 215 109 866 75 153 4924 ...
output:
3693554127
result:
ok single line: '3693554127'
Test #3:
score: 0
Accepted
time: 9ms
memory: 36948kb
input:
300 299 278 277 2650 247 246 4859 110 111 138 293 294 3261 261 262 4054 85 84 6692 135 136 2929 154 153 9014 295 296 8688 212 213 7459 233 234 1563 63 64 9100 123 122 6289 275 274 3781 98 97 530 18 17 2851 261 260 260 61 62 1601 143 142 588 174 175 4724 105 104 2084 285 286 6458 75 76 3094 186 185 6...
output:
21433726951
result:
ok single line: '21433726951'
Test #4:
score: -10
Wrong Answer
time: 3ms
memory: 42024kb
input:
300 300 275 55 6088 139 229 1932 106 297 9861 186 220 3110 146 202 634 270 269 2005 22 233 4461 108 139 7146 11 246 8665 187 236 417 90 9 7925 95 211 7057 7 147 4672 38 63 5056 18 22 7299 60 34 7068 155 114 4061 141 128 4442 266 185 2635 221 187 4869 96 243 6720 87 227 8371 70 196 3403 175 290 3159 ...
output:
5139201613
result:
wrong answer 1st lines differ - expected: '3860396713', found: '5139201613'
Subtask #2:
score: 10
Accepted
Test #5:
score: 10
Accepted
time: 42ms
memory: 52956kb
input:
100000 99999 54625 54626 7146 20763 20764 300 41530 41531 9968 37448 37449 7434 81056 81055 700 27731 27730 8783 12408 12409 514 90652 90653 99 84104 84105 2524 83093 83094 195 17757 17756 2560 81925 81926 8935 14220 14219 9619 25516 25515 5883 89413 89412 275 46936 46937 3997 82755 82754 2775 53080...
output:
834269687204155387
result:
ok single line: '834269687204155387'
Test #6:
score: 0
Accepted
time: 35ms
memory: 47608kb
input:
100000 99999 13706 21290 3420 3037 78334 3887 94743 35121 9291 67873 91038 345 48348 12825 56 25237 56325 19 44215 92806 6788 40110 98929 5038 43250 87034 907 19698 18774 44 79406 51075 9523 79992 15613 4062 91111 66707 1595 1223 12300 3924 65613 22546 9008 24856 20394 393 14915 86273 5876 39594 160...
output:
4573680940298584
result:
ok single line: '4573680940298584'
Subtask #3:
score: 0
Wrong Answer
Test #7:
score: 0
Wrong Answer
time: 41ms
memory: 49744kb
input:
100000 100000 35241 48789 5098 4546 39869 6127 31415 22834 6026 25703 1952 6807 86143 78951 3421 34193 9615 4329 31012 98959 1664 81244 37874 3542 600 74315 9939 91066 57088 2111 5064 33313 9799 78834 28718 1133 41687 82171 4214 44801 87500 4238 40150 73606 5172 17787 30281 3718 52715 82529 4419 924...
output:
4294138535717549
result:
wrong answer 1st lines differ - expected: '3317259529562659', found: '4294138535717549'
Subtask #4:
score: 0
Skipped
Dependency #2:
100%
Accepted
Dependency #3:
0%
Subtask #5:
score: 0
Skipped
Dependency #4:
0%
Subtask #6:
score: 0
Skipped
Dependency #1:
0%