首页 > 其他分享 >joisc 2023 护照

joisc 2023 护照

时间:2024-07-29 20:39:41浏览次数:7  
标签:dist int 护照 stk joisc vector 2023 d1 dis

joisc 2023 护照

这题题意好难理解。

题目链接

P9331 [JOISC 2023 Day1] Passport

题意描述

有 \(n\) 个点,每个点连边连向编号在 \([L_i,R_i]\) 间的点,有 \(Q\) 组询问,每次从 \(x\) 号点出发,求出到 \(1\) 号点和到 \(n\) 号点的两条路径经过点的并集的最小值。

  • \(n,Q\leq 2\cdot 10^5\)

解法

最优的的路径一定是先从 \(x\) 走到一个点 \(p\),再从 \(p\) 分出两条路径分别走到 \(1\) 和 \(n\) 号点,这是容易观察到的。

这样答案就可以表示为 \(\min\limits_{i=1}^n \{dist_{x,i}+dist_{i,1}+dist_{i,n}\}\)。

可以先在反图上对每个点 \(i\) 求出 \(dist_{i,1}\) 和 \(dist_{i,n}\),使用线段树优化出边可以做到 \(O(n\log n)\)。每次询问用 set 维护没有入队的点求出 \(x\) 的单源最短路,可以单次 \(O(n\log n)\) 求原图最短路。这样就有了 \(O(qn\log n)\) 的做法。

我们发现,可以对反图建立一个超级源点,对每个点连接边权为 \(dist_{i,1}+dist_{i,n}\) 的边,然后跑超级源点的单源最短路,就可以求出每个点处的答案。使用线段树优化,做到 \(O(n\log^2 n)\)。

代码

#include<bits/stdc++.h>

using namespace std;
const int inf=10000000,N=200010;

int n,q;
vector<int> L,R;
vector<int> node[N<<2];

void add(int u,int l,int r,int L,int R,int v){
  if(L<=l&&r<=R){
    node[u].emplace_back(v);
    return;
  }
  int mid=(l+r)>>1;
  if(L<=mid) add(u<<1,l,mid,L,R,v);
  if(mid<R) add(u<<1|1,mid+1,r,L,R,v);
}

vector<int> stk;
void get(int u,int l,int r,int pos){
  stk.insert(stk.end(),node[u].begin(),node[u].end());
  node[u].clear();
  if(l==r) return ;
  int mid=(l+r)>>1;
  if(pos<=mid) get(u<<1,l,mid,pos);
  else get(u<<1|1,mid+1,r,pos);
}

int main(){
  //freopen("in.in","r",stdin);
  cin.tie(0),cout.tie(0)->sync_with_stdio(false);

  cin>>n;
  L=R=vector<int>(n+1);
  for(int i=1; i<=n; i++){
    cin>>L[i]>>R[i];
  }

  vector<int> d1(n+1),d2(n+1);
  auto get_dist=[&](int sr,vector<int> &dis)->void{
    set<int> st;
    for(int i=1; i<=n; i++) st.insert(i);
    dis=vector<int>(n+1,inf);
    dis[sr]=0;
    deque<int> Q;
    Q.push_back(sr);
    st.erase(sr);
    while(Q.size()){
      int u=Q.front();
      Q.pop_front();

      auto pnt=st.lower_bound(L[u]);
      while(pnt!=st.end()&&(*pnt)<=R[u]){
        dis[*pnt]=dis[u]+1;
        Q.push_back(*pnt);
        auto tmp=next(pnt);
        st.erase(pnt);
        pnt=tmp;
      }
    }
  }; // 求原图的 SSSP,在可通过所有数据的解法中未使用

  d1=d2=vector<int>(n+1,inf);
  for(int i=2; i<=n; i++){
    add(1,1,n,L[i],R[i],i);
  }
  deque<int> Q;
  d1[1]=0;
  Q.push_back(1);
  while(Q.size()){
    int u=Q.front();
    Q.pop_front();

    stk.clear();
    get(1,1,n,u);
    for(auto p:stk){
      if(d1[p]!=inf) continue;
      Q.push_back(p);
      d1[p]=d1[u]+1;
    }
  }

  for(int i=1; i<=n*4; i++) node[i].clear();
  for(int i=1; i<n; i++){
    add(1,1,n,L[i],R[i],i);
  }
  d2[n]=0;
  Q.push_back(n);
  while(Q.size()){
    int u=Q.front();
    Q.pop_front();

    stk.clear();
    get(1,1,n,u);
    for(auto p:stk){
      if(d2[p]!=inf) continue;
      Q.push_back(p);
      d2[p]=d2[u]+1;
    }
  }

  for(int i=1; i<=n*4; i++) node[i].clear();
	
  vector<int> dis(n+1,inf);
  priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
  for(int i=2; i<n; i++){
  	dis[i]=d1[i]+d2[i]-1;
	pq.push(make_pair(d1[i]+d2[i]-1,i));
  }
  dis[n]=d1[n];
  dis[1]=d2[1];
  pq.push(make_pair(d1[n],n));
  pq.push(make_pair(d2[1],1));
  for(int i=1; i<=n; i++){
    add(1,1,n,L[i],R[i],i);
  }
	
  while(pq.size()){
	auto T=pq.top(); pq.pop();
	
	int u=T.second;
	stk.clear();
	get(1,1,n,u);
	for(auto p:stk){
	  if(dis[p]>dis[u]+1){
		dis[p]=dis[u]+1;
		pq.push(make_pair(dis[p],p));
      }
	}
  }
  cin>>q;
	
  while(q--){
	int x;
	cin>>x;
	if(dis[x]>n) dis[x]=-1;
	cout<<dis[x]<<'\n';
  }

  return 0;
}

标签:dist,int,护照,stk,joisc,vector,2023,d1,dis
From: https://www.cnblogs.com/FreshOrange/p/18331036

相关文章

  • CSP2023&NOIP2023游记
    CSP(10.21)早上8:30开考,根据以往的经验,去考场去早了也只能白等着,所以这次差不多8:10才进考场(指的是进学校大门),到的时候发现我们机房的几个同学都先走了。先是普及组,希望拿个400,还是比较有信心的。J组8:30开始考试。先看了一下四道题,前三道都是直接看出了思路,T4感觉有点难度,到时候可......
  • 2023暑假总结2
    暑假总结27.1~7.157月份前半月我们主要是和NOI选手一起打比赛和自己刷题,感谢这次NOI让我真正地体会到了高手的厉害,但也让我觉得NOI其实也不是想象中的那么困难,让我看到了希望。由于之前写过总结,这里就一笔带过了。7.17模拟测试这次模拟测试是和七林一起考的,第一题是一个结......
  • 2023暑假总结1
    暑假总结(7.1-7.7)bymax讲课我们听了yny学长组合数学的讲解,下面是一些有用的公式:吸收公式:\(k\binom{n}{k}=n\binom{n-1}{k-1},(n-k)\binom{n}{k}=n\binom{n-1}{k},k\in\mathbb{Z}\)。上指标反转:\(\binom{n}{k}=(-1)^kn\binom{k-n-1}{k},k\in\mathbb{Z}\)。上指标求和:\(......
  • CS50x2023 Psets9“财务”。获取股票报价时的“查找”功能问题
    我在此任务中的问题是从查找函数获取任何其他“无”输出。经过几天的战斗,我实现了yt教程中的代码,精确地为1到1,但它仍然给出相同的结果-查找“无”。我不知道我可以在哪里寻找这种行为的根源。下面我附上了我的“quote.html”和@quote应用程序Python代码,用于在本练习中获取......
  • 打卡信奥刷题(455)用Scratch图形化工具信奥P9299[普及组/提高组] [CCC 2023 J1] Deliv-e
    [CCC2023J1]Deliv-e-droid题面翻译机器人Deliv-e-droid在送快递,如果它成功地将一个快递送达,则它获得505050元钱,如果未能成功送达,它被扣除......
  • 「CCPC 2023 北京市赛」史莱姆工厂
    由于每次合并可以刻画为向外延伸,那么考虑区间\(\text{dp}\),设\(dp_{l,r,m,c}\)表示考虑了\([l,r]\)且剩下了一个质量为\(m\in[0,K)\)颜色为\(c\)的史莱姆的答案。状态过大且转移方程不便于优化而考虑优化状态,由于对于一个极短的需要合并成一个史莱姆的区间\([p,q]\),......
  • YOLOv10全网最新创新点改进系列:ICCV 2023 - 动态蛇形卷积(Dynamic Snake Convolution)采
    YOLOv10全网最新创新点改进系列:ICCV2023-动态蛇形卷积(DynamicSnakeConvolution)采用管状结构,拉升模型小目标、遮挡目标检测效果,高效涨点!!!所有改进代码均经过实验测试跑通!截止发稿时YOLOv10已改进40+!自己排列组合2-4种后,考虑位置不同后可排列组合上千万种!改进不重样!!专注A......
  • 2023CSP-j复赛题解
    csp-j题解update:2024.6.18-2024.6.25:重构题解第一题:小苹果原题洛谷P9748思路n表示当前长度求几天取完:每天取走\((n-1)/3+1\)个苹果,记录几天取完第\(n\)个苹果第几天被取走:当\(n\bmod3=0\)时被取走时间复杂度约为\(O(\log_n)\)#include<iostream>......
  • 2023.7.2-3-4Mssql xp_cmdshell提权
    1.概念Mssql和SQLsever的一个产品的不同名称。都属于微软公司旗下。而上述Mssqlxp_cmdshell提权也属于数据库提权的一种。主要依赖于sqlserver自带的存储过程。1.1xp_cmdshell提权扩展存储过程中xp_cmdshell是一个开放接口,可以让sqlsever调用cmd命令。此过程在SQLsever......
  • 2023陇剑杯初赛 &2024獬豸杯
    2023陇剑杯初赛sevrersave_2题目描述黑客反弹shell的ip和端口是什么,格式为:10.0.0.1:4444flag:192.168.43.128:2333Wireshark1_1题目描述被入侵主机的IP是?flag:192.168.246.28Wireshark1_2题目描述被入侵主机的口令是?flag:youcannevergetthisWireshark1_4题目......