hdu7224Ironforge

solution

妙,可能类似暴力,但他均摊nlogn。
先只向后走,预处理R[],然后再算真正的R和L。
如果前面的一个点i-1能到达i:
1.如果i也能到达i-1,则i-1和i的答案一样。
2.如果i不能到达i-1,那他的答案就是L=i,R=预处理
其他的情况直接暴力拓展。

code

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
using namespace std;
const int _=1e6+7;
// const int mod=1e9+7;
int read() {
    int x=0,f=1;char s=getchar();
    for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
int n,m,a[_],b[_],vis[_];
vector<int> num[_],fff[_];
bool link(int l,int r,int val) {
    if(l>r) swap(l,r);
    int j=lower_bound(fff[val].begin(),fff[val].end(),l)-fff[val].begin();
    int len=fff[val].size();
    if(j>=len) return 0;
    return fff[val][j]<=r;
}
int R[_],L[_];
void solve() {
    n=read(),m=read();
    for(int i=1;i<=n;++i) a[i]=read();
    for(int i=1;i<n;++i) b[i]=read();
    for(int i=1;i<=n;++i) for(auto x:num[a[i]]) {
        fff[x].clear();
    }
    for(int i=1;i<=n;++i) for(auto x:num[a[i]]) {
        fff[x].push_back(i);
    }
    for(int i=n;i>=1;--i) {
        L[i]=i,R[i]=i;
        while(R[i]+1<=n&&link(i,R[i],b[R[i]])) R[i]=R[R[i]+1];
    }
    for(int i=1;i<=n;++i) {
        if(i>=2&&R[i-1]>=i&&link(i,R[i],b[i-1]))
            L[i]=L[i-1],R[i]=R[i-1];
        while(1) {
            int flag=0;
            while(R[i]+1<=n&&link(L[i],R[i],b[R[i]]))
                R[i]=R[R[i]+1],flag=1;
            while(L[i]-1>=1&&link(L[i],R[i],b[L[i]-1]))
                L[i]=L[L[i]-1],flag=1;
            if(!flag) break;
        }
    }
    while(m--) {
        int x=read(),y=read();
        if(L[x]<=y&&y<=R[x]) puts("Yes");
        else puts("No");
    }
}
int main() {
    #ifdef ONLINE_JUDGE
    #else
        freopen("1005.in","r",stdin);
        freopen("a.out","w",stdout);
    #endif
    for(int i=2;i<=200000;++i) {
        if(vis[i]==0) {
            for(int j=i;j<=200000;j+=i) {
                num[j].push_back(i);
                vis[j]=1;
            }
        }
    }
    int T=read();
    while(T--) {
        solve();
    }  
    return 0;
}
posted @ 2022-08-11 19:14  小饼卷大葱  阅读(41)  评论(0)    收藏  举报