B - 逃生 HDU - 4857 中位数计数+思维
2017-06-08 21:54
337 查看
此题做法同这个题,之前做过,但是真的是惭愧,自己写在博客上的东西真的很少拿出来看了.掌握的也不扎实,理解不透,一般也就记个几天时间.唉。。。
题目链接
还是和以前的做法一样,先记录这个数的左面比他大的数的个数与比它小的数的个数的差,然后再看这个数右面的,比它小的数的个数与比它大的个数的差,记录对应的值,另外不要忘了该数本身(可以看成差为0的),和左面右面各自为0的情况.
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int n,m;
int ans[8*maxn];
int s[8*maxn];
int vis[8*maxn];
int main()
{
while(~scanf("%d %d",&n,&m))
{
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
int mid;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
if(s[i]>m)
vis[i]=1;
else if(s[i]<m)
vis[i]=-1;
else
{
vis[i]=0;
mid=i;
}
}
int s=0;
int cnt=0;
ans[4*maxn]++;//自己本身的情况
for(int i=mid-1;i>0;i--)
{
cnt+=vis[i];
ans[cnt+4*maxn]++;
}
s+=ans[4*maxn];//左面就构成中位数的情况
cnt=0;
for(int i=mid+1;i<=n;i++)
{
cnt-=vis[i];
s+=ans[cnt+4*maxn];
}
printf("%d\n",s);
}
}
题目链接
还是和以前的做法一样,先记录这个数的左面比他大的数的个数与比它小的数的个数的差,然后再看这个数右面的,比它小的数的个数与比它大的个数的差,记录对应的值,另外不要忘了该数本身(可以看成差为0的),和左面右面各自为0的情况.
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int n,m;
int ans[8*maxn];
int s[8*maxn];
int vis[8*maxn];
int main()
{
while(~scanf("%d %d",&n,&m))
{
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
int mid;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
if(s[i]>m)
vis[i]=1;
else if(s[i]<m)
vis[i]=-1;
else
{
vis[i]=0;
mid=i;
}
}
int s=0;
int cnt=0;
ans[4*maxn]++;//自己本身的情况
for(int i=mid-1;i>0;i--)
{
cnt+=vis[i];
ans[cnt+4*maxn]++;
}
s+=ans[4*maxn];//左面就构成中位数的情况
cnt=0;
for(int i=mid+1;i<=n;i++)
{
cnt-=vis[i];
s+=ans[cnt+4*maxn];
}
printf("%d\n",s);
}
}
相关文章推荐
- HDU 5701 中位数计数(思维,区间)好题
- HDU 5701 中位数计数( 2016"百度之星" - 初赛(Astar Round2B) 思维 + 暴力)
- 【HDU】5701 - 中位数计数(计数 & 思维)
- hdu 5701/百度之星初赛试题 中位数计数 思维
- HDU 5701 中位数计数 (思维+枚举技巧)
- HDU - 5701 中位数计数 (思维)
- HDU 5701 中位数计数 (思维 暴力)
- HDU 5701 中位数计数 (思维)
- HDU 5701 中位数计数 (暴力 思维题)
- hdu 4857 逃生(拓扑排序)
- 【HDU】4857--逃生(拓扑)
- hdu 4857 逃生
- HDU 4857 逃生
- HDU 5701:中位数计数
- hdu-4857-逃生-拓扑排序
- HDU 4857 逃生(拓扑排序)
- HDU 5701 中位数计数
- hdu 4857 逃生(拓扑排序)
- hdu 5701 中位数计数(重构数组)
- HDU 5701 中位数计数