QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#65088 | #4596. Ironforge | zzxzzx123 | AC ✓ | 361ms | 27256kb | C++ | 2.2kb | 2022-11-27 15:26:08 | 2022-11-27 15:26:10 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+40;
int vis[N];
vector<int>s[N];
void init(){//分解质因数
for(int i=2;i<N;i++){
if(!vis[i]){
s[i].push_back(i);
for(int j=2;(ll)i*j<N;j++){
int val=i*j;
vis[val]=1;
s[val].push_back(i);
}
}
}
}
vector<int>g[N];
int a[N],b[N],l[N],r[N];
bool check(int i,int x,int now){//表示的是第一个大于等于x是不是在now的区间里
if(!g[i].size()) return false;
if(g[i][g[i].size()-1]<x) return false;
int pos=lower_bound(g[i].begin(),g[i].end(),x)-g[i].begin();
pos=g[i][pos];
return pos<=now;
}
int main(){
init();
int t;
scanf("%d",&t);
while(t--){
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
g[i].clear();
l[i]=i,r[i]=i;//初始化
}//清除一下标记
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int j=0;j<s[a[i]].size();j++){
int val=s[a[i]][j];
g[val].push_back(i);//从前往后
}
}
for(int i=1;i<n;i++){
scanf("%d",&b[i]);
}//获得的是b的数
//随后开始进行预处理出向后能够跑到的最后的点
r[n]=n;
for(int i=n-1;i;i--){
int now=i;
for(;now<n;){
int val=b[now];
if(check(val,i,now)){
now=r[now+1];
}else {
break;
}
}
r[i]=now;
}//预处理出来先
l[1]=1;//初始话1的全局范围
for(int i=2;i<=n;i++){
if(r[i-1]>=i){
//先判断一下左边能不能过去
if(check(b[i-1],i,r[i])){
l[i]=l[i-1];
r[i]=max(r[i-1],r[i]);//r[i]的话是有可能会获得更加的大的
}//如果能够走到了的话
else {
l[i]=i;//没有办法在往左走
}
}else {
int L=i,R=r[i];
l[i]=i;
while(1){
bool st=true;
while(L>1&&check(b[L-1],L,R)){
L=min(L,l[L-1]);
st=false;
}
while(R<n&&check(b[R],L,R)){
R=max(R,r[R+1]);
st=false;
}
if(st){
break;
}
}
l[i]=L,r[i]=R;
}
}
for(int i=1;i<=q;i++){
int u,v;
scanf("%d%d",&u,&v);
//u是起点
if(v>=l[u]&&v<=r[u]){
puts("Yes");
}else {
puts("No");
}
}
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 361ms
memory: 27256kb
input:
3 199997 200000 4147 247 11 1 19 1 11 11 13 19 377 377 4147 319 19 11 13 29 13 1 19 13 11 6061 13 143 551 4147 247 13 29 6061 13 319 377 2717 29 11 247 319 551 247 29 19 551 11 13 377 29 377 19 1 2717 247 1 29 11 1 19 143 29 11 377 143 4147 2717 4147 247 7163 1 209 551 13 1 1 551 13 143 209 143 13 1...
output:
No No No No Yes Yes Yes Yes No Yes No Yes Yes No No No Yes No No No No Yes Yes Yes No No No Yes No Yes No Yes No No Yes No Yes Yes Yes Yes No No Yes Yes Yes No Yes No No Yes No Yes Yes No No No Yes No No No No Yes No No Yes No Yes Yes No Yes No Yes Yes No Yes Yes No No No No Yes Yes No Yes No Yes No...
result:
ok 599998 lines