首页 > 代码库 > Balanced Photo(USACO)
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); }
Balanced Photo(USACO)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。