codeforces gym 100187M Heaviside Function

//大概就是没想起来怎么做

解法:首先观察seitan方程,发现我们要找的是满足seitan(si*x-ai)=1的方程数,即si*x-ai>=0的方程数,因为si=1 or -1,于是分类讨论,当si=1时相当于给定每个x求满足ai<=x的ai数,当si=-1时相当于给定每个x求ai<=-1的方程数,于是我们把si=1和si=-1时的系数ai分别用两个数组记录下来,然后排序,用upper_bound分别求出两种情况下的解,加起来就是答案

 1 #include<cstdio>

 2 #include<iostream>

 3 #include<cmath>

 4 #include<algorithm>

 5 #include<cstring>

 6 #include<cstdlib>

 7 #include<queue>

 8 #include<vector>

 9 #include<map>

10 #include<stack>

11 #include<string>

12 #define LL long long

13 

14 using namespace std;

15 

16 int n,m;

17 int t1=0,t2=0;

18 int f1[200001],f2[200001];

19 

20 int main(){

21     scanf("%d",&n);

22     for (int i=0;i<n;i++){

23             int x,y;

24             scanf("%d%d",&x,&y);

25             if (x==1)

26                 f1[t1++]=y;

27             else

28                 f2[t2++]=y;

29     }

30     sort(f1,f1+t1);

31     sort(f2,f2+t2);

32     scanf("%d",&m);

33     for (int i=0;i<m;i++){

34             int x;

35             scanf("%d",&x);

36             int ans1=upper_bound(f1,f1+t1,x)-f1;

37             int ans2=upper_bound(f2,f2+t2,-x)-f2;

38             printf("%d\n",ans1+ans2);

39     }

40     return 0;

41 }

42 /*

43 6

44 1 3

45 -1 2

46 1 9

47 -1 2

48 1 7

49 -1 2

50 8

51 0 12 2 8 4 -3 7 9

52 */
View Code

 

你可能感兴趣的:(codeforces)