zoukankan      html  css  js  c++  java
  • LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组

    (mathrm{Sleepy Cow Sorting})

    问题描述

    LG5200

    题解

    树状数组。

    (c[i])代表([1,i])中归位数。

    显然最终的目的是将整个序列排序为一个上升序列,于是倒序枚举,先把最后有序的插入。

    剩下来前面无序的就是要操作的,于是直接输出操作次数。

    接下来方案很容易构造。

    (mathrm{Code})

    #include<bits/stdc++.h>
    using namespace std;
    
    void read(int &x){
    	x=0;char ch=1;int fh;
    	while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    	if(ch=='-') ch=getchar(),fh=-1;
    	else fh=1;
    	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    	x*=fh;
    }
    
    const int maxn=100000+7;
    #define lowbit(pos) (pos&(-pos))
    
    int c[maxn],n,a[maxn];
    
    void change(int pos,int k){
    	while(pos<=n){
    		c[pos]+=k;pos+=lowbit(pos);
    	}
    }
    
    int query(int pos){
    	int ret=0;
    	while(pos){
    		ret+=c[pos];pos-=lowbit(pos);
    	}
    	return ret;
    }
    
    int ans,cnt;
    
    int main(){
    	freopen("sleepy.in","r",stdin);freopen("sleepy.out","w",stdout);
    	read(n);
    	for(int i=1;i<=n;i++) read(a[i]);
    	for(int i=n;i>=1;i--){
    		ans++;--cnt;change(a[i],1);
    		if(a[i-1]>a[i]) break;
    	}
    	cnt+=n;
    	printf("%d
    ",cnt);
    	for(int i=1;i<=n-ans;i++){
    		--cnt;printf("%d ",query(a[i])+cnt);
    		change(a[i],1);
    	}
    	fclose(stdin);fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    Oracle存储过程小记DUAL
    线程私有数据(TSD)
    Unix 五种基本I/O模型的区别
    Redis系列(0)应用场景
    linux ubuntu引导 win7
    Redis系列(一)启动流程分析
    c++ 内存管理小结
    设计模式Facade模式应用场景
    学会理财不做穷人
    jquery 注册验证例子
  • 原文地址:https://www.cnblogs.com/liubainian/p/11566510.html
Copyright © 2011-2022 走看看