这道题。。太特么多细节了。。

题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个stan之前画过的点。 这时候平面就被分割成了四块,两个人这时候会有一个得分,stan的得分是平面上第1、3象限内的点的个数,ollie的得分是平面上第2、4象限内的点的个数,在统计的时候在所画线上的点都不计算在内。求最终stan使得自己的最差得分最高,并且输出此时ollie的得分。

题解:

我们可以枚举哪颗星星是中心点,然后就可以知道他们所确定的直线。

线上可以维护四个值:up,down,left,right,分别表示线上四个方位有多少颗星星。

然后我们只要求BL,就可以知道其它:

TL=横坐标比x小的星星总数-BL-left

TR=y坐标比x大的星星总数-TL-up

BR=y坐标比x小的星星总数-BL-down

各种细节><

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N=,INF=(int)1e9+;
int n,pl,mx,c[N],cntx[N],cnty[N],sumx[N],sumy[N],sx[N][],sy[N][],u[N],d[N],l[N],r[N],a1[N],a2[N];
bool num[N];
struct node{
int x,y;
}a[N];
struct nd{
int d,id,tmp;
}p[*N]; bool cmp_num(int x,int y){return x<y;}
bool cmp_d(nd x,nd y){return x.d<y.d;}
bool cmp_a(node x,node y)
{
if(x.x==y.x) return x.y<y.y;
return x.x<y.x;
}
int maxx(int x,int y){return x>y ? x:y;} void clear()
{
memset(cntx,,sizeof(cntx));
memset(cnty,,sizeof(cnty));
memset(sumx,,sizeof(sumx));
memset(sumy,,sizeof(sumy));
memset(c,,sizeof(c));
memset(a1,,sizeof(a1));
memset(a2,-,sizeof(a2));
} void add(int x)
{
for(int i=x;i<=mx;i+=(i&(-i))) c[i]++;
}
int getsum(int x)
{
int ans=;
for(int i=x;i>=;i-=(i&(-i))) ans+=c[i];
return ans;
} int main()
{
freopen("a.in","r",stdin);
// freopen("me.out","w",stdout);
while()
{
scanf("%d",&n);
if(n==) break;
pl=;clear();
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
p[++pl].d=a[i].x;p[pl].id=i;p[pl].tmp=;
p[++pl].d=a[i].y;p[pl].id=i;p[pl].tmp=;
}
sort(p+,p++pl,cmp_d);
mx=;p[].d=INF;
for(int i=;i<=pl;i++)
{
if(p[i].d!=p[i-].d) mx++;
if(p[i].tmp==) a[p[i].id].x=mx;
else a[p[i].id].y=mx;
} sort(a+,a++n,cmp_a);
// for(int i=1;i<=n;i++)
// printf("%d %d\n",a[i].x,a[i].y);
for(int i=;i<=n;i++)
{
d[i]=cntx[a[i].x];cntx[a[i].x]++;
l[i]=cnty[a[i].y];cnty[a[i].y]++;
}
// for(int i=1;i<=mx;i++)
// printf("i = %d %d %d\n",i,cntx[i],cnty[i]);
for(int i=;i<=n;i++)
{
u[i]=cntx[a[i].x]-d[i]-;
r[i]=cnty[a[i].y]-l[i]-;
}
for(int i=;i<=mx;i++)
{
sumx[i]=sumx[i-]+cntx[i];
sumy[i]=sumy[i-]+cnty[i];
}
for(int i=;i<=n;i++)
{
int x=a[i].x,y=a[i].y;
sx[i][]=sumx[x-];
sx[i][]=sumx[mx]-sumx[x];
sy[i][]=sumy[y-];
sy[i][]=sumy[mx]-sumy[y];
}
// for(int i=1;i<=n;i++)
// {
// printf("%d sx0 %d sx1 %d sy0 %d sy1 %d d %d u %d l %d r %d\n",i,sx[i][0],sx[i][1],sy[i][0],sy[i][1],d[i],u[i],l[i],r[i]);
// }
for(int i=;i<=n;i++)
{
int x=a[i].x,y=a[i].y;
int BL=getsum(a[i].y-)-d[i];
int TL=sx[i][]-BL-l[i];
int TR=sy[i][]-TL-u[i];
int BR=sy[i][]-BL-d[i];
add(y);
if(TR+BL<a1[x]) a1[x]=TR+BL,a2[x]=TL+BR;
else if(TR+BL==a1[x]) a2[x]=maxx(a2[x],TL+BR);
// printf("%d BL = %d BR = %d TR = %d TL = %d\n",i,BL,BR,TR,TL);
}
int ans=,nl=;;
for(int i=;i<=mx;i++)
{
if(a1[i]<INF) ans=maxx(ans,a1[i]);
}
printf("Stan: %d; Ollie:",ans);
memset(num,,sizeof(num));
for(int i=;i<=n;i++)
if(a1[i]==ans) num[a2[i]]=;
for(int i=;i<=n;i++)
if(num[i]) printf(" %d",i);
printf(";\n");
}
return ;
}

【poj2464】树状数组的更多相关文章

  1. poj2464扫描线好题,树状数组解法

    用树状数组解比线段树快了好多,难度也下降许多 分别用两个树状数组维护当前扫描线左侧和右侧的点,离散化y轴即可 #include<iostream> #include<cstring& ...

  2. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  3. bzoj1878--离线+树状数组

    这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...

  4. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  7. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  8. 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组

    E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  9. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

  10. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

随机推荐

  1. UVALive - 6868 Facility Locations 想法题

    题目链接: http://acm.hust.edu.cn/vjudge/problem/88634 Facility Locations Time Limit: 3000MS 题意 给你一个m*n的矩 ...

  2. android BadgeView的使用(图片上的文字提醒)

    BadgeView主要是继承了TextView,所以实际上就是一个TextView,底层放了一个label,可以自定义背景图,自定义背景颜色,是否显示,显示进入的动画效果以及显示的位置等等: 这是Gi ...

  3. 2-c语言作业1

    #include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sun; pri ...

  4. 检测固定IP的端口是否开放批出

    因为运维工作经常需要telnet某个IP的端口是否正常,因此有了下文 .BAT内容如下: @echo off for /f %%i in ('type ip.txt') do ( echo %%i t ...

  5. Android 布局方式学习

    一.LinearLayout线性布局: 线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种, 通过android:orientation属性可以设置线性布局的方向 1 ...

  6. hdu 1851(A Simple Game)(sg博弈)

    A Simple Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Tot ...

  7. C# 大文件的复制方法

    如何复制读取大文件,也许困惑了很多人很长时间,这个不知道怎么搞,的确让人头疼欲裂,知道了你就才发现原来那么简单,话不多说,直入正题```` static void Main(string[] args ...

  8. CentOS vi编辑器简单备忘

    1.常用编辑命令 dd 删除(剪切)光标所在整行 5dd 删除(剪切)从光标处开始的 5 行 yy 复制光标所在整行 5yy 复制从光标处开始的 5 行 n 显示搜索命令定位到的下一个字符串 N 显示 ...

  9. hihoCoder#1698 : 假期计划 组合数

    题面:hihoCoder#1698 : 假期计划  组合数 题解: 题目要求是有序的排列,因此我们可以在一开始就乘上A!*B!然后在把这个序列划分成很多段. 这样的话由于乘了阶乘,所以所有排列我们都已 ...

  10. Spark2.1.0之初识Spark

    随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题:社交圈子从现实搬到了Facebook.Twitter.微信等社交平台上:女孩子们现在少了逛街,多了在各大电商平台上的 ...