[POI 2008][BZOJ 1132]Tro
这题我真是无能为力了
这题的做法还是挺简单的
枚举左下角的点做为原点,把其余点按极角排序 PS.是作为原点,如枚举到 k 时,对于所有 p[i] (包括p[k]) p[i]-=p[k] (此处为向量减法)
排序后满足 i<j 的两个向量 p[i] 和 p[j] 的叉积都是正数了
ΣΣp[i]×p[j] = ΣΣ(p[i].x*p[j].y-p[i].y*p[j].x) = Σ(p[i].x*Σp[j].y)-Σ(p[i].y*Σp[j].x)
计算叉积和的复杂度就从 O(n2) 降为了 O(n)
再加上枚举和排序的复杂度,总复杂度就是 O(n2logn)
但是我的代码似乎被 BZOJ 讨厌了%>_<%
本地测都是 A 的,校内 OJ 也 A 了,但BZOJ一交上去秒 WA 啊,55555555
求大爷指导……
这是错误的代码,求教做人
#include <cstdio>
#include <algorithm>
const int size=;
typedef struct point vector;
typedef long long llint; namespace IOspace
{
inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline void putint(llint num, char ch='\n')
{
char stack[];
register int top=;
if (num==) stack[top=]='';
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
if (ch) putchar(ch);
}
} struct point
{
llint x, y;
inline point() {}
inline point(llint _x, llint _y):x(_x), y(_y) {}
inline vector & operator += (vector v) {x+=v.x; y+=v.y; return *this;}
inline vector & operator -= (vector v) {x-=v.x; y-=v.y; return *this;}
};
point p[size];
inline llint operator * (vector a, vector b) {return a.x*b.y-a.y*b.x;}
inline bool operator < (point a, point b) {return a*b>;}
inline void swap(point & a, point & b) {point t=a; a=b; b=t;} int N;
inline llint count(int); int main()
{
llint ans=; N=IOspace::getint();
for (int i=;i<=N;i++) p[i].x=IOspace::getint(), p[i].y=IOspace::getint(); for (int i=N;i>=;i--) ans+=count(i); bool b=ans&1LL;
IOspace::putint(ans>>1LL, '.');
IOspace::putint(b?:); return ;
}
inline llint count(int n)
{
llint ret=; int k=;
for (int i=;i<=n;i++)
if (p[i].x<p[k].x || p[i].x==p[k].x && p[i].y<p[k].y)
k=i;
swap(p[k], p[n]); for (int i=;i<=n;i++) p[i]-=p[n]; std::sort(p+, p+n); vector s(, );
for (int i=;i<=n;i++)
{
ret+=s*p[i];
s+=p[i];
} return ret;
}
欲哭无泪的本傻系列
我再把正确的放上来,帮助理解题解:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; #define maxn 30010
typedef long long ll;
struct xllend3
{
int x,y;
} orz[maxn]; int n,m;
ll ans; bool cmp(const xllend3 &a,const xllend3 &b)
{
return a.x*b.y>a.y*b.x;
}
ll orzhzw(int n)
{
int i=;
for (int j=;j<n;j++)
if (orz[j].x<orz[i].x||(orz[j].x==orz[i].x && orz[j].y<orz[i].y))
i=j;
swap(orz[i],orz[n-]);
for (int i=;i<n-;i++)
orz[i].x-=orz[n-].x,orz[i].y-=orz[n-].y;
sort(orz,orz+n-,cmp);
ll gui=;
ll sx=,sy=;
for (int i=n-;i>=;i--)
{
gui+=(ll)orz[i].x*sy-(ll)orz[i].y*sx;
sx+=orz[i].x;
sy+=orz[i].y;
}
return gui;
} int main()
{
scanf("%d",&n);
for (int i=;i<n;i++) scanf("%d%d",&orz[i].x,&orz[i].y);
for (int i=n;i>;i--) ans+=orzhzw(i);
cout<<ans/;
if (ans&) cout<<".5"<<endl;else cout<<".0"<<endl;
return ;
}
Orz mxh1999
[POI 2008][BZOJ 1132]Tro的更多相关文章
- BZOJ 1132 Tro
Tro [问题描述] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 [输入格式] 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
- BZOJ.1132.[POI2008]Tro(极角排序)
BZOJ 洛谷 考虑暴力,每次枚举三个点,答案就是\(\frac12\sum_{k<j<i}(i-k)\times(j-k)\). 注意到叉积有分配率,所以固定\(k\),枚举\(i,j\ ...
- bzoj 1132 [POI2008]Tro 几何
[POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1796 Solved: 604[Submit][Status][Discu ...
- BZOJ 1132 [POI2008]Tro(极角排序)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...
- bzoj 1132 POI2008 Tro
大水题=_=,可我想复杂了…… 很裸的暴力,就是加了个小优化…… 叉积求面积 :abs(xi*yj - yi*xj) 所以去掉绝对值,把 xi 和 xj 提出来就可以求和了 去绝对值加个极角排序,每次 ...
- 【刷题】BZOJ 1132 [POI2008]Tro
Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...
- bzoj 1112 poi 2008 砖块
这滞胀题调了两天了... 好愚蠢的错误啊... 其实这道题思维比较简单,就是利用treap进行维护(有人说线段树好写,表示treap真心很模板) 就是枚举所有长度为k的区间,查出中位数,计算代价即可. ...
- [BZOJ 1124][POI 2008] 枪战 Maf
1124: [POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 659 Solved: 259[Submit][Status ...
随机推荐
- ajax上传组件
BJUI框架的异步上传组件功能. 初始化: 1.Data属性:div添加属性data-toggle="upload"后可触发上传组件. 示例代码: <div class=&q ...
- HTML--8Window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunme ...
- JDK的下载与安装
一.下载 在Oracle公司的官方网站(www.oracle.com)下载. 二.安装 1.双击运行JDK程序,弹出JDK安装导向窗口,点击“下一步” 2.点击“更改",将安装地址修改为 C ...
- 关于struts2拦截器获取页面参数
package InterCeptor; import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;impor ...
- PAT 10-1 在字符串中查找指定字符
百度了一下另外两位同学的做法,都是先判断是否匹配,然后再用一个for()循环输出,我当然也是先判断,然后,就直接puts(),还是巧妙一点,题设要求及代码实现如下 /* Name: Copyright ...
- Note_Master-Detail Application(iOS template)_06_ YJYDetailViewController.h
// YJYDetailViewController.h #import <UIKit/UIKit.h> @interface YJYDetailViewController : UIV ...
- hdu 2053
Ps:找规律题....凡是平方数都是开...WA了一次..数组给的太小?...后来给到3000..就AC了 代码: #include "stdio.h"long long dp[3 ...
- 极客DIY:开源WiFi智能手表制作
如果你喜欢拥有一款属于自己的无线手表,那么请不要错过,相信阅读完这篇文章对你会很有帮助. 硬件规格 ESP8266(32Mbit闪存) MPU-9250(陀螺仪传感器)以及 AK8963(内置磁力计) ...
- OnePlus安装Kali-NetHunter
1.关于 Kali NetHunter Kali NetHunter 是一款由 Offensive Security 团队研发设计的,以 Nexus(手机/平板)为基本 硬件设备,基于原生 Andro ...
- HDOJ-三部曲一(搜索、数学)- A Knight's Journey
A Knight's Journey Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) ...