题目
- 原题地址:二分
- 题目编号:NC207053
- 题目类型:差分、前缀和
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 给出n个猜测,以及判断大了或者小了或者等于(判断可能有误),问最多有多少个判断是正确的。
2.题目分析
- 对于每个判断,根据结果对比他大的小的以及自己作加减,只处理端点即可,后面用前缀和
3.题目代码
#include <bits/stdc++.h>
#define N 200005
using namespace std;
typedef struct guess{
int v;
char ch;
}guess;
guess g[N];
int v[N];
int a[N];
int ans;
int main() {
int n;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> g[i].v >> g[i].ch;
v[i] = g[i].v;
}
sort(v, v+n);
int m = unique(v, v+n) - v;
int pos;
for(int i=0;i<n;i++)
{
pos = lower_bound(v, v+m, g[i].v) - v + 1;
pos *= 2;
if(g[i].ch=='.')
{
a[pos]++;
a[pos+1]--;
}
else if(g[i].ch=='+')
{
a[0]++;
a[pos]--;
}
else if(g[i].ch=='-')
{
a[pos+1]++;
}
}
ans = a[0];
for(int i=1;i<N;i++)
{
a[i] += a[i-1];
ans = max(ans, a[i]);
}
cout << ans << endl;
}
- 参考题解
- 学到了两个很巧妙的用法:
int m = unique(v, v+n) - v
:
- 获取排好序的数组中不重复元素的个数,其中unique返回提出不重复元素后的地址,v为首地址,相减就是所求
- 位:0,1,2,3,4,5,6,7,8,9,10
- 前:1,1,1,1,2,2,2,3,3,3,3
- 后:1,2,3,1,1,1,2,2,3,3,3
- unique返回3,3-0=3
pos = lower_bound(v, v+m, g[i].v) - v + 1
:
- 第一次找到g[i].v(数值)的位置,减去首地址就是中间的个数