MnZn刚学完线段树优化建图,求助

P6348 [PA2011] Journeys

YXD123456789 @ 2024-04-01 17:26:22

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 7e6 + 5;
const int K = 1e6;
struct node{
  int nxt,v,w;
};
struct Node{
  int l,r;
};
Node tr[N];
node e[N];
int head[N];
int cnt;
bool st[N];
int dist[N];
int id[N];
int n,m,start;
int xu = 4e6 + 4;
int aa,bb,cc,dd;
void add(int u,int v,int w)
{
  cnt ++;
  e[cnt].nxt = head[u];
  e[cnt].v = v;
  e[cnt].w = w;
  head[u] = cnt;
}
void build(int u,int l,int r)
{
  tr[u].l = l;tr[u].r = r;
  if(l == r)
  {
    id[l] = u;
    return ;
  }
  add(u , u << 1 , 0),add(u , u << 1 | 1 , 0);
  add((u << 1) + K , u + K , 0),add((u << 1 | 1) + K , u + K , 0);
  int mid = (l + r) >> 1;
  build(u << 1 , l , mid);
  build(u << 1 | 1 , mid + 1 , r);
}
void update1(int u,int l,int r)
{
  if(tr[u].l > r || tr[u].r < l)
  {
    return ;
  }
  if(tr[u].l >= l && tr[u].r <= r)
  {
    add(u + K , xu , 1);
    return ;
  }
  update1(u << 1 , l , r);
  update1(u << 1 | 1 , l , r);
  return ;
}
void update(int u,int l,int r)
{
  if(tr[u].l > r || tr[u].r < l)
  {
    return ;
  }
  if(tr[u].l >= l && tr[u].r <= r)
  {
    add(xu , u , 1);
    return ;
  }
  update(u << 1 , l , r);
  update(u << 1 | 1 , l , r);
  return ;
}
void dij(int start)
{
  memset(st , false , sizeof st);
  priority_queue<pair<int,int> > que;
  memset(dist , 0x3f , sizeof dist);
  dist[start] = 0;
  que.push(make_pair(0 , start));
  while(!que.empty())
  {
    int k = que.top().second;que.pop();
    if(st[k]) continue;
    st[k] = 1;
    for(int j = head[k];j;j = e[j].nxt)
    {
      int v = e[j].v;
      int w = e[j].w;
      if(w + dist[k] < dist[v])
      {
        dist[v] = w + dist[k];
        que.push(make_pair(-dist[v] , v));
      }
    }
  }
  return ;
}
signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  cin >> n >> m >> start;
  build(1 , 1 , n);
  for(int i = 1;i <= n;i ++)
  {
    add(id[i] + K , id[i] , 0);
    add(id[i] , id[i] + K , 0);
  }
  while(m --)
  {

    cin >> aa >> bb >> cc >> dd;
    xu ++;
    update(1 , aa , bb);
    update1(1 , cc , dd);
    xu ++;
    update(1 , cc , dd);
    update1(1 , aa , bb);
  }
  dij(id[start] + K);
  for(int i = 1;i <= n;i ++)
  {
    cout << dist[id[i]] / 2 << "\n";
  }
  return 0;
}

by Nagasaki_Soyo @ 2024-04-01 17:42:51

@YXD123456789 4n \gt K


by YXD123456789 @ 2024-04-01 17:49:04

嗷嗷了解,感谢大佬


by YXD123456789 @ 2024-04-01 17:51:30

已过,感谢提醒


|