Educational Codeforces Round 78 (Rated for Div. 2) C題

Berry Jam

Karlsson has recently discovered a huge stock of berry jam jars in the basement of the house. More specifically, there were 2n jars of strawberry and blueberry jam.

All the 2n jars are arranged in a row. The stairs to the basement are exactly in the middle of that row. So when Karlsson enters the basement, he sees exactly n jars to his left and n jars to his right.

For example, the basement might look like this:

Being the starightforward man he is, he immediately starts eating the jam. In one minute he chooses to empty either the first non-empty jar to his left or the first non-empty jar to his right.

Finally, Karlsson decided that at the end the amount of full strawberry and blueberry jam jars should become the same.

For example, this might be the result:

He has eaten 1 jar to his left and then 5 jars to his right. There remained exactly 3 full jars of both strawberry and blueberry jam.
Jars are numbered from 1 to 2n from left to right, so Karlsson initially stands between jars n and n+1.

What is the minimum number of jars Karlsson is required to empty so that an equal number of full strawberry and blueberry jam jars is left?

Your program should answer t independent test cases.

Input

The first line contains one integer t (1≤t≤1000) — the number of test cases.

The first line of each test case contains a single integer n (1≤n≤105).

The second line of each test case contains 2n integers a1,a2,…,a2n (1≤ai≤2) — ai=1 means that the i-th jar from the left is a strawberry jam jar and ai=2 means that it is a blueberry jam jar.

It is guaranteed that the sum of n over all test cases does not exceed 105.

Output

For each test case print the answer to it — the minimum number of jars Karlsson is required to empty so that an equal number of full strawberry and blueberry jam jars is left.


題目大意是讓你連續左右吃果醬,直到 1 和 2 的數量一樣多;

前綴和+後綴和+思維;

求的 1–n的前綴和,n+1–2n的後綴和;然後 i 從n枚舉到1,找到 i 的前綴和相反的數在(n+1–2n)的後綴和的位置,之間的位置差值就是吃掉的果醬;

運用了map可以裝兩個狀態並且可以直接用find二分查找的特性,可以非常容易實現這個功能,還有幾個細節特別注意,有可能左邊或右邊全部吃完,或者一個不吃;

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
#define inf 0x3f3f3f3f
//ios::sync_with_stdio(false);
using namespace std;
const int N=100100;
const int M=1000100;
const LL mod=998244353;
int s[N<<1];
int main(){
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--){
		map<int,int>ma;//右區間後綴和
		memset(s,0,sizeof(s));
		int n;
		cin>>n;
		for(int i=1;i<=n*2;i++){
			int a;
			cin>>a;
			if(a==1) a=-1;
			else a=1;
			s[i]=s[i-1]+a;
		}
		int ans=2*n;
		ma[0]=2*n+1;//0代表右區間全部吃掉
		for(int i=2*n;i>n;i--) ma[s[2*n]-s[i-1]]=i;//右區間後綴和,必須反着來,i小的覆蓋i大的 
		for(int i=n;i>=0;i--){//左區間從右往左吃,0代表左區間全部吃完 
			map<int,int>::iterator it;
			it=ma.find(-s[i]);
			if(it!=ma.end()){
				ans=min(ans,it->second-i-1);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
發佈了207 篇原創文章 · 獲贊 45 · 訪問量 8323
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章