[Codeforces]853E - Lada Malina
题目大意:给出平面上$n$个带权点$f_{i}$,再给出$k$个向量$v_{i}$,每次询问给出一个点$p$和一个值$t$,求能满足$f_{i}+\sum w_{j}v_{j}=p(-t<=w_{j}<=t)$的$f_{i}$的点权和。($n,q<=10^5,k<=10$)
做法:由于$v_{i}$与$-v_{i}$等价,我们先把每个向量的横坐标变成非负(在此基础上尽量使纵坐标也非负),再把询问的式子化成$p-t\sum v_{j}+\sum w_{j}v_{j}(0<=w_{j}<=2t)$,令$P=p-t\sum v_{j}$,则合法的$f_{i}$会在这样一个凸多边形内:从$P$点开始,按斜率从小到大的顺序依次把向量接起来得到一个下凸壳,再从$P$点开始,按斜率从大到小顺序再接出一个上凸壳。现在我们要计算这个凸多边形内的点权和,我们只要知道每条边下方(以两个端点向下竖直画射线与这条边围成的区域)的点权和,上凸壳减下凸壳就是答案。由于斜率只有$k$种,我们每种斜率都做一遍,算出所有同斜率的边以及所有点在这个斜率下的截距,按这个截距的大小顺序,按横坐标建线段树即可统计。时间复杂度$O(k(n+q)logn)$。
一些实现细节可以参见如下代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
inline int read()
{
int x,f=;char c;
while((c=getchar())<''||c>'')if(c=='-')f=;
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return f?x:-x;
}
#define MK 10
#define MN 100000
#define ps(x) (upper_bound(c+1,c+cn+1,x)-c-1)
struct vec{int x,y;}v[MK+];
struct work{double a;int x,y,z;}w[MN*+];
bool cmpv(const vec&a,const vec&b){return atan2(a.y,a.x)<atan2(b.y,b.x);}
bool cmpw(const work&a,const work&b){return fabs(a.a-b.a)<1e-?a.z<b.z:a.a<b.a;}
int x[MN+],y[MN+],a[MN+],c[MN+],cn,sx,sy,px[MN+],py[MN+],t[MN+];
ll ans[MN+],s[MN+];
void add(int k,int x){for(;k<=MN;k+=k&-k)s[k]+=x;}
ll sum(int k){ll res=;for(;k;k-=k&-k)res+=s[k];return res;}
int main()
{
int k,n,q,i,j;
k=read();n=read();q=read();
for(i=;i<=k;++i)
{
v[i].x=read();v[i].y=read();
if(v[i].x<)v[i].x=-v[i].x,v[i].y=-v[i].y;
if(!v[i].x&&v[i].y<)v[i].y=-v[i].y;
sx+=v[i].x;sy+=v[i].y;
}
sort(v+,v+k+,cmpv);
for(i=;i<=n;++i)c[i]=x[i]=read(),y[i]=read(),a[i]=read();
sort(c+,c+n+);cn=unique(c+,c+n+)-c-;
for(i=;i<=q;++i)px[i]=read(),py[i]=read(),t[i]=read(),px[i]-=sx*t[i],py[i]-=sy*t[i],t[i]<<=;
for(i=;i<=k;++i)
{
if(!v[i].x){for(j=;j<=q;++j)py[j]+=v[i].y*t[j];continue;}
for(j=;j<=n;++j)w[j]=(work){y[j]-(double)x[j]*v[i].y/v[i].x,x[j],a[j],};
for(j=;j<=q;++j)w[n+j]=(work){py[j]-(double)px[j]*v[i].y/v[i].x,px[j],px[j]+v[i].x*t[j],-j},
px[j]+=v[i].x*t[j],py[j]+=v[i].y*t[j];
sort(w+,w+n+q+,cmpw);
memset(s,,sizeof(s));
for(j=;j<=n+q;++j)
if(w[j].z)ans[-w[j].z]-=sum(ps(w[j].y))-sum(ps(w[j].x-(i<)));
else add(ps(w[j].x),w[j].y);
}
for(i=;i<=k;++i)
{
if(!v[i].x)break;
for(j=;j<=n;++j)w[j]=(work){y[j]-(double)x[j]*v[i].y/v[i].x,x[j],a[j],};
for(j=;j<=q;++j)w[n+j]=(work){py[j]-(double)px[j]*v[i].y/v[i].x,px[j]-v[i].x*t[j],px[j],j},
px[j]-=v[i].x*t[j],py[j]-=v[i].y*t[j];
sort(w+,w+n+q+,cmpw);
memset(s,,sizeof(s));
for(j=;j<=n+q;++j)
if(w[j].z)ans[w[j].z]+=sum(ps(w[j].y-(i>)))-sum(ps(w[j].x-));
else add(ps(w[j].x),w[j].y);
}
for(i=;i<=q;++i)printf("%I64d\n",ans[i]);
}
[Codeforces]853E - Lada Malina的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- Beta No.6
今天遇到的困难: github服务器响应很慢 推图的API接口相应较慢,超过了初始设定的最大延迟时间,导致了无法正确返回图片 ListView滑动删除Demo出现了某些Bug,这些Bug可能导致了某些 ...
- 关于python中argsort()函数的使用
在实现<机器学习实战>中kNN代码时遇到需要将计算好的距离进行排序,即可使用argsort()函数,在此依据个人理解对该函数进行简单的介绍. 总的来说,argsort()函数是对数组中的元 ...
- Basys3在线调试视频指南及代码
fpga在线调试视频链接 FPGA选择型号:xc7a35tcpg236-1 des文件 `timescale 1ns / 1ps module top( output [1:0] led, outpu ...
- python 使用Nginx和uWSGI来运行Python应用
参考:http://zmrenwu.com/post/20/ uWSGI是一个Web应用服务器,它具有应用服务器,代理,进程管理及应用监控等功能.它支持WSGI协议,同时它也支持自有的uWSGI协议, ...
- 关于第一次使用vue-cli
前段时间终于终于可以用vue-cli,webpack做个企业站,记一下过程... 首先node.js,按照vue官网的步骤命令提示符走一波,网速原因,所以用的是淘宝镜像 cnpm # 全局安装 vue ...
- DML数据操作语言之复杂查询
1.视图(View) 我们知道,在关系型数据库中,用来保存实际数据记录的是数据表.和表同等概念也是用来保存东西是:视图. 但是数据表是用来保存实际数据记录的,而视图是用来保存常用select语句的. ...
- Hibernate之Hibernate的体系结构
体系结构简图: 这是一张体系结构的简图,其中的hibernate.properties文件的作用相当于配置文件hibernate.cfg.xml XML Mapping对应的就是映射文件 XXXX.h ...
- javascript参数传递中处理+号
在传值过程中,如果+号也是值的一部分,那就需要对+号进行处理.否则+号会被过滤掉. 处理方式:只需要把js中传过去的+号替换成base64 编码 %2B encodeURI(str).replace( ...
- nyoj 韩信点兵
描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种队形排尾的人数 ...
- 在网络编程中的io流小问题
在客户端和服务端调用io流进行传输数据的过程中,当将数据write到outputstream中,需要及时刷新,否则会发生io阻塞. 在输入数据的时候,最好选用BufferedReader,因为read ...