#include "walk.h"
#include <bits/stdc++.h>
using namespace std;
int n,m;
typedef pair<long long,long long> P;
vector<int> v[100000];
const int sz=131072;
int ssum[100000];
vector<P> adj[1500000];
long long dist[1500000];
bool vis[1500000];
P pmax(P a,P b) {
return a<b?b:a;
}
P seg[sz*2];
P sum(int l,int r,int node=1,int nodel=0,int noder=sz-1) {
if (r<nodel||l>noder) {
return P(-1,-1);
}
if (l<=nodel&&noder<=r) {
return seg[node];
}
int mid=(nodel+noder)/2;
return pmax(sum(l,r,node*2,nodel,mid),sum(l,r,node*2+1,mid+1,noder));
}
void update(int i,P val) {
i+=sz;
seg[i]=val;
while (i>1) {
i/=2;
seg[i]=pmax(seg[i*2],seg[i*2+1]);
}
}
long long min_distance(vector<int> x,vector<int> h,vector<int> l,vector<int> r,vector<int> y,int s, int g) {
n=x.size();
m=y.size();
printf("%d %d\n",n,m);
for(int i=0;i<n;i++) {
update(i,P(h[i],i));
}
for(int i=0;i<m;i++) {
vector<P> vec;
while (1) {
P got=sum(l[i],r[i]);
if (got.first<y[i]) {
for(int ind=0;ind<vec.size();ind++) {
update(vec[ind].second,vec[ind]);
}
break;
}
vec.push_back(got);
v[got.second].push_back(y[i]);
update(got.second,P(-1,-1));
}
}
for(int i=0;i<n;i++) {
v[i].push_back(0);
sort(v[i].begin(),v[i].end());
if (i) {
ssum[i]=ssum[i-1]+v[i-1].size();
}
for(int j=1;j<v[i].size();j++) {
long long dist=v[i][j]-v[i][j-1];
adj[ssum[i]+j-1].push_back(P(ssum[i]+j,dist));
adj[ssum[i]+j].push_back(P(ssum[i]+j-1,dist));
printf("%d %d %lld\n",ssum[i]+j-1,ssum[i]+j,dist);
}
}
for(int i=0;i<m;i++) {
vector<P> vec;
vector<P> vec2;
while (1) {
P got=sum(l[i],r[i]);
if (got.first<y[i]) {
for(int ind=0;ind<vec.size();ind++) {
update(vec[ind].second,vec[ind]);
}
break;
}
vec.push_back(got);
update(got.second,P(-1,-1));
vec2.push_back(P(got.second,y[i]));
}
sort(vec2.begin(),vec2.end());
for(int j=0;j+1<vec2.size();j++) {
int ind1=ssum[vec2[j].first]+lower_bound(v[vec2[j].first].begin(),v[vec2[j].first].end(),y[i])-v[vec2[j].first].begin();
int ind2=ssum[vec2[j+1].first]+lower_bound(v[vec2[j+1].first].begin(),v[vec2[j+1].first].end(),y[i])-v[vec2[j+1].first].begin();
long long dist=x[vec2[j+1].first]-x[vec2[j].first];
adj[ind1].push_back(P(ind2,dist));
adj[ind2].push_back(P(ind1,dist));
printf("%d %d %lld\n",ind1,ind2,dist);
}
}
int gsz=ssum[n-1]+v[n-1].size();
for(int i=0;i<sz;i++) {
dist[i]=1e16;
}
priority_queue<P,vector<P>,greater<P>> pq;
pq.push(P(0,ssum[s]));
dist[ssum[s]]=0;
while (!pq.empty()) {
int now;
do {
now=pq.top().second;
pq.pop();
} while (!pq.empty()&&vis[now]);
if (vis[now]) {
break;
}
vis[now]=true;
for(int i=0;i<adj[now].size();i++) {
int nt=adj[now][i].first;
if (dist[nt]>dist[now]+adj[now][i].second) {
dist[nt]=dist[now]+adj[now][i].second;
pq.push(P(dist[nt],nt));
}
}
}
long long INF=5e15;
return dist[ssum[g]]>INF?-1:dist[ssum[g]];
}
Compilation message
walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:52:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
52 | for(int ind=0;ind<vec.size();ind++) {
| ~~~^~~~~~~~~~~
walk.cpp:68:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | for(int j=1;j<v[i].size();j++) {
| ~^~~~~~~~~~~~
walk.cpp:81:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
81 | for(int ind=0;ind<vec.size();ind++) {
| ~~~^~~~~~~~~~~
walk.cpp:91:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
91 | for(int j=0;j+1<vec2.size();j++) {
| ~~~^~~~~~~~~~~~
walk.cpp:117:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
117 | for(int i=0;i<adj[now].size();i++) {
| ~^~~~~~~~~~~~~~~~
walk.cpp:100:9: warning: unused variable 'gsz' [-Wunused-variable]
100 | int gsz=ssum[n-1]+v[n-1].size();
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
22 ms |
38860 KB |
secret mismatch |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
24 ms |
38964 KB |
secret mismatch |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
290 ms |
53468 KB |
secret mismatch |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
290 ms |
53468 KB |
secret mismatch |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
22 ms |
38860 KB |
secret mismatch |
2 |
Halted |
0 ms |
0 KB |
- |