傳送門
文章目錄
題意:
思路:
緊跟劉爺腳步補題。
不難想到用鏈表維護下一個數是什么,這樣就跟以前做過的一個題差不多了,首先將初始的時候刪掉的點的前一個點即為題目中的AAA入隊,讓后刪掉這個點只會影響他之后的一個點,用鏈表維護一下每個點下一個點在哪里,直接判斷就好啦。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<assert.h>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
;
int a
[N
],nt
[N
],pr
[N
],st
[N
];
int cnt
[N
];
queue
<int>q
;
vector
<int>v
;int main()
{
int _
; scanf("%d",&_
);while(_
--) {scanf("%d",&n
);for(int i
=0;i
<n
;i
++) st
[i
]=0,cnt
[i
]=0;v
.clear();for(int i
=0;i
<n
;i
++) scanf("%d",&a
[i
]),nt
[i
]=(i
+1)%n
;for(int i
=0;i
<n
;i
++) {if(__gcd(a
[i
],a
[(i
+1)%n
])==1)q
.push(i
),st
[(i
+1)%n
]=1,nt
[i
]=nt
[nt
[i
]],v
.pb((i
+1)%n
),i
++;}while(q
.size()) {int u
=q
.front(); q
.pop();cnt
[u
]++;if(st
[u
]) continue;if(__gcd(a
[u
],a
[nt
[u
]])==1) {v
.pb(nt
[u
]);st
[nt
[u
]]=1;nt
[u
]=nt
[nt
[u
]];q
.push(u
);} }int sum
=0;printf("%d",v
.size());for(auto x
:v
) printf(" %d",x
+1);puts("");}return 0;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Codeforces Round #709 (Div. 1) B. Playlist 链表维护 + bfs的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。