11 2012 档案
摘要:思路:1、将原序列seq[]的下标按照seq[]的值升序排序存入res[]中。2、假如我们知道res[j]的后面小于res[j]的数的个数x的话,那么res[j]需要交换的次数为j-res[j]+x;(自己推一下就知道)。3、如何求x呢?我们可以用树状数组sum[]来统计res[]从后往前处理过的数。4、求和累加j-res[j]+x;(j从n-1到0)#include<cstdio>#include<iostream>#include<algorithm>using namespace std;#define MAX 500010 int seq[MAX],
阅读全文
摘要:题意:给出编号1~n的奶牛,是乱序的并且给出了每一个奶牛前小于自己序号的奶牛数目。输出奶牛的正确位置。假设第i个奶牛的高度(就是指前面的小于自己序号的奶牛的数目)为Ai。因此第n个奶牛的序号必然是Ai+1。然后我们将这个奶牛砍掉,那么第n-1个奶牛就可以根据它的高度和已经判断出的第n个奶牛来确定。推出一般的情况:我们用Ck来保存1~k中确定的奶牛数(也就是我们砍掉的奶牛),因此还没有砍的奶牛数为(k-Ck);在倒序处理的过程中,对于奶牛j,其高度为Aj+1,我们只要找出这样的k就行了:Aj+1==k-Ck。k-Ck代表了什么意思呢?其实就是在排好序的奶牛序列中,把已经确定的牛砍去之后k的高度。
阅读全文