BZOJ 1637: Balanced Lineup 巧妙变换

2023-10-07 19:58

本文主要是介绍BZOJ 1637: Balanced Lineup 巧妙变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的
坐标(范围: 0..1,000,000,000)和种族(0或1)。 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相
也不例外。他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”。平衡的阵容,指的是在一组牛中,种族
0和种族1的牛的数量相等。 请算出最广阔的区间,使这个区间内的牛阵容平衡。区间的大小为区间内最右边的牛
的坐标减去最做边的牛的坐标。 输入中,每个种族至少有一头牛,没有两头牛的坐标相同。

Input

行 1: 一个整数: N 行 2..N + 1: 每行两个整数,为种族 ID 和 x 坐标。

Output

行 1: 一个整数,阵容平衡的最大的区间的大小


          这道题可以说是非常巧妙了。

      0和1的个数非常难统计,可是如果我们要两个数量相等的话,如果把0看作-1,那么如果一个区间和为0,那么它0和1的个数就相等了。

      由于数据的位置是混乱的,我们先记得要坐标进行排序。

      接着,用一种类似前缀和的思想,从1到n进行枚举。如果现在这个和在之前没出现过,那么我们就把这个和的位置记录下来,注意这里要存成下一个的坐标,从前缀和的角度出发,如果这里直接有再次出现的减这一位的话,会多剪掉这一位的0或1导致答案错误。所以在后面,如果这个sum值再次出现,那么就可以直接用现在的位置减去之前记录的位置来更新答案了,由于我们希望的肯定是最大的区间,所以这个记录的位置只需要存第一次出现的即可,不用更新。

      下附AC代码。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 50005
using namespace std;
int n;
struct nod
{int v,pos;
}a[maxn];
bool operator<(nod a,nod b)
{return a.pos<b.pos;
}
int vis[maxn+maxn];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].v,&a[i].pos);if(a[i].v==0)a[i].v=-1;}sort(a+1,a+1+n);int sum=0;int ans=0;for(int i=1;i<=n;i++){sum+=a[i].v;if(vis[sum]==0) vis[sum]=a[i+1].pos;else 			ans=max(ans,a[i].pos-vis[sum]);	}printf("%d\n",ans);
} 



这篇关于BZOJ 1637: Balanced Lineup 巧妙变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160089

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

巧妙的运用Floyd算法

题目大概意思:输入n,m,n代表n个点,接着输入n个点之间的距离(n*n的矩阵),接下来m次询问,输入a,b,c如果a,b之间的最短路径中存在c点则输出Yes,否则输出No 比赛的时候没有做出来,赛后帆哥一点播就知道了。。。。我写的时候直接用floy算法求距离并记录路径。。然后TLE到死。。。我就奇怪了数据n,m都小于100,怎么会TLE啊。。。坑爹啊。。。我一直怀疑是不是用别的算法。。。。。帆

【数字信号处理】一文讲清FFT(快速傅里叶变换)

目录 快速傅里叶变换(Fast Fourier Transform,FFT)FFT的背景快速傅里叶变换(Fast Fourier Transform,FFT)DFT的数学表达实际计算重要性和应用频谱泄露、频谱混叠奈奎斯特采样定理参考链接 快速傅里叶变换(Fast Fourier Transform,FFT) FFT的背景 1、为什么要时域→频域频率?50Hz+频率120Hz

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,

编程技巧--位运算的巧妙运用(1)

作者:yunyu5120                这是我的这一系列文章的第一篇,主要讲述我学习过程中积累的一些编程技巧,由于我也是一个初学者,高手莫笑。这一篇主要讲解位运算的基础知识鱼与其简单应用,我主要以C/C++语言讲述,其他语言可以类推。如果你已经对位运算基础和应用十分熟悉,那么本文并不适合你。              我相信还是有一部分人对位运算还不是很了解,我希望你在

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

齐次变换矩阵的原理与应用

齐次变换矩阵的原理与应用 通过齐次变换矩阵,可以描述机械臂末端执行器(法兰)在三维空间中的平移和旋转操作。该矩阵结合了旋转和平移信息,用于坐标变换。 1. 齐次变换矩阵的基本形式 一个齐次变换矩阵 T是一个 4x4 矩阵,表示刚体的旋转和平移: T = [ R t 0 1 ] = [ r 11 r 12 r 13 x r 21 r 22 r 23 y r 31 r 32 r 33 z 0

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【HDU】3709 Balanced Number 数位DP

传送门:【HDU】3709 Balanced Number 题目分析:枚举重心的位置再进行数位DP。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using namespace std ;typedef long long LL ;#pragma comment(linker, "/ST

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,