热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hdu4217DataStructure?【二分+树状数组】

DataStructure?TimeLimit:100005000MS(JavaOthers)MemoryLimit:6553665536K(JavaOthers)T

Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3359    Accepted Submission(s): 1077


Problem Description Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently. Today let me introduce a data-structure-like problem for you.
Original, there are N numbers, namely 1, 2, 3...N. Each round, iSea find out the Ki-th smallest number and take it away, your task is reporting him the total sum of the numbers he has taken away.
 
Input The first line contains a single integer T, indicating the number of test cases.
Each test case includes two integers N, K, K indicates the round numbers. Then a line with K numbers following, indicating in i (1-based) round, iSea take away the Ki-th smallest away.

Technical Specification
1. 1 <= T <= 128
2. 1 <= K <= N <= 262 144
3. 1 <= Ki <= N - i + 1
 
Output For each test case, output the case number first, then the sum.  
Sample Input
2
3 2
1 1
10 3
3 9 1
 
Sample Output
Case 1: 3
Case 2: 14
 
Author iSea@WHU  
Source 首届华中区程序设计邀请赛暨第十届武汉大学程序设计大赛

题目大意:


给你N个数,从1~N,每次从中拿第ki小的数,然后去掉这个数,一共拿K次,问累加的和是多少。


思路:


一开始我们让数组都设定为1,表示各个数都没有被拿过,然后我们每一次拿的时候,二分一下树上剩余的第k个数的位子就行了。

过程维护一下即可。


Ac代码:

#include
#include
using namespace std;
int tree[400005];
int n,k;
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int sum=0;
while(x>0)
{
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
void add(int x,int c)
{
while(x<=n)
{
tree[x]+=c;
x+=lowbit(x);
}
}
int main()
{
int t;
int kase=0;
scanf("%d",&t);
while(t--)
{
memset(tree,0,sizeof(tree));
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)add(i,1);
long long int output=0;
for(int i=0;i {
int x;scanf("%d",&x);
int l=1;
int r=n;
int pos=-1;
while(r-l>=0)
{
int mid=(l+r)/2;
if(sum(mid)>=x)
{
if(sum(mid)==x)pos=mid;
r=mid-1;
}
else l=mid+1;
}
if(pos==-1)continue;
else output+=pos,add(pos,-1);
}
printf("Case %d: %lld\n",++kase,output);
}
}











推荐阅读
author-avatar
寒灵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有