解题思路:因为x是固定值,所以每次比较读入的区间[l,r]与之前满足条件的区间,如果本次读入的区间的左端小于等于而且右端大于等于某一个已经保存的区间,那么这个区间内至少存在那个已经保存的区间满足条件。如果都不满足则进行循环判断。
注意事项:

#include<stdio.h>

#include<math.h>

#include <string.h>

int main()

    {

    int n, m, x;

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

    int arr[100001];

    int brr[100001][2];

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

    {

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

    }

    for (int i = 0; i < m; i++)

     {

        int sb = 0;//作为判断点,用以结束循环

        int a, b;

        scanf("%d %d", &a, &b);//每次读入一组数据,表示区间范围

        for (int g = 0; g < n; g++) {

            if (a <= brr[g][0] && brr[g][1] <= b) //判断是否有已存在的区间能被[a,b]包含

            {

                printf("yes\n");

                sb = 1;

                break;//如果存在便可跳出本此小for循环,不再与标记过的区间匹配

            }

        }

        if (sb == 1)continue;//已经满足条件,跳出本次大循环

        sb = 0;//注意重置判断点

        for (int j = a; j < b; j++)//没有与先前任何数组产生包含关系

        {

            for (int k = j + 1; k <= b; k++)

            {

                if (( arr[j] ^ arr[k]) == x) //从区间左端开始,每次判断两个相邻数字是否满足

                {

                    brr[i][0] = j;//如果满足则标记,即记入数组

                    brr[i][1] = k;//同样记入数组

                    printf("yes\n");

                    sb = 1;//注意反转判断点

                    break;//跳出匹配小循环

                }

            }

            if (sb == 1)

                break;//产生满足条件,跳出大循环

        }

        if(sb==0)

        printf("no\n");//整个大循环结束,全部未满足

    }

    return 0;

}


点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

MilkWay 1年前 回复TA
for (int j = a; j < b; j++)//没有与先前任何数组产生包含关系
        {
            for (int k = j + 1; k <= b; k++)
            {
为什么这里不是j=a-1以及k<b,而是j=a以及k<=b