这题我真是无能为力了

这题的做法还是挺简单的

枚举左下角的点做为原点,把其余点按极角排序    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的更多相关文章

  1. BZOJ 1132 Tro

    Tro [问题描述] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 [输入格式] 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...

  2. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  3. BZOJ.1132.[POI2008]Tro(极角排序)

    BZOJ 洛谷 考虑暴力,每次枚举三个点,答案就是\(\frac12\sum_{k<j<i}(i-k)\times(j-k)\). 注意到叉积有分配率,所以固定\(k\),枚举\(i,j\ ...

  4. bzoj 1132 [POI2008]Tro 几何

    [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1796  Solved: 604[Submit][Status][Discu ...

  5. BZOJ 1132 [POI2008]Tro(极角排序)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1132 [题目大意] 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和(N&l ...

  6. bzoj 1132 POI2008 Tro

    大水题=_=,可我想复杂了…… 很裸的暴力,就是加了个小优化…… 叉积求面积 :abs(xi*yj - yi*xj) 所以去掉绝对值,把 xi 和 xj 提出来就可以求和了 去绝对值加个极角排序,每次 ...

  7. 【刷题】BZOJ 1132 [POI2008]Tro

    Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...

  8. bzoj 1112 poi 2008 砖块

    这滞胀题调了两天了... 好愚蠢的错误啊... 其实这道题思维比较简单,就是利用treap进行维护(有人说线段树好写,表示treap真心很模板) 就是枚举所有长度为k的区间,查出中位数,计算代价即可. ...

  9. [BZOJ 1124][POI 2008] 枪战 Maf

    1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 659  Solved: 259[Submit][Status ...

随机推荐

  1. javascript中创建对象的几种方式

    1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的值. var person = new Object(); person.name=&q ...

  2. Android之View.onMeasure方法

    View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1.什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地 ...

  3. hdoj-2023

    #include "stdio.h"int main(){ int a[55][6]; double pingjun[55],mk[6]; int n,m,i,j,sum=0,co ...

  4. 5分钟学习maven(根据英文文档整理)

    英文原地址:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html 一.前提 需要懂得如何在计算机上安装软件 ...

  5. Repeater分页

    void BindData()        {            PagedDataSource pds = new PagedDataSource();                     ...

  6. Java关键字final、static使用总结(转)

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  7. UIkit框架之UIimageview

    1.继承链:UIview:UIresponder:NSObject 2.如果你想利用这个类来制作动态图片,你需要遵守以下的原则: (1)所有的图片的大小都要一样 (2)所有的图片要使用同样的比例,同样 ...

  8. php大力力 [021节]mysql表名在mac下不能大写

    2015-08-27 php大力力021.mysql表名在mac下不能大写 刚才数据库里面,phpMyAdmin狂出错. Some errors have been detected on the s ...

  9. javaweb-c3p0

    //c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?><c3p0-config> ...

  10. HDU 1044

    http://acm.hdu.edu.cn/showproblem.php?pid=1044 代码题,没什么好说的,先预处理出两点间距离,然后dfs搜一下找最大值 #include <iostr ...