【poj2464】树状数组
这道题。。太特么多细节了。。
题意:在平面直角坐标系中给你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】树状数组的更多相关文章
- poj2464扫描线好题,树状数组解法
用树状数组解比线段树快了好多,难度也下降许多 分别用两个树状数组维护当前扫描线左侧和右侧的点,离散化y轴即可 #include<iostream> #include<cstring& ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- UVALive - 6868 Facility Locations 想法题
题目链接: http://acm.hust.edu.cn/vjudge/problem/88634 Facility Locations Time Limit: 3000MS 题意 给你一个m*n的矩 ...
- android BadgeView的使用(图片上的文字提醒)
BadgeView主要是继承了TextView,所以实际上就是一个TextView,底层放了一个label,可以自定义背景图,自定义背景颜色,是否显示,显示进入的动画效果以及显示的位置等等: 这是Gi ...
- 2-c语言作业1
#include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sun; pri ...
- 检测固定IP的端口是否开放批出
因为运维工作经常需要telnet某个IP的端口是否正常,因此有了下文 .BAT内容如下: @echo off for /f %%i in ('type ip.txt') do ( echo %%i t ...
- Android 布局方式学习
一.LinearLayout线性布局: 线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种, 通过android:orientation属性可以设置线性布局的方向 1 ...
- hdu 1851(A Simple Game)(sg博弈)
A Simple Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Tot ...
- C# 大文件的复制方法
如何复制读取大文件,也许困惑了很多人很长时间,这个不知道怎么搞,的确让人头疼欲裂,知道了你就才发现原来那么简单,话不多说,直入正题```` static void Main(string[] args ...
- CentOS vi编辑器简单备忘
1.常用编辑命令 dd 删除(剪切)光标所在整行 5dd 删除(剪切)从光标处开始的 5 行 yy 复制光标所在整行 5yy 复制从光标处开始的 5 行 n 显示搜索命令定位到的下一个字符串 N 显示 ...
- hihoCoder#1698 : 假期计划 组合数
题面:hihoCoder#1698 : 假期计划 组合数 题解: 题目要求是有序的排列,因此我们可以在一开始就乘上A!*B!然后在把这个序列划分成很多段. 这样的话由于乘了阶乘,所以所有排列我们都已 ...
- Spark2.1.0之初识Spark
随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题:社交圈子从现实搬到了Facebook.Twitter.微信等社交平台上:女孩子们现在少了逛街,多了在各大电商平台上的 ...