JZOJ4877. 【NOIP2016提高A组集训第10场11.8】力场护盾
2016-11-08 22:36
337 查看
Description
ZMiG成功粉碎了707的基因突变计划,为了人类的安全,他决定向707的科学实验室发起进攻!707并没有想到有人敢攻击她的实验室,一时间不知所措,决定牺牲电力来换取自己实验室的平安。在实验室周围瞬间产生了一个无限大的力场护盾,它看上去无懈可击!不过ZMiG拥有惊人的双向观察能力,经过他的反复观察,找到了这个护盾的N个弱点,他本想逐一击破,却发现一股神秘力量阻止了他的行为。原来他身处力场之中,受到了两股神秘力量的影响,这两股力量来自两个不同的方向并形成了一个小于180度的角,ZMiG每次可攻击的范围都受到这两个力的影响,当他攻击了点X之后,下一次可以攻击的点必须在以X为坐标原点的情况下,这两个力方向的夹角之间(包含边界)(具体意思可看样例)
ZMiG当然想打出一串最长的Combo,所以他想问问你最多可以攻击707弱点多少
Slution
我在做这道题时并不会怎样将那两个斜的向量给去掉,所以我打了个分段暴力,只能处理两条直线在同一象限的情况……
这道题我们考虑首先要将那恶心的倾斜的区间去掉。所以我们考虑新建一个以这两个力为轴的坐标系,再将每个点放进去。对于那两个力(x1,y1),(x2,y2),我们设它们分别为新坐标系中的x,y轴的单位向量。那么一个点(x,y)在新坐标系中的坐标(x’,y’)满足x′(x1,y1)+y′(x2,y2)=(x,y),我们用乘进去就会得到一条二元一次方程组,解出来就会得到(x’,y’),然后只要离散化一下,用树状数组求一个最长不下降子序列即可。
Code
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #define db double #define ll long long using namespace std; const int maxn=200005; struct code{ db x,y; }b[maxn]; ll n,i,t,j,k,l,num; ll f[maxn]; double a2,b2,x,y,xx,yy,x2,y2; bool cmp(code x,code y){ return x.x<y.x || x.x==y.x && x.y<y.y; } int lowbit(int x){ return x&(-x); } ll find(int x){ if (x<1) return 0; return max(f[x],find(x-lowbit(x))); } void insert(int x){ if (x>num) return; f[x]=max(f[x],t); insert(x+lowbit(x)); } db pan(db x,db y,db xx,db yy){ if (!(xx<0 && yy<0 && x<0 && y<0)) xx=abs(xx),yy=abs(yy),x=abs(x),y=abs(y); return x*yy-y*xx; } int main(){ // freopen("shield.in","r",stdin);freopen("shield.out","w",stdout); freopen("data.in","r",stdin); scanf("%lld%lf%lf%lf%lf",&n,&xx,&yy,&x2,&y2); //if (pan(xx,yy,x2,y2)<0) swap(xx,x2),swap(yy,y2); for (i=1;i<=n;i++){ scanf("%lf%lf",&x,&y); b[i].x=(x*y2-x2*y)/(xx*y2-x2*yy); b[i].y=(x*yy-xx*y)/(x2*yy-xx*y2); swap(b[i].x,b[i].y); } sort(b+1,b+n+1,cmp); for (i=1;i<=n;i++){ if (b[i].x!=x) num++;x=b[i].x; b[i].x=num; swap(b[i].x,b[i].y); } sort(b+1,b+n+1,cmp); for (i=1;i<=n;i++){ t=find(b[i].y)+1; insert(b[i].y); } t=find(num); printf("%lld\n",t); }
相关文章推荐
- 【JZOJ4877】【NOIP2016提高A组集训第10场11.8】力场护盾
- NOIP提高A组集训第10场11.8 力场护盾
- JZOJ4876. 【NOIP2016提高A组集训第10场11.8】时空传送 拓扑序判断最长路是否合法
- 【NOIP2016提高A组集训第10场11.8】力场护盾
- 【NOIP2016提高A组集训第10场11.8】时空传送
- JZOJ4876. 【NOIP2016提高A组集训第10场11.8】基因突变(2017.8B组)
- 【NOIP2016提高A组集训第10场11.8】时空传送
- JZOJ4878. 【NOIP2016提高A组集训第10场11.8】时空传送
- 【JZOJ4878】【NOIP2016提高A组集训第10场11.8】时空传送
- 【JZOJ4876】【NOIP2016提高A组集训第10场11.8】基因突变
- 【NOIP2016提高A组集训第1场10.29】完美标号
- 【JZOJ4855】【NOIP2016提高A组集训第6场11.3】荷花池塘
- JZOJ4859. 【NOIP2016提高A组集训第7场11.4】连锁店
- JZOJ4867【NOIP2016提高A组集训第8场11.5】心理学概论
- 【JZOJ 4866】 【NOIP2016提高组集训】禅与园林艺术
- 【NOIP2016提高A组集训第5场11.2】寻找
- JZOJ 4826. 【NOIP2016提高A组集训第2场10.30】小澳的葫芦
- 【NOIP2016提高A组集训第12场11.10】图的半径
- 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列
- JZOJ4893【NOIP2016提高A组集训第15场11.14】过河