思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html

一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决问题了。

实际情况:10分,wtf

我的程序:

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
const double eps=1e-;
int tot[][],n,m,K;
const double Pi=acos(-);
struct Point{
double x,y,ang;
int id,bel;
Point(){}
Point(double x0,double y0):x(x0),y(y0){}
}d[],f[],t[],p[];
struct Line{
Point s,e;
Line(){}
Line(Point s0,Point e0):s(s0),e(e0){}
};
int sgn(double x){
if (x<-eps) return -;
if (x>eps) return ;
return ;
}
bool cmp(Point p1,Point p2){
return p1.ang<p2.ang;
}
double operator *(Point p1,Point p2){
return p1.x*p2.y-p1.y*p2.x;
}
Point operator -(Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
bool inter(Line p1,Line p2){
if (std::min(p1.s.x,p1.e.x)>std::max(p2.s.x,p2.e.x)||
std::min(p1.s.y,p1.e.y)>std::max(p2.s.y,p2.e.y)||
std::min(p2.s.x,p2.e.x)>std::max(p1.s.x,p1.e.x)||
std::min(p2.s.y,p2.e.y)>std::max(p1.s.y,p1.e.y))
return ;
double a,b,c,d;
a=(p1.e-p1.s)*(p2.e-p1.s);
b=(p1.e-p1.s)*(p2.s-p1.s);
c=(p2.e-p2.s)*(p1.e-p2.s);
d=(p2.e-p2.s)*(p1.s-p2.s);
return (a*b<=eps)&&(c*d<=eps);
}
void sbpianfen1(){
int ans=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=K;k++)
for (int l=k+;l<=K;l++)
if (inter(Line(d[i],f[j]),Line(t[k],t[l]))) ans++;
printf("%d\n",ans);
}
void updata(Point p1,Point p2,int v){
if (p1.bel+p2.bel!=) return;
if (p1.bel>p2.bel) std::swap(p1,p2);
tot[p1.id][p2.id]+=v;
}
void sbpianfen2(){
for (int i=;i<=K;i++){
int cnt=;
for (int j=;j<=n;j++){
p[++cnt]=d[j];p[cnt].bel=;
p[cnt].ang=atan2(d[j].y-t[i].y,d[j].x-t[i].x);
}
for (int j=;j<=m;j++){
p[++cnt]=f[j];p[cnt].bel=;
p[cnt].ang=atan2(f[j].y-t[i].y,f[j].x-t[i].x);
}
for (int j=;j<=K;j++){
if (j==i) continue;
p[++cnt]=t[j];p[cnt].bel=;
p[cnt].ang=atan2(t[j].y-t[i].y,t[j].x-t[i].x);
}
std::sort(p+,p++cnt,cmp);
for (int j=;j<=cnt;j++){
p[cnt+cnt+j]=p[cnt+j]=p[j];
p[cnt+j].ang=p[j].ang+*Pi;
p[cnt+cnt+j].ang=p[cnt+j].ang+*Pi;
}
int l=;int numl=(p[].bel==);
int numj=,numr=,numk=;
for (int j=;j<=cnt;j++){
if (p[j].bel==) numj++;
int r=j+;numr=numj+(p[j+].bel==);
while (sgn(p[l].ang-p[j].ang-Pi)<) l++,numl+=(p[l].bel==);
for (int k=j+,numk=numj+(p[j+].bel==);sgn(p[k].ang-p[j].ang-Pi)<=;k++,numk+=(p[k].bel==)){
while (sgn(p[r+].ang-p[k].ang-Pi)<=) r++,numr+=(p[r].bel==);
updata(p[k],p[j],numk-numj-(numr-numl+(p[l].bel==)));
}
}
}
int ans=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
ans+=tot[i][j];
printf("%d\n",ans/);
}
int main(){
n=read();
for (int i=;i<=n;i++)
d[i].x=read(),d[i].y=read(),d[i].id=i;
m=read();
for (int i=;i<=m;i++)
f[i].x=read(),f[i].y=read(),f[i].id=i;
K=read();
for (int i=;i<=K;i++)
t[i].x=read(),t[i].y=read(),t[i].id=i;
if (n<=&&m<=&&K<=) {sbpianfen1();return ;}
if (n<=&&m<=&&K<=) {sbpianfen2();return ;}
}

明明应该很科学啊。。

正解:n^2做法,枚举导弹发射井,然后极角排序,统计即可。

具体做法:枚举发射井作为原点,然后将其他类型的点排序,然后一边for走过去,ans就加等于在半平面内的基地数乘以导弹防御塔数,再减去在每个基地后边的导弹防御塔数之和,注意删掉相同极角的部分,这样就是答案了,果然我数学太差了,毛都不会。。。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
const double Pi=acos(-);
ll ans=;
int d[][],n,K,m;
struct Point{
int x,y;
Point(){}
Point(int x0,int y0):x(x0),y(y0){}
}S[],T[],E[];
struct node{
long double w;
Point p;
int bz;
}Q[];
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
ll operator *(Point p1,Point p2){
return (ll)p1.x*p2.y-(ll)p1.y*p2.x;
}
Point operator -(Point a,Point b){
return Point(a.x-b.x,a.y-b.y);
}
bool cmp(const node a,const node b){
return a.w<b.w||(!(a.p*b.p)&&a.bz<b.bz);
}
long double get(Point a){
long double w=atan2(a.y,a.x);
if (w<) w=w+Pi+Pi;
return w;
}
void calc(Point S){
for (int i=;i<=n;i++) Q[i].w=get(Q[i].p=E[i]-S),Q[i].bz=;
for (int i=;i<=K;i++) Q[i+n].w=get(Q[i+n].p=T[i]-S),Q[i+n].bz=;
for (int i=;i<=n+K;i++){
Q[i+n+K]=Q[i];Q[i+n+K].w=Q[i].w+*Pi;
if (Q[i].bz) Q[i+n+K].bz=;
}
std::sort(Q+,Q++n+K+n+K,cmp);
int sum=,l=,r=,same=;
ll all=,ans1=ans;
for (int i=;i<=n+K+n+K;i++){
while (l<=r&&Q[d[l][]].w+Pi<Q[i].w) all-=d[l++][];
if (Q[i].bz){
if (i!=&&Q[i].p*Q[i-].p) same=;
ans+=(ll)(r-l+)*sum-all;
if (Q[i].bz==) all+=sum-same,d[++r][]=i,d[r][]=sum-same;
}else{
sum++;
if (i!=&&!(Q[i].p*Q[i-].p)) same++;
else same=;
}
}
}
int main(){
n=read();
for (int i=;i<=n;i++) E[i].x=read(),E[i].y=read();
m=read();
for (int i=;i<=m;i++) S[i].x=read(),S[i].y=read();
K=read();
for (int i=;i<=K;i++) T[i].x=read(),T[i].y=read();
for (int i=;i<=m;i++)
calc(S[i]);
printf("%lld\n",ans);
}

XJOI网上同步训练DAY1 T2的更多相关文章

  1. XJOI网上同步训练DAY6 T2

    思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...

  2. XJOI网上同步训练DAY3 T2

    考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...

  3. XJOI网上同步训练DAY2 T2

    [问题描述] 火车司机出秦川跳蚤国王下江南共价大爷游长沙.每个周末勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个

  4. XJOI网上同步训练DAY1 T3

    思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q ...

  5. XJOI网上同步训练DAY1 T1

    思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...

  6. XJOI网上同步测试DAY14 T2

    思路:先考虑在D高度的最小圆覆盖,再一层一层往下走时,可以保证圆心与最开始的圆相同的时候答案是最优的. 时间复杂度O(n) 有一个坑点,就是我用了srand(time(NULL))就T了,RP太差了. ...

  7. XJOI网上同步训练DAY6 T1

    思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...

  8. XJOI网上同步训练DAY5 T1

    思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...

  9. XJOI网上同步训练DAY5 T3

    就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...

随机推荐

  1. 《iPhone高级编程—使用Mono Touch和.NET/C#》

    第1章 C#开发人员基于MonoTouch进行iPhone开发概述 1 1.1 产品对比 2 1.1.1 .NET Framework 2 1.1.2 Mono 2 1.1.3 MonoTouch 3 ...

  2. 使用脚本管理IIS

    参考资料https://technet.microsoft.com/zh-cn/library/cc779108(WS.10).aspxhttps://technet.microsoft.com/zh ...

  3. C++中,如何在标准库的std::string和常用库(Qt,VC等)的QString之间进行选择?

    假设一个场景:在写GUI程序的时候,如果GUI库和STL都提供了某个功能(比如容器字符串),应该如何在两个库之间选择? 做法是分层,比如分为frontend+core.开发core的时候只用STL,保 ...

  4. intel安装mac os

    一.变色龙: 1.http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1518901&extra=page%3D1%26orderby ...

  5. Oracle中对列加密的方法

    Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...

  6. bzoj2325 [ZJOI2011]道馆之战

    Description 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个 ...

  7. myeclipse实现Servlet实例(2) 继承GenericServet类实现,需要重写service方法

    1.在myeclipse新建web project,配置Tomcat(在myeclipse的Window--preferences) 2.然后在src新建servlet文件( 此处放在com.tsin ...

  8. IOS 缩放图片常用方法

    /** * 指定Size压缩图片 (图片会压缩变形) * * @param image 原图 * @param size 压缩size * * @return 压缩后的图片 */ -(UIImage* ...

  9. (转)iOS7界面设计规范(6) - UI基础 - 模态情境

    继续规范.现在听着Clapton的Wonderful Tonight,想想看,整个高二暑假都在为这首歌着迷,经常夜里一边做英语暑期作业一边循环这首歌,心里特别静的赶脚.13年过去了,再听起来,就像隔着 ...

  10. 讲解版的自动轮播(新手福利)样式和js就不分离了为了看的方便

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...