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

 

posted @ 2015-07-18 21:46  鼠宝宝  阅读(211)  评论(0编辑  收藏  举报