Gym 100187M - Heaviside Function(化简公式)

题目链接:https://cn.vjudge.net/contest/245776#problem/M

题目大意:

给定函数: f(x) = θ(s1x - a1) + θ(s2x - a2) + ... + θ(snx - an), 其中 si =  ± 1. 计算 x1, x2, ..., xm对应的f(x1),f(x2)...f(xn)

其中      然后输入一系列si,ai,输出给定的f(xi)的值。

题目思路:对函数式子进行化简,其实就是分s=1和s=-1两种情况,然后分别算出θ(snx - an)==1的个数,即二分在相对于的数组中查找位置即可。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
using namespace std;
const int maxn=200010;
int up[maxn],down[maxn],x;
int main()
{
    int n,m,s,a,cnt1=0,cnt2=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&s,&a);
        if(s>0) up[cnt1++]=a;
        else down[cnt2++]=-a;
    }
    sort(up,up+cnt1);
    sort(down,down+cnt2);
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&x);
        int ans1=upper_bound(up,up+cnt1,x)-up;
        int ans2=cnt2-(lower_bound(down,down+cnt2,x)-down);
        printf("%d\n",ans1+ans2);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36782366/article/details/81590680