题目链接: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;
}
︴