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

题意:在平面直角坐标系中给你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. ZooKeeper server &&client

    写了一个关于zookeepeer应用的简单demo 服务端定时的向zookeeper集群注册,客户端监听zookeeper服务节点变化,一旦变化,立刻响应,更新服务端列表 服务端代码: #includ ...

  2. Qt在VS(Visual Studio)中使用

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt在VS(Visual Studio)中使用     本文地址:https://www.te ...

  3. C# 反射与dynamic最佳组合

    在 C# 中反射技术应用广泛,至于什么是反射.........你如果不了解的话,请看下段说明,否则请跳过下段.广告一下:喜欢我文章的朋友请关注一下我的blog,这也有助于提高本人写作的动力. 反射:当 ...

  4. RT-thread 设备驱动组件之PIN设备

    在RT-thread 2.0.0正式版中引入了pin设备作为杂类设备,其设备驱动文件pin.c在rt-thread-2.0.1\components\drivers\misc中,主要用于操作芯片GPI ...

  5. Python 嵌套函数和闭包

    Python 嵌套函数和闭包 1.函数嵌套 如果在一个函数内部定义了另一个函数,我们称外部的函数为外函数,内部的函数为内函数,如下代码: def out_func(): def inner_func1 ...

  6. HTML5 Web SQL 数据库总结

    Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 如果你是一个 Web 后端程序员,应该很容易理解 SQ ...

  7. es6常用基础合集

    es6常用基础合集 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得 ...

  8. 【题解】Atcoder AGC#03 E-Sequential operations on Sequence

    仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...

  9. Ubuntu安装teamviewer注意事项。

    Ubuntu安装teamviewer注意事项. 首先通过浏览器到官方下载ubuntu对应teamviewer的安装包 但是通过dpkg –i安装之后发现安装过程出问题,安装好的包打开之后也闪退. 这个 ...

  10. PyTorch为何如此高效好用?

    C/C++中 Python 扩展对象的简介 你可能知道可以借助 C/C++扩展 Python,并开发所谓的「扩展」.PyTorch 的所有繁重工作由 C/C++实现,而不是纯 Python.为了定义 ...