本文主要是介绍Atcoder - 4142 尺取法,位运算(适合难度:普及+/提高-),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Atcoder - 4142 尺取法,位运算(适合难度:普及+/提高-)
异或不懂的参考位运算
if a ^ b ^ c < a + b + c
说明a ^ b <= a + b
\qquad 枚举一个左端点,然后利用双指针计俩来滑动右端点来找到最大的满足条件的右端点。解法和UVA1121是很相似的,都是尺取法。
#include <iostream>
#include <cstdio>
using namespace std;const int N = 1000010;
long long a[N];int main()
{int n;scanf("%d", &n);for(int i = 1; i <= n;i ++){scanf("%d", &a[i]);}int j = 0;long long ans = 0;int suma = 0, sumb = 0;for(int i = 1; i <= n && j <= n; i ++){while(j + 1 <= n && suma + a[j + 1] == (sumb ^ a[j + 1])){j ++;suma += a[j] ;sumb ^= a[j];
// printf("%d %d %d %d\n", i, j, suma, sumb);}ans += j - i + 1;sumb ^= a[i];suma -= a[i];}printf("%lld\n", ans);return 0;
}
这篇关于Atcoder - 4142 尺取法,位运算(适合难度:普及+/提高-)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!