BZOJ5071 小A的数字 BZOJ2017年10月月赛 其他
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ5071
题意概括
题解
一开始蒙了。
感觉做过类似的题目。
但是找不到方法。
突然想到前缀和!
对于三元组变换:
(ai-1,ai,ai+1) => (ai-1+ai,-ai,ai+1+ai)
我们考虑其前缀和变化:
设x为sumi-2
在变换前:
sumi-1=x+ai-1
sumi=x+ai-1+ai
sumi+1=x+ai-1+ai+ai+1
变换后
sumi-1=x+ai-1+ai
sumi=x+ai-1
sumi+1=x+ai-1+ai+ai+1
于是我们发现一次操作实际上就是把sumi-1和sumi交换了一下。
那么我们要判断YES或者NO,只需要把a和b数组分别计算前缀和然后再排序比较是否完全相同即可。
代码
#include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <cstdlib> using namespace std; const int N=100005; int T,n,a[N],b[N]; int main(){ scanf("%d",&T); while (T--){ scanf("%d",&n); a[0]=b[0]=0; for (int i=1,x;i<=n;i++){ scanf("%d",&x); a[i]=a[i-1]+x; } for (int i=1,x;i<=n;i++){ scanf("%d",&x); b[i]=b[i-1]+x; } sort(a+1,a+n+1); sort(b+1,b+n+1); bool flag=1; for (int i=1;i<=n&&flag;i++) if (a[i]!=b[i]) flag=0; puts(flag?"YES":"NO"); } return 0; }