QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#65077#4596. Ironforgezzxzzx123TL 0ms0kbC++2.6kb2022-11-27 14:48:582022-11-27 14:49:00

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-11-27 14:49:00]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2022-11-27 14:48:58]
  • 提交

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...

output:


result: