Educational Codeforces Round 132 (Rated for Div. 2)

D. Rorororobot

思路都一样,只是做法不同

第一种st表

image


#include <iostream>
using namespace std;
const int N = 2e5+10;
int Log[N],d[N][25],w[N],n,m;
void init()
{
    Log[1]=0;
    for (int i=2;i<=n;i++)  Log[i]=Log[i/2]+1;
    for (int i=1;i<=n;i++)  d[i][0]=w[i];
    for (int j=1;(1<<j)<=n;j++)
    {
        for (int i=1;i+(1<<(j-1))<=n;i++)
        {
            d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        }
    }
}
int main ()
{
    cin>>m>>n;
    for (int i=1;i<=n;i++)  scanf ("%d",&w[i]);
    init();
    int q;  cin>>q;
    while (q--)
    {
        int x1,x2,y1,y2,k;
        scanf ("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);
        if ((x1-x2)%k||(y1-y2)%k)   puts("NO");
        else
        {
            if (y1>y2)  swap(y1,y2);    int t=Log[y2-y1+1];
            int mx=max(d[y1][t],d[y2-(1<<t)+1][t]);    x1+=(m-x1)/k*k;
            if (x1>mx)  puts("YES");
            else puts("NO");
        }
    }
}

第二种线段树

image


#include <iostream>
using namespace std;
const int N = 2e5+10;
struct node
{
    int l,r,mx;
}tr[N*4];
void pushup(int u)
{
    tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
}
int w[N];
void build (int u,int l,int r)
{
    tr[u]={l,r,w[l]};
    if (l!=r)
    {
        int mid=l+r>>1; build (u<<1,l,mid); build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
int query(int u,int l,int r)
{
    if (tr[u].l>=l&&tr[u].r<=r)   return tr[u].mx;
    else
    {
        int mid=tr[u].l+tr[u].r>>1; int mx=0;
        if (l<=mid) mx=query(u<<1, l, r);
        if (r>mid)  mx=max(mx,query(u<<1|1, l, r));
        return mx;
    }
}

int main ()
{
    int n,m;
    cin>>n>>m;
    for (int i=1;i<=m;i++)  scanf ("%d",&w[i]);
    build(1,1,m);   int q;  cin>>q;
    while (q--)
    {
        int x1,x2,y1,y2,k;
        scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);
        if (y1>y2)  swap(y1,y2);
        if ((x1-x2)%k||(y1-y2)%k)
        {
            puts("NO");continue;
        }
        else
        {
            int mx=query(1,y1,y2);  x1+=(n-x1)/k*k;
            if (x1>mx)  puts("YES");
            else puts("NO");
        }
    }
}

第三种zkw树

image

#include <iostream>
using namespace std;
const int N = 2e5+10;
int mx[N*4],M;
int query(int l,int r)
{
    int mx1=0,mx2=0;
    for (;l^r^1;l>>=1,r>>=1)
    {
        if (~l&1)   mx1=max(mx1,mx[l^1]);
        if (r&1)    mx2=max(mx2,mx[r^1]);
    }
    return max(mx1,mx2);
}
int main ()
{
    int n,m;
    cin>>n>>m;
    for (M=1;M<=m;M<<=1);
    for (int i=M+1;i<=M+m;i++)  scanf("%d",&mx[i]);
    for (int i=M-1;i>0;i--) mx[i]=max(mx[i<<1],mx[i<<1|1]);
    int q;  cin>>q;
    while(q--)
    {
        int x1,x2,y1,y2,k;
        scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k);
        if (y1>y2)  swap(y1,y2);
        if ((x1-x2)%k||(y1-y2)%k)
        {
            puts("NO");continue;
        }
        else
        {
            int mx=query(M+y1-1,M+y2+1);  x1+=(n-x1)/k*k;
            if (x1>mx)  puts("YES");
            else puts("NO");
        }
    }
}
posted @ 2022-07-22 16:05  Seaside_G  阅读(54)  评论(0)    收藏  举报