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 ...
随机推荐
- 宏汇编软件MASM51的使用
单片机开发可以用手工汇编和机器汇编两种方法.采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试. 由于采用手工汇 ...
- 自制单片机之十……AT89S51的上拉电阻问题
很多网友都问我AT89S51的P0口为什么要接一个上拉电阻.我就用一个篇幅来说一说 P0口和其它三个口的内部电路是不同的,如下图 P0口是接在两个三极管D0和D1之间的,而P1-P3口的上部是接一个电 ...
- 函数call相关[ASM]
前言: __cdecl:C/C++函数默认调用约定,参数依次从右向左传递,并压入堆栈,最后由调用函数清空堆栈,这种方式适用于传递参数个数可变的被调用函数,只有被调用函数才知道它传递了多少个参数给被 ...
- JS实现 鼠标放上去 图片自动放大的效果
前段时间做项目,要实现,一张图片,鼠标放上去图片自动变大的效果,虽然难度不大,但当时也想了一段时间,当时没时间记录一下,现在有时间了,写篇博客把代码给记录一下: 效果如下: 代码如下: <!DO ...
- ShellSort Shell排序
希尔排序(Shell Sort)又称为“缩小增量排序”.是1959年由D.L.Shell提出来的.该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直 ...
- Hadoop,HBase集群环境搭建的问题集锦(四)
21.Schema.xml和solrconfig.xml配置文件里參数说明: 參考资料:http://www.hipony.com/post-610.html 22.执行时报错: 23., /comm ...
- 漫话Unity3D(一)
前言 使用Unity已经有将近半年时间了,尽管项目还仅仅是个半成品,可是Unity差点儿相同玩熟了.这里把使用过程中碰到的问题梳理一遍.不会涉及到太过详细的功能和代码,可是假设开发一个网游又都会涉及到 ...
- 使用Win32::OLE操作Excel——Excel对象模型
像VBA操作Excel一样,Win32::OLE模块也是通过对象操作来控制Excel. 如果想自动化操作和控制Excel应用程序,则必须要与Excel对象模型所提供的对象进行交互.理解和熟悉Excel ...
- Dynamics CRM 开发模板使用手册(插件开发)
CRM开发手册 本手册介绍在Visual Studio 2015 + Dynamics CRM Developer Extensions模板开发环境下,插件和JS脚本的开发.部署与调试过程. 手册中提 ...
- EasyInvoice 使用教程 - (1) 认识 EI
原视频下载地址:EI 主界面介绍 1. 主界面截图 2. 基础资料界面截图 3. 管理员 界面截图