【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]表示不 ...
随机推荐
- Java微笔记(1)
一,Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索 1. 排序 语法: Arrays.sort(数 ...
- try-with-resources语句
try-with-resources语句是一种声明了一种或多种资源的try语句.资源是指在程序用完了之后必须要关闭的对象.try-with-resources语句保证了每个声明了的资源在语句结束的时候 ...
- Maven面试宝典
一.Maven有哪些优点和缺点 优点如下: 简化了项目依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具(jen ...
- Bootstrap 栅格系统初识
以下理论内容copy自bootstrap中文网(一个不错的bootstrap学习网站). 栅格系统 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport) ...
- 深入理解:java类加载器
概念理解:Java类加载器总结 1.深入理解Java类加载器(1):Java类加载原理解析 2.深入理解Java类加载器(2):线程上下文类加载器
- CentOS yum安装软件包
yum(Yellowdog Update Modifie)命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定 ...
- 【转】c# 类反射简单操作
转:http://www.jb51.net/article/25863.htm 首先建立一个测试的类 复制代码代码如下: public class MyClass { public int one ...
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
- bzoj 3280: 小R的烦恼 (网络流)
和开发计划一样(数组开太小wa了好多次,然后为什么这么慢? type arr=record toward,next,cap,cost:longint; end; const maxm=; maxn=; ...
- [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割
题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...