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

题意:在平面直角坐标系中给你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. c# 编译的dll看不见注释问题

    1.项目属性---->生成----->勾选XML文档文件: 2.使用的时候该文件和dll放在一块.

  2. 软件工程课堂作业(三)——Right-BICEP软件单元测试

    一.测试方法:Right-BICEP Right-结果是否正确?B-是否所有的边界条件都是正确的?I-能查一下反向关联吗?C-能用其他手段交叉检查一下结果吗?E-你是否可以强制错误条件发生?P-是否满 ...

  3. j2ee—框架(1):Servlet+JSP实现基本的登录功能(v1.0)

    主要分为四个部分:LoginController.web.xml.login.jsp和login_success.jsp(login_fail.jsp). 第一部分 LoginController p ...

  4. Personal summary 个人总结

    一.请回望开学时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达 ...

  5. DOS工具

    winver  检查Windows版本wmimgmt.msc  打开windows管理体系结构wupdmgr  windows更新程序wscript  windows脚本宿主设置write  写字板w ...

  6. 【Docker 命令】- pause/unpause 命令

    docker pause :暂停容器中所有的进程. docker unpause:恢复容器中所有的进程. 语法 docker pause [OPTIONS] CONTAINER [CONTAINER. ...

  7. == 和equal的区别?-005

    1,== 和equal的区别? ==比较两个值是否相等,equal比较对对象的引用是否一致 举例: int a = 2; int b = 2; System.err.println(a == b);/ ...

  8. TCP标志位简析

    TCP标志位简析   TCP标志位  URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据: ACK:此标志表示应答域有效, ...

  9. 第68天:原型prototype方法

    一.原型prototype方法声明 构造函数有一个prototype属性,指向实例对象的原型对象.通过同一个构造函数实例化的多个对象具有相同的原型对象.经常使用原型对象来实现继承 <!DOCTY ...

  10. Java调用WebService之Axis实现

    import org.apache.axis.client.Call; import org.apache.axis.client.Service; /** * @ClassName: TestAxi ...