NC207053 二分

题目

  • 原题地址:二分
  • 题目编号: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(数值)的位置,减去首地址就是中间的个数
posted @ 2022-06-29 10:08  仪战群儒  阅读(86)  评论(0)    收藏  举报