相遇点对 & 数点问题
题意:
一个长为l的环,环上有n个点,每个点以一定的速度顺时针或逆时针运动,两个点相遇即某一时刻内两个点位置相同.
求有多少点对相遇----相同点对出现多次仅统计一次.
SOL:
考试的时候想到用线段树或者树状数组统计的...但是被数据范围吓住了然后就没打...毕竟是一个差不多n^2logn的东西...然而n有10000....
事实证明数据结构题你要往小里想...胆大心细...
怎么统计呢(这才是正事!!!)... 显然我们能把环上的运动放到直线上. 考虑两个点a,b的追及问题,若a在b身后(我们假设两个点运动方向相同),那么如果两个点在某一时刻相遇,那么a的速度一定大于b,则当他们运动ts后a的一定在b身前.
这是一个非常有用的性质,当我们将每个点的初始位置排序后,所有能与这个点相遇的最终位置坐标一定小于它,那么我们离散化后用树状数组统计即可
对于方向不同的点,减个L相同考虑就完啦...
struct Node{
int l,r,pos;
}a[maxn];
int e[maxn],c[2][maxn],ans=0,n;
int cmp(Node x,Node y){return x.l<y.l;}
void add(int k,int i,int v){
while (i<=n){
c[k][i]+=v;
i+=lowbit(i);
}
}
int sum(int k,int i){
int ret=0;
while (i){
ret+=c[k][i];
i-=lowbit(i);
}
return ret;
}
int get(int x){
int L=0,R=n,mid;
while (L<=R){
mid=(L+R)>>1;
if (e[mid]<=x) L=mid+1; else R=mid-1;
}
return L-1;
}
int main(){
//freopen("a.in","r",stdin);
int l,t;
read(l); read(t); read(n);
FORP(i,1,n){
read(a[i].l); a[i].l%=l;
int x; read(x); a[i].r=a[i].l+x*t;
e[i]=a[i].r;
}
sort(e+1,e+1+n); sort(a+1,a+1+n,cmp);
e[0]=-INF;
FORP(i,1,n) {
a[i].pos=lower_bound(e+1,e+1+n,a[i].r)-e;
add(0,a[i].pos,1);
}
int i;
FOR(i,1,n){
int j;
for (j=i;j<n && a[j+1].l==a[j].l;j++);
FORP(k,i,j) add(0,a[k].pos,-1);
FORP(k,i,j){
ans+=sum(0,a[k].pos);
ans+=sum(1,get(a[k].r-l));//sum(1,lower_bound(e+1,e+1+n,(a[k].r-l))-e);
}
FORP(k,i,j) add(1,a[k].pos,1);
ans+=(j-i)*(j-i+1)/2;
i=j;
}
printf("%d\n",ans);
}
相遇点对 & 数点问题的更多相关文章
- 记一次与a标签相遇的小事
最近做的一个项目,按钮使用的是a标签做的,样子还不错.不过正是这个a标签把我坑死了,有一个场景是点击a标签去调后台服务,为了防止用户频繁点击按钮提交,在去请求后台服务的时候肯定要先把按钮的事件给禁止掉 ...
- HDU--跑道相遇
跑道相遇 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- FM四舍五入_从小数点最后一位进位
原贴地址:http://jiahongguang12.blog.163.com/blog/static/334665720071060551591/ 输入参数12.5445,因此FM从小数点最后一位进 ...
- uva 6757 Cup of Cowards(中途相遇法,貌似)
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...
- HDU 1713 最小公倍数与最大公约数的问题 相遇周期
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) 相遇周期 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/ ...
- hdu 1275 两车追及或相遇问题
思路:这里有2种情况: 一种是相遇:满足关系是 (va+vb)*t=L*(2*n-1) 一种是追及: 满足关系是 |va-vb|*t=L*(2*n-1) 这样求出2种情况的时间,在排序就可以了…… 链 ...
- 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point
// 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...
- CodeForces 589D Boulevard (数学,相遇)
题意:给定 n 个的在 x 轴上的坐标,和开始时间,结束坐标,从起点向终点走,如果和其他人相遇,就互相打招乎,问你每人打招乎的次数. 析:其实这一个数学题,由于 n 比较小,我们就可以两两暴力,这两个 ...
- LA 2965 Jurassic Remains (中途相遇法)
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...
随机推荐
- hibernate之处理视图
近期,我去用hibernate去创建视图, 发现无法进立建立视图, 为啥? 个人去尝试去,却发现无法很好的完成, 因为hibernate的作用类似视图 后解决方案是: 1.用传统的方式去处理 2.写存 ...
- Lattice Diamond 和 ispLEVER 的不同之处
Lattice Diamond 和 ispLEVER.有一些不同,尤其是如何管理工程的不同,包括以下几点: 1.ispLEVER 有多种工程类型,不同的程序文件类型需要不同的类型的工程:但是Diamo ...
- centos vsftp 服务器配置
安装服务端: # yum install -y vsftpd 安装客服端: # yum install ftp -y http://os.51cto.com/art/201408/448630.htm
- 微信支付 - V3退款
退款问题: 1.证书加载不进去,出现"内部错误" 解决:在iis中找到对应的应用连接池,右键高级设置,找到"加载用户配置文件"改为true. 2.需 ...
- 公众号开发——测试工具【ngrok】
工具下载:ngrok 目录清单: ngrok.exe ngrok.cfg run.bat 点击bat启动. 可修改域名,右键bat文件修改. 成功效果图: 注:80端口被占用了怎么办? —— ...
- mxnet环境搭建随记
安装mxnet还是遇到不少麻烦事,现在简单记一下,挖个坑,后续详细补充,打算写一下我的mxnet探索之旅. 更新: 具体安装mxnet,cuda,opencv过程已经补坑——点击进入 不知道为什么,在 ...
- sql server 用户'sa'登录失败(错误18456)(转载)
转载地址:http://thenear.blog.51cto.com/4686262/865544 用户'sa'登录失败(错误18456)解决方案图解 当我们在使用sql server 的时候可能会遇 ...
- Codeforces Round #363 LRU(概率 状压DP)
状压DP: 先不考虑数量k, dp[i]表示状态为i的概率,状态转移方程为dp[i | (1 << j)] += dp[i],最后考虑k, 状态表示中1的数量为k的表示可行解. #incl ...
- HDU 1227 Fast Food
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1227 题意:一维坐标上有n个点,位置已知,选出k(k <= n)个点,使得所有n个点与选定的点中 ...
- EF Core 1.0中使用Include的小技巧
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...