// Problem: D. Maximum Product Strikes Back
// URL: https://codeforces.com/contest/1660/problem/D
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define fi first
#define se second
#define ll long long
#define endl '\n'
#define TLE ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define cf TLE;int TT;cin >> TT;while (TT--)
#define IN cin>>n;for(int i=1;i<=n;i++)cin>>a[i]
#define YN(x) if(x)cout<<"YES"<<endl;else cout<<"NO"<<endl;
//#define int long long
const int mod = 1e9 + 7;
const int N = 1e6 + 7;
int a[N];
int n;
signed main()
{
cf
{
IN;
vector<pii> v;
int la = 1;
for (int i = 1; i <= n; i++)
{
if (a[i] == 0)
{
if (la <= i - 1)v.push_back({la,i - 1});
la = i + 1;
}
else if (i == n)v.push_back({la,n});
}
int mx = 0;
pii ans = {n,0}; //定义头尾的要去掉的数字
for (pii& t : v)
{
int cnt = 0;//记录负数的数量
int num = 0;//记录正负2的数量
for (int i = t.fi; i <= t.se; i++)
{
if (a[i] < 0)cnt++;
if (a[i] == -2 || a[i] == 2)num++;
}
if ((cnt & 1) == 0) //没有负数的情况
{
if (num > mx)
{
mx = num;//保存所有区间最大2或-2的个数
ans = {t.fi - 1,n - t.se};//更新答案
}
}
else
{
int p = num;
for (int i = t.fi; i <= t.se; i++)
{
if (a[i] < 0)
{
if (a[i] == -2)p--;//去掉-2的数量
if (p > mx)
{
mx = p;//?
ans = {i,n - t.se};
}
break;
}
if (a[i] == 2)p--;
}
p = num;
for (int i = t.se; i >= t.fi; i--)
{
if (a[i] < 0)
{
if (a[i] == -2)p--;
if (p > mx)
{
mx = p;
ans = {t.fi - 1,n - i + 1};
}
break;
}
if (a[i] == 2)p--;
}
}
}
cout << ans.fi << ' ' << ans.se << endl;
}
}
https://codeforces.com/contest/1660/problem/D
最新推荐文章于 2022-06-30 16:02:49 发布