【玲珑杯R7 A】Boring Game

Submissions:587Solved:182

DESCRIPTION
In a mysterious cave, PigVan ( Mr.Van’s pet ) has lived for thousands years. PigVan absorbed the power of nature, and it may pretend a human in speaking, walking and so on.

One day, he bought some valuable stone, and divided them into n piles of stone where the ith pile (1≤i≤n) contains values ai .

After PigVan put them in a line, he wants to play a game.

In the boring game, he can do this operation:

Choose a stone pile ai (i>1)and its two adjacent piles ai-1, ai+1, turn (ai-1, ai, ai+1) to (ai-1 + ai, -ai, ai + ai+1).

PigVan wonders whether he can get (b1, b2, b3, …, bn) after several operations.

Note:

If you choose the last pile an, the operation will be ( an-1 + an, -an ) .

INPUT
The first line is a single integer
T
T, indicating the number of test cases.

For each test case:

In the first line, there are only one integer
n
n(n≤105), indicating the number of food piles.

The second line is
n
n integers indicate sequence
a
a ( | ai | ≤ 106).

The third line is
n
n integers indicate sequence
b
b ( | bi | ≤ 106).
OUTPUT
For each test case, just print ‘Yes’ if PigVan can get
b
b after some operations; otherwise, print ‘No’.
SAMPLE INPUT
2
6
1 6 9 4 2 0
7 -6 19 2 -6 6
4
1 2 3 4
4 2 1 3
SAMPLE OUTPUT
Yes
No

【题目链接】:http://www.ifrog.cc/acm/problem/1071?contest=1009&no=0

【题解】

对第i个位置进行操作的话
假设为
a[i-1],a[i],a[i+1]
则变为
a[i-1]+a[i],-a[i],a[i]+a[i+1];
可以看一下前缀和

s[i-1],s[i],s[i+1]
变成了
s[i],s[i-1],s[i+1];
即每次操作只会交换相邻的两个数位置的前缀和;
则处理出a数组的前缀和和b数组的前缀和
看看它们所含的元素、以及元素的个数是否相等(集合的相等)
这个用multiset就能搞;当然用map也行。
或者排个序判断;

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int MAXN = 1e5+100;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);

int T,n;
LL sum1[MAXN],sum2[MAXN],x;
multiset <LL> myset;

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    rei(T);
    while (T--)
    {
        myset.clear();
        rei(n);
        rep1(i,1,n)
        {
            rel(x);
            sum1[i] = sum1[i-1]+x;
            myset.insert(sum1[i]);
        }
        rep1(i,1,n)
        {
            rel(x);
            sum2[i] = sum2[i-1]+x;
            __typeof(myset.begin()) bo = myset.find(sum2[i]);
            if (bo!=myset.end())
                myset.erase(bo);
        }
        if (!myset.empty())
            puts("No");
        else
            puts("Yes");
    }
    return 0;
}
posted @ 2017-10-04 18:45  AWCXV  阅读(102)  评论(0编辑  收藏  举报