ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[Usaco2017 Jan]Balanced Photo

2020-06-25 23:01:57  阅读:324  来源: 互联网

标签:Usaco2017 头牛 数比 ll 个数 Li Jan Balanced Ri


题目

Description

农夫约翰正在安排他的N头牛拍照片, 每头牛有一个身高,从1到N编号,排列成一行(h1,h2...hn),每头牛i左边比他高的牛的数量记为Li,

右边比他高的牛的数量记为Ri,如果存在i满足max(Ri,Li)>2*min(Li,Ri)则这个牛i是不平衡的,现在FJ需要你告诉他有多少头牛不平衡。 

Input

输入第一行为N(N<=1e5) 
接下来的一行有N个数,每个数表示第i头牛的身高,不超过1e9 

Output

输出有多少头牛是不平衡的

Sample Input

7
34
6
23
0
5
99
2

Sample Output

3

 

下面链接教你怎么求在a前面比a小的数数量(如果不会一定要看,与题目有关)

https://www.cnblogs.com/wzx-RS-STHN/p/13193271.html

思路:

看了链接后,我们已经知道了怎么求有多少个数在a前面的数比a小;

我们定义x=多少个数在a前面的数比a小

那么多少个数在a前面的数比a大;当前 枚举到的位置-x;

然后多少个数在a后面的数比a大,则逆循环,反之;

 

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline ll read()
{
    ll a=0,ha=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') ha=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*ha;
}
ll n,m,sum[1000010],b[1000010];
ll L[1000010],R[1000010];
struct oh
{
    ll v,num;
}a[1000010];
inline ll lowbit(ll x)
{
    return x&(-x);
}
inline void insert(ll x,ll y)//加入 
{
    while(x<=n)
    {
        sum[x]+=y;
        x+=lowbit(x);
    }
}
inline ll findout(ll x)//查找 
{
    ll ans=0;
    while(x)
    {
        ans+=sum[x];
        x-=lowbit(x);
    }
    return ans;
}
inline ll cmp(oh a,oh b)//排序 
{
    if(a.v==b.v)
        return a.num<b.num;
    else
        return a.v<b.v;
}
int main()
{
    n=read();
    //离散化 
    for(ll i=1;i<=n;i++)
    {
        a[i].v=read();
        a[i].num=i;//将每一个数的位置记下 
    }
    sort(a+1,a+n+1,cmp);//从小到大排序,
                        //这样每个数都有顺序了,并且每个数对应的位置没有改变 
    for(ll i=1;i<=n;i++)
        b[a[i].num]=i;//把第i小的数位置上赋值为i 
    //cout<<endl;
    //for(ll i=1;i<=n;i++)
       // cout<<b[i]<<endl;
    for(ll i=1;i<=n;i++)
    {
        ll x=findout(b[i]);
        L[i]=i-x-1;//左边比他大的牛数量 
        insert(b[i],1);
    }
    memset(sum,0,sizeof(sum));
    for(ll i=n;i>=1;i--)
    {
        ll x=findout(b[i]);
        R[i]=n-i-x;//反之 
        insert(b[i],1);
    }
    ll ans=0;
    for(ll i=1;i<=n;i++)
    {
        //cout<<R[i]<<" "<<L[i]<<endl;
        ll mx=max(R[i],L[i]);
        ll mn=min(R[i],L[i]);
        if(mx>2*mn)
            ans++;
    }
    printf("%lld\n",ans);
}

 

农夫约翰正在安排他的N头牛拍照片, 每头牛有一个身高,从1到N编号,排列成一行(h1,h2...hn),每头牛i左边比他高的牛的数量记为Li,右边比他高的牛的数量记为Ri,如果存在i满足max(Ri,Li)>2*min(Li,Ri)则这个牛i是不平衡的,现在FJ需要你告诉他有多少头牛不平衡。 

标签:Usaco2017,头牛,数比,ll,个数,Li,Jan,Balanced,Ri
来源: https://www.cnblogs.com/wzx-RS-STHN/p/13193350.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有