Balanced Photo(USACO)

题目大意:

我们有一个数列,数列中有n个数,对于一个数ai,在它左边的比他大的数的个数为li,右边比他大的数的个数为ri,若li,ri中的较大者比较小者的两倍还大,那么他就是一个不平衡数,求不平衡数的数量。

好吧,典型逆序对。

因为我们要求左边比他大的数的个数,所以我们倒着排序,然后再离散。

然后树状数组解决问题。

那么右边怎么办?

很显然我们得到的离散数组的值就是比他大的数的个数+1(它本身),所以右边的答案为:离散数组值-左边比他大的数的个数-1;

然后轻松统计答案

下面贴代码

#include<cstdio>
#include<algorithm>
#define MN 100005
using namespace std;
int n,tot;
int b[MN],t[MN];
struct qaq{
    int num,opt;
}a[MN];
int lowbit(int x){return (x&-x);}
int query(int x)
{
    int ans=0;
    while(x)
    {
        ans+=t[x];
        x-=lowbit(x);
    }
    return ans;
}
void update(int x){
    while(x<=n)
    {
        t[x]++;
        x+=lowbit(x);
    }
}
bool cmp(qaq a,qaq b){return a.num>b.num;}
int main(){
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i].num),a[i].opt=i;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)b[a[i].opt]=i;
    for(int i=1;i<=n;i++)
    {
        int l=query(b[i]),r=b[i]-l-1;
        if ((l*2<r)||(r*2<l))tot++;
        update(b[i]);
    }
    printf("%d\n",tot);
//    fclose(stdin);
//    fclose(stdout);
}
时间: 2024-10-25 13:27:35

Balanced Photo(USACO)的相关文章

洛谷P3608 [USACO17JAN]Balanced Photo平衡的照片

P3608 [USACO17JAN]Balanced Photo平衡的照片 题目描述 Farmer John is arranging his NN cows in a line to take a photo (1 \leq N \leq 100,0001≤N≤100,000). The height of the iith cow in sequence is h_ih?i??, and the heights of all cows are distinct. As with all ph

Balanced Teams (USACO Jan Bronze 2014)

既然是bronze,毫无压力的AC了. 就是个深搜,当然加个剪枝--最后一个组不用搜. 恩可以一个一个组分层次dfs,这样会跑得飞起~~也不容易错 #include <cstdio> int f[13],i,su,tt1,tt2,lev[4],min; bool has[13]; inline int md(int a,int b,int c,int d){ tt1=a,tt2=a; if(tt1<b)tt1=b; if(tt1<c)tt1=c; if(tt1<d)tt1=d

bzoj4759 [Usaco2017 Jan]Balanced Photo

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4759 [题解] 排序,从大到小插入,树状数组统计. # include <vector> # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # include <bits/stdc++.h> using n

[USACO17JAN]Balanced Photo平衡的照片

[TimeGate] https://www.luogu.org/problem/P3608 [解题思路] 单点修改+区间查询,用树状数组来维护f数组即可 [code] 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 typedef long long LL; 5 struct Node{ 6 LL h; 7 int cnt; 8 }a[100005]; 9 LL ans; 10 LL b[10

题解 P3608 【[USACO17JAN]Balanced Photo平衡的照片】

题目 一道树状数组的裸题. 值得一提的是题目的翻译貌似有点问题. 如果L[i]和R[i]的数目相差2倍以上的话,第i头奶牛就是不平衡的.(L[i]和R[i]分别代表第i头奶牛左右两边比她高的数量).如果L[i]和R[i]中较大者比较小者的数量严格多两倍的话,这头奶牛也是不平衡的 题目中这段话的意思其实是\(max(l[i], r[i]) > 2 * min(l[i], r[i])\),不要被误导了. 接下来是正题. 首先看到这道题,不难想到\(O(n^2)\)的暴力做法,即枚举,但是这样显然会超

【题解】[USACO] 照片Photo

[题解][USACO] 照片Photo [题目大意] 在\(1\)~\(N\)的序列上有\(M\)个区间,使得这\(M\)个小区间每个覆盖了且仅覆盖了一个点,求最多点数,如果无解,输出\(-1\). [分析] 刚开始做的时候我是懵的...不管三七二十一开始想差分约束系统,无奈没那么好的思维,没想出来... 一翻题解,,\(WOC!!!\)这是什么神仙\(DP?\)真的是学到了... 我们设\(f[i]\)表示序列的第\(i\)位是一个点时,序列\(1\)~\(i\)的最多点数. 那么\(dp\)

BZOJ 1699 Usaco Balanced lineup

线段树区间最大最小值模板题目 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4   5 #define lson(x) ((x)<<1) 6 #define rson(x) ((x)<<1|1) 7   8 using std::max; 9 using std::min; 10   11 const int maxn=55555; 12 const int INF

[ USACO 2013 OPEN ] Photo

\(\\\) Description 有一个长度为 \(n\) 的奶牛队列,奶牛颜色为黑或白. 现给出 \(m\) 个区间 \([L_i,R_i]\) ,要求:每个区间里 有且只有一只黑牛 . 问满足所有给出限制最少有多少头黑牛,若无合法方案输出 \(-1\) . \(n\le 2\times 10^5,m\le 10^5\) \(\\\) Solution 单调队列优化. 设 \(f[i]\) 表示,第 \(i\) 个位置为黑牛, \([1,i]\) 的设置符合所有限制,最少有多少头黑牛. 考

[POJ] 3264 Balanced Lineup [ST算法]

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34306   Accepted: 16137 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh