Codeforces Round #843 (Div. 2) D. Friendly Spiders

news/2024/11/23 23:27:22/

Codeforces Round #843 (Div. 2) D. Friendly Spiders

题目:

  • n ( n < = 3 e 5 ) n(n<=3e5) nn<=3e5 个节点,
  • 每个节点 a i a_i ai < = <= <= 3 e 5 3e5 3e5
  • g c d ( a i , a j ) gcd(a_i,a_j) gcdai,aj ! = != != 1 1 1,则 i i i j j j 存在一条边,
  • s s s t t t 的最短路径,输出该路径

解析:

  • 我们给每个数的质因数找个中转点,这样建图的边数从 n 2 n^2 n2 ,降到 n l o g n nlogn nlogn ,直接跑一个最短路,然后输出路径即可。
#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin>>n;vector<int> a(n+1);for(int i=1;i<=n;i++) cin>>a[i];vector<int> g[300001+n];for(int i=1;i<=n;i++){int x=a[i];for(int j=2;j<=x/j;j++)if(x%j==0){while(x%j==0) x/=j;g[i].push_back(n+j);g[n+j].push_back(i);}if(x>1){g[i].push_back(n+x);g[n+x].push_back(i);}}vector<int> d(300001+n,0x3f3f3f3f),p(300001+n),st(300001+n);queue<int> Q;int s,t;cin>>s>>t;d[s]=0;Q.push(s);while(!Q.empty()){int u=Q.front();Q.pop();if(st[u]) continue;for(auto j:g[u])if(d[j]>d[u]+1){d[j]=d[u]+1;p[j]=u;Q.push(j);}}if(d[t]==0x3f3f3f3f) cout<<"-1"<<endl;else{vector<int> ans;int x=t;while(x){if(x<=n) ans.push_back(x);x=p[x];}reverse(ans.begin(),ans.end());cout<<ans.size()<<endl;for(auto ai:ans)cout<<ai<<" ";cout<<endl;}return 0;
}

http://www.ppmy.cn/news/685592.html

相关文章

Codeforces Round #843 (Div. 2)(A~C,E)

A1/A2. Gardener and the Capybaras (easy version) 三个字符串&#xff0c;按照顺序连在一起&#xff0c;三个字符串满足第二个字符串大于等于第一个和第三个&#xff0c;或者第二个字符串小于等于第一个和第三个&#xff0c;输出满足情况的三个字符串。 思路&#xff1a;对于…

22.1.11打卡 Codeforces Round #843 (Div. 2) ABCE

Dashboard - Codeforces Round #843 (Div. 2) - Codeforces A题(同A1, A2) 做法1: 设n为字符串长度, 从1到n-1中找到第一个a, 这个a两边就代表了a和c的名字, b的名字就是a 需要特判一下当字符串中1~n-1里全都是a的情况 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿…

Codeforces Round #843 (Div. 2) A1 —— D

题目地址&#xff1a;Dashboard - Codeforces Round #843 (Div. 2) - Codeforces一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.11 Last edited: 2023.1.11 目录 ​编辑 A1. Gardener…

【构造】Codeforces Round #843 (Div. 2) B Gardener and the Array

Problem - B - Codeforces 题意&#xff1a; 给定一个序列&#xff0c;让你判断是否存在两个子序列使得这两个子序列或起来相等 思路&#xff1a; 设两个子序列是a和b 两个子序列凭空出现&#xff0c;那肯定考虑构造 满足的条件是&#xff1a; a!b f(a)f(b) 如果只考虑第二个条…

【Codeforces】 Codeforces Round #843 (Div. 2)

比赛链接 点击打开链接 官方题解 点击打开链接 Problem A1. Gardener and the Capybaras (easy version) 直接按照题意模拟即可 时间复杂度 &#xff0c;因为有 的常数&#xff0c;所以可以通过 #include <bits/stdc.h> using namespace std; const int N(20010…

Codeforces Round #843 (Div. 2) A ~ C 题解

A1&A2 Gardener and the Capybaras 题意 简单版本&#xff1a; A1 困难版本&#xff1a; A2 一个字符串&#xff0c;只包含a和b两种字母&#xff0c;请将这个字符串划分为三个非空字符串&#xff0c;使得第二个字符串的字典序最大或最小。困难版本的数据范围要求此题在线…

834

每天时间过的很快&#xff0c;许多点点滴滴如同昨天发生过一样。忙忙碌碌也不知道自己怎么一步步走到今天。但是每天结束的时候&#xff0c;回想一下发生的事情&#xff0c;收获一天的收获&#xff0c;也会体会到幸福。

Codeforces Round #843 (Div. 2)

Gardener and the Capybaras (easy version) 题目集链接 简单版本就是字符串的长度很小&#xff0c;可以用n2的时间复杂度来算&#xff0c;因为n<100 所以我们可以先枚举a的终点&#xff0c;这时候b的起点就有了&#xff0c;然后我们再枚举b的终点&#xff0c;这时候c的起点…