codeforces gym 100187M Heaviside Function
2015-07-18 21:46
369 查看
//大概就是没想起来怎么做
解法:首先观察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分别求出两种情况下的解,加起来就是答案
View Code
解法:首先观察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分别求出两种情况下的解,加起来就是答案
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdlib> #include<queue> #include<vector> #include<map> #include<stack> #include<string> #define LL long long using namespace std; int n,m; int t1=0,t2=0; int f1[200001],f2[200001]; int main(){ scanf("%d",&n); for (int i=0;i<n;i++){ int x,y; scanf("%d%d",&x,&y); if (x==1) f1[t1++]=y; else f2[t2++]=y; } sort(f1,f1+t1); sort(f2,f2+t2); scanf("%d",&m); for (int i=0;i<m;i++){ int x; scanf("%d",&x); int ans1=upper_bound(f1,f1+t1,x)-f1; int ans2=upper_bound(f2,f2+t2,-x)-f2; printf("%d\n",ans1+ans2); } return 0; } /* 6 1 3 -1 2 1 9 -1 2 1 7 -1 2 8 0 12 2 8 4 -3 7 9 */
View Code
相关文章推荐
- 解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 以及关闭测试版cache2
- AYIT暑假集训大二第一周周六赛 B - 汉字统计
- 02-数组与集合之间的互相转换
- 排序算法之归并排序
- ZOJ 1940 Dungeon Master
- 【C语言】使用递归的整数输出(高位到低位)/输出一个菱形(能够确定行数)
- boost之variant使用
- JavaScript匿名函数与闭包
- Myeclipse验证js语法报错
- 广义线性回归拟合教程和源码
- 德国精品软件推荐 压缩软件 WINRAR 个人版终于免费了。
- ScrollView
- ZOJ 1003 Crashing Balloon
- html5消除方块游戏总结-对象
- 《机器学习实战》课程笔记(第2章) k-近邻算法
- wpf 中的Canvas与Inkcanvas的属性说明
- BestCoder Round #48
- hdoj 3836 Equivalent Sets 【tarjan 求SCC + 缩点】
- 2015.7个人反思小结以及后续规划
- AYIT暑假集训大一第一周周六赛 F - 全减为1的次数