已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

解题思路:dp[i]表示下标在[dp[i],i]的元素集合符合条件,并且在[dp[i]+1,i]的元素集合不符合条件。也就是dp[i]是i作为右下标对应的最大左下标。

所以只需判断l是否<=dp[r]即可。
注意事项:

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define maxn 100010

#define maxm 100010

#define maxval 1050000

#define pii pair<int,int>

#define fir first

#define sec second

typedef long long ll;

int n,m,x;

int a[maxn];

int dp[maxn];

int pos[maxval];//pos[val]表示val在a中的最大下标 

int main(){

scanf("%d%d%d",&n,&m,&x);

for(int i=1;i<=n;i++){

scanf("%d",&a[i]);

}

for(int i=1;i<=n;i++){

pos[a[i]]=i;

dp[i]=max(dp[i-1],pos[a[i]^x]);

int l,r;

for(int i=1;i<=m;i++){

scanf("%d%d",&l,&r);

if(l<=dp[r])printf("yes\n");

else printf("no\n");

}

}


 

0.0分

28 人评分

  评论区

好难啊,这种东西怎么想到怎么做的
2024-03-22 18:31:25
厉害
2024-01-14 18:07:14
pos数组是a[i]数组对应的下标,dp表示的是a[i]这个数左区间满足条件的最靠近的左边那个数。比如0 < c < a < b < d < n, a^x = b, d^x = c, 此时dp[d] = dp[b] = pos[a],a所在的是最佳答案。要是a[i]^x后得到的数在右边的话是不会更新的,因为pos数组只更新了1到i
2023-02-20 13:50:13
for(int i=1;i<=n;i++){

pos[a[i]]=i;

dp[i]=max(dp[i-1],pos[a[i]^x]);

} 
这一步看不懂,求解qwq
2023-02-01 18:35:28
  • «
  • 1
  • »