Educational Codeforces Round 132 (Rated for Div. 2)
D. Rorororobot
思路都一样,只是做法不同
第一种st表

#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");
}
}
}
第二种线段树

#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树

#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");
}
}
}

浙公网安备 33010602011771号