poj 2182 树状数组
这题对于O(n^2)的算法有很多,我这随便贴一个烂的,跑了375ms。
#include<iostream>
#include<algorithm>
using namespace std;
int mat[];
int main()
{
int i,j,t,n;
scanf("%d",&n); mat[]=;
for(i=;i<n;i++)
{
scanf("%d",&t);
mat[i]=t+;
for(j=;j<i;j++)
if(mat[j]>=mat[i])
{ mat[j]++;}
}
for(i=;i<n;i++)
printf("%d\n",mat[i]); return ;
}
还是来看树状数组的解法。我们从后面往见面看,假设第i个牛前面有Rank[i]个牛标号比他小,由此很容易得出最后一个牛的编号一定是Rank[n]+1。我们将最后一个牛去掉后,剩下n-1牛时,对于第n-1个牛的道理是一样的,只不过不同的是Rank[n-1]+1之前有多少个牛已经不存在了,即已经确定位置。我们就用树状数组保存被去掉的牛个数,C[i]表示标号i之前已经有多少个牛确定位置。那么我们每次就是要找某个数k,使得k-C[k]==Rank[i]+1。这就是第i个牛的确定位置。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define Maxn 8010
#define inf 0x7fffffff
#define lowbit(x) (x&(-x))
using namespace std; int C[Maxn],n,Rank[Maxn],ans[Maxn];
void init()
{
memset(C,,sizeof(C));
}
int Sum(int pos)
{
int sum=;
while(pos>)
{
sum+=C[pos];
pos-=lowbit(pos);
}
return sum;
}
void update(int pos,int num)
{
while(pos<=n)
{
C[pos]+=num;
pos+=lowbit(pos);
}
}
int getPos(int i)
{
int l=,r=n,temp;
while(l<r)
{
int mid=(l+r)>>;
temp=mid-Sum(mid);
if(temp<i)
l=mid+;
else
r=mid;
}
return l;
}
int main()
{
int i,j,a,b,c;
while(scanf("%d",&n)!=EOF)
{
init();
for(i=;i<=n;i++)
scanf("%d",&Rank[i]);
Rank[]=;
for(i=n;i>=;i--)
{
int pos=getPos(Rank[i]+);
ans[i]=pos;
update(pos,);
}
for(i=;i<=n;i++)
printf("%d\n",ans[i]);
}
return ;
}
poj 2182 树状数组的更多相关文章
- POJ 3321 树状数组(+dfs+重新建树)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27092 Accepted: 8033 Descr ...
- POJ 2352Stars 树状数组
Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42898 Accepted: 18664 Descripti ...
- poj 2299 树状数组求逆序数+离散化
http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...
- poj 3928 树状数组
题目中只n个人,每个人有一个ID和一个技能值,一场比赛需要两个选手和一个裁判,只有当裁判的ID和技能值都在两个选手之间的时候才能进行一场比赛,现在问一共能组织多少场比赛. 由于排完序之后,先插入的一定 ...
- POJ 2299 树状数组+离散化求逆序对
给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的 其实就是问冒泡往后 最多多少次 但是按普通冒泡记录次数一定会超时 冒泡记录次数的本质是每个数的逆序数 ...
- poj 2299 树状数组求逆序对数+离散化
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 54883 Accepted: 20184 ...
- POJ 2352 树状数组
学习自:链接以及百度百科 以及:https://www.bilibili.com/video/av18735440?from=search&seid=363548948825132979 理解 ...
- POJ 2299树状数组求逆序对
求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...
- MooFest POJ - 1990 (树状数组)
Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gather ...
随机推荐
- HDU 5675 ztr loves math (数学推导)
ztr loves math 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/A Description ztr loves re ...
- Spring + JdbcTemplate + JdbcDaoSupport examples
In Spring JDBC development, you can use JdbcTemplate and JdbcDaoSupport classes to simplify the over ...
- python challenge第1关--NoteBook上的“乱码”
在 python challenge第0关中已经得到第1关的地址了: http://www.pythonchallenge.com/pc/def/map.html 一.观察地址栏和标签: What a ...
- HDU 5266 pog loves szh III (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 题目就是让你求LCA,模版题.注意dfs会栈溢出,所以要扩栈,或者用bfs写. #pragma ...
- Failed to execute query: Duplicate entry '0' for key 'PRIMARY'
今天在做php登陆和登出会插入数据到log表中,,结果报错了:如下: Failed to execute query: Duplicate entry '0' for key 'PRIMARY' SQ ...
- sql2008“备份集中的数据库备份与现有数据库不同”解决方法
因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一.右击系统数据库master,新建查询 执行以下SQL代码: RESTORE DA ...
- ADO.NET 快速入门(四):从数据库填充 DataSet
从数据库获取数据很容易,处理数据更容易.如果想要从数据库获取只进.只读的数据流结果集,你可以使用 DataReader 执行命令并且检索它.关于如何使用 DataReader,请参考:使用 OLE D ...
- 将Java程序作成exe文件的几种方法【转载】
看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...
- MyBatis之七:使用generator工具
可以将mybatis理解成一种半自动化orm框架,通过注解或者配置xml映射文件来手写相关sql语句,不能像我之前介绍orm的文章那样全对象化操作数据库增删改查.其实你会发现,手写配置xml映射文件是 ...
- HDU 1077Catching Fish(简单计算几何)
Catching Fish Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...