3 5 1 2 3 4 5 2 2 4 3 4 0 4
1 3 -1 2 2
这道题 做了好久 用了好多方法
第一次没有考虑n的范围 就直接用o(n*n)的时间复杂度做的 而且还不知道可以直接用异或符号^ 自己定义的 结果TLE
然后又用的线段树 发现少考虑情况了 如果加上少考虑的情况 进行n*n此查找 肯定会超时 就提前结束了
最后想的要么是贪心 要么是dp 贪心自己真的不知道如何贪心 于是就用了dp
dp数组分别为 t个数的异或的和
使用t++ 更新异或和的个数
看代码吧
#include <stdio.h> #include <string.h> int a[1000000+5]; int dp[1000000+5]; int main() { int ncase; scanf("%d",&ncase); while(ncase--) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); int n,flag=-1; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); dp[i]=a[i]; if(dp[i]==0&&flag==-1) flag=i; } if(flag!=-1) { printf("%d %d\n",flag+1,flag+1); continue; } int right=-1,left=0,t=0; while(right-left==-1) { t++; if(t>n) break; for(int i=0;i<n;i++) { if(i+t<n) { dp[i]=dp[i]^a[i+t]; if(dp[i]==0) { right=i+t; left=i; break; } } else break; } } if(right-left==-1) printf("-1\n"); else printf("%d %d\n",left+1,right+1); } }