题意大致就是给你一个数组,让你移除几个数使得这个数组成为好数组,好数组定义是其中一个数等于剩下数的和
因为这道题被hack,导致cf又扣了10分,?
思路:
大致就是先把每个数存入结构体中,然后用一个成员变量来维护每个数的位置,进行sort排序,然后依次查找,因为如果数组去除某个数后是好数组,那么这个数组一定是2 的 倍数,通过这个条件来进行初步筛选,然后在二分找剩下的数组中是否有那个sum/2的数,注意在查找时会找到你要删除的数,这点要判定一下(就因为这一点被hack)。
#include<cstdio>
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
struct node
{
int num;
int p;
}no[maxn];
bool cmp(node a, node b)
{
return a.num < b.num;
}
int find(int st, int ed, ll x, int nt)
{
while (st <= ed)
{
int mid = st + (ed - st) / 2;
if (x == no[mid].num&&no[mid].p == nt)
{
if (no[mid + 1].num == x) return no[mid + 1].p;
if (no[mid - 1].num == x) return no[mid - 1].p;
}
if (x == no[mid].num&&no[mid].p != nt) return no[mid].p;
else if (x <no[mid].num) ed = mid - 1;
else st = mid + 1;
}
if (st > ed)
return -1;
}
int main()
{
int n;
scanf("%d", &n);
ll sum = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &no[i].num);
no[i].p = i + 1;
sum += no[i].num;
}
sort(no, no + n, cmp);
int cnt = 0;
stack<int>iron;
for (int i = 0; i < n; i++)
{
if ((sum - no[i].num) % 2 == 0)
{
ll re = (sum - no[i].num);
re = re / 2;
int t = find(0, n-1, re, no[i].p);
if (t == -1) continue;
else
{
cnt++;
iron.push(no[i].p);
}
}
}
printf("%d\n", cnt);
if (cnt != 0)
{
while (iron.size() != 1)
{
int t = iron.top();
printf("%d ", t);
iron.pop();
}
int t = iron.top();
iron.pop();
printf("%d\n", t);
}
//system("pause");
return 0;
}