• 数据结构 elegant_sequence(优雅的序列)


    数据结构 elegant_sequence(优雅的序列)

     

    问题描述

      如果一个序列的元素的异或和等于 1,我们称这个序列为优雅的序列。现在
    给你一个 01 序列,和 m 次询问。对于每次询问,给出 l,r。请你输出子序列 a[l..r]
    的异或和。


    ★数据输入
    输入第一行为正整数 n, m。
    第二行为 n 个正整数 a[1..n]。 (1<=ai<=10^9)
    接下来的 m 行,每行两个数 l,r。 (1<=l<=r<=n)
    80%的数据 1<=n,m<=1000.
    100%的数据 1<=n,m<=100000.


    ★数据输出
    输出 m 行,每行一个数表示 a[l…r]的异或和。

    输入示例 输出示例
    3 6
    1 1 0
    1 1
    1 2
    1 3
    2 2
    2 3
    3 3
    1 0 0 1 1 0


    Hint
    数列下标从 1 开始。

     

    解题思路

      奇数个1的异或和为1,偶数个1的异或和为0

      类似  [coprime_sequence(互质序列)](http://www.cnblogs.com/cbattle/p/7577344.html),用数组记录中间值

      ********************************************************************************

      写完后发现之用算从左到右的值存入left[] ,L到R的异或和为left[R]-left[L-1]

      ********************************************************************************

    code

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3  
     4 int p[100002];
     5 int left[100002]={0};
     6 int right[100002]={0};
     7 
     8 int main()
     9 {
    10     int i,j;
    11     int len,ask,l,r;
    12     int onenum=0;
    13     
    14     scanf("%d %d",&len,&ask);
    15     for(i=1;i<=len;i++)
    16     {
    17         scanf("%d",p+i);
    18         if(p[i]==1) onenum++;
    19     }
    20     
    21     for(i=1;i<=len;i++)
    22     {
    23         if(i==1)
    24             left[i] = p[i];
    25         else
    26             left[i] = left[i-1] + p[i];
    27     }
    28     for(i=len;i>=1;i--)
    29     {
    30         if(i==len)
    31             right[len] = p[len];
    32         else
    33             right[i] = right[i+1] + p[i];
    34     }
    35 //    for(i=1;i<=len;i++) printf("%d ",p[i]); printf("
    ");
    36 //    for(i=1;i<=len;i++) printf("%d ",left[i]); printf("
    ");
    37 //    for(i=1;i<=len;i++) printf("%d ",right[i]); printf("
    ");
    38     for(i=0;i<ask;i++)
    39     {
    40         scanf("%d %d",&l,&r);
    41         int num;
    42         if(l==1)
    43             num = onenum - right[r+1];
    44         else if(r==len)
    45             num = onenum - left[l-1];
    46         else
    47             num = onenum - left[l-1] - right[r+1];
    48         
    49         printf("%d
    ",num%2);
    50     }
    51     
    52     return 0;
    53 }
  • 相关阅读:
    MySQL面试题-基础
    IDEA 创建Spring项目后org.springframework.boot报错
    IDEA上传项目到SVN
    解决:idea中右键项目找不到subversion
    关于fromdata的上传文件问题
    PHP清除数组中为0的元素
    PHP删除数组中重复的元素
    PHP代码篇(六)--如何根据邀请人id查询满足条件的会员上级
    PHP对URL进行字符串编码
    PHP时间戳相互转换
  • 原文地址:https://www.cnblogs.com/cbattle/p/7577461.html
Copyright © 2020-2023  润新知