XJOI网上同步训练DAY1 T2
思路:似曾相识?...见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的更多相关文章
- XJOI网上同步训练DAY6 T2
思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...
- XJOI网上同步训练DAY3 T2
考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...
- XJOI网上同步训练DAY2 T2
[问题描述] 火车司机出秦川跳蚤国王下江南共价大爷游长沙.每个周末勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个
- XJOI网上同步训练DAY1 T3
思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q ...
- XJOI网上同步训练DAY1 T1
思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...
- XJOI网上同步测试DAY14 T2
思路:先考虑在D高度的最小圆覆盖,再一层一层往下走时,可以保证圆心与最开始的圆相同的时候答案是最优的. 时间复杂度O(n) 有一个坑点,就是我用了srand(time(NULL))就T了,RP太差了. ...
- XJOI网上同步训练DAY6 T1
思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...
- XJOI网上同步训练DAY5 T1
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...
- XJOI网上同步训练DAY5 T3
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...
随机推荐
- hdu Number Sequence
这道题是寻找规律.别的方法一般都是超时. #include <cstdio> #include <cstring> #include <algorithm> usi ...
- BZOJ 1492 货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 思路: 问题转变为维护一个凸包,每次转移都找凸包上的点,并更新凸壳 可以用splay维护,或者 ...
- MVC3路由设置访问后缀 html jsp
C# Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 publ ...
- 在微软平台上运行 SAP 应用程序
本博客介绍了在微软平台上运行 SAP 应用程序的相关信息,作者在基于微软平台使用 SAP 方面有着数十年经验. 发布关于 Azure 的 SAP 说明 几个月前,SAP 针对适用于 SAP 软件 ...
- phpcms:三、头部包含
1‘标题:{if isset($SEO['title']) && !empty($SEO['title'])}{$SEO['title']}{/if}{$SEO['site_title ...
- <php>PDO用法二
<?php //造PDO对象 $pdo = new PDO("mysql:dbname=mydb;host=localhost","root"," ...
- [iOS]数据库第三方框架FMDB详细讲解
[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...
- Git实现从本地加入项目到远程仓库
Git是如今最流行的版本号控制系统之中的一个了,今天也试试了.成功了上传了远程仓库,接下来看看我是怎么做的. 1.首先,要有git的账号.点击查看怎么注冊? 2.注冊成功之后.登陆GitHub.然后, ...
- 虚拟机克隆linux系统后需要做的网络设置
1.vim /etc/sysconfig/network-scripts/ifcfg-eth0删除HWMAC地址行,然后重新分配静态IP/掩码/网关/DNS 2.vim /etc/udev/rules ...
- Linux系统相关
1. 图形界面启动的是哪个运行级别? 而我们平时用的命令行模式又是哪个运行级别? 除了图形和命令行模式两个常用级别外,其他运行级别代表什么涵义?如何更改系统的运行级别?图形界面启动的是5级别,命令行模 ...