QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#65077 | #4596. Ironforge | zzxzzx123 | TL | 0ms | 0kb | C++ | 2.6kb | 2022-11-27 14:48:58 | 2022-11-27 14:49:00 |
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];
int st=0;//0表示的是向左跳,1表示的是向右跳
while(1){
if(!st){
//向左跳
if(L>1){
while(L>1&&check(b[L-1],L,R)){
// cout<<L<<" "<<L-1<<" debug "<<L<<" "<<R<<endl;
L=min(L,l[L-1]);
R=max(R,r[L-1]);
}
st^=1;
}else {
break;
}
}else {
if(R<n){
while(R<n&&check(b[R],L,R)){
L=min(L,l[R+1]);
R=max(R,r[R+1]);
}
st^=1;
}else {
break;
}
}
// cout<<i<<" dd "<<L<<" "<<R<<endl;
}
l[i]=L,r[i]=R;
}
}
// for(int i=1;i<=n;i++){
// cout<<i<<" "<<l[i]<<' '<<r[i]<<endl;
// }
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;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
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...