QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#65085#4596. Ironforgezzxzzx123WA 356ms27132kbC++2.3kb2022-11-27 15:22:372022-11-27 15:22:47

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 15:22:47]
  • 评测
  • 测评结果:WA
  • 用时:356ms
  • 内存:27132kb
  • [2022-11-27 15:22:37]
  • 提交

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;
					if(L>1){
						while(L>1&&check(b[L-1],L,R)){
							L=min(L,l[L-1]);
							R=max(R,r[L-1]);
							st=false;
						}
					}
					if(R<n){
						while(R<n&&check(b[R],L,R)){
							L=min(L,l[R+1]);
							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;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 356ms
memory: 27132kb

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

result:

wrong answer 20th lines differ - expected: 'No', found: 'Yes'