HDU 4217
题型就是数据结构。给一个数组,然后又k次操作,每次操作给定一个数ki, 从数组中删除第ki小的数,要求的是k次操作之后被删除的所有的数字的和。
简单的思路就是,用1标记该数没有被删除,0表示已经被删除,对于找到第ki小的数, 只需要找到标记数组中第一个前缀和为ki的下标,又因为用来标记的数组的前缀和是不减数列,所以可以用二分来加速。这里值得注意的是,被删除后的数,不会第二次或者多次被找到,即每个数最多被找到一次,因为如果该数被删除了,而且该数所在下标的前缀和是ki,那么一定还存在一个更小的下标,使得它的前缀和也是ki, 而我们要找的就是第一次出现前缀和为ki的下标。还需要使用I64.
附上代码:
/*************************************************************************
> File Name: 4217.cpp
> Author: Stomach_ache
> Mail: sudaweitong@gmail.com
> Created Time: 2014年04月26日 星期六 21时51分19秒
> Propose: HDU 4217
************************************************************************/
//BIT + BinarySearch 复杂度 O(k * logn * logn)
//单点更新,区间求值, 用1表示该数没有被删除,0表示该数已经被删除
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define X first
#define Y second
#define MAX_N (262144 + 5)
typedef long long LL;
typedef pair<int, int> pii;
int n, k;
int c[MAX_N]; int
lowbit(int x) {
return x & (-x);
} LL
get_sum(int x) {
LL s = ;
while (x > ) {
s += c[x];
x -= lowbit(x);
} return s;
} void
update(int x, int v) {
while (x <= n) {
c[x] += v;
x += lowbit(x);
} return ;
} int
main(void) {
int T, cnt = ;
scanf("%d", &T);
while (T--) {
scanf("%d %d", &n, &k);
memset(c, , sizeof(c));
for (int i = ; i <= n; i++) {
update(i, );
}
LL ans = ;
for (int i = ; i < k; i++) {
int ki;
scanf("%d", &ki);
//只需要找到前缀和为ki对应的数,也就是第ki小的数
//此处为不减数列,所以使用二分来找到第一个前缀和为ki对应的数
int L = ki, R = n, tmp = L;
while (L <= R) {
int mid = L + (R - L) / ;
int s = get_sum(mid);
if (s < ki) {
L = mid + ;
} else {
if (s == ki) {
tmp = mid;
}
R = mid;
}
if (tmp == L && tmp == R) {
break;
}
}
ans += tmp;
update(tmp, -);
}
printf("Case %d: %I64d\n", cnt++, ans);
} return ;
}
HDU 4217的更多相关文章
- hdu 4217 Data Structure?/treap
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 可用线段树写,效率要高点. 这道题以前用c语言写的treap水过了.. 现在接触了c++重写一遍 ...
- hdu 4217 Data Structure? 树状数组求第K小
Data Structure? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 4217 Hamming Distance 随机化水过去
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU 2217 Data Structure?
C - Data Structure? Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- DNA sequence HDU - 1560
DNA sequence Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
随机推荐
- WhaleCTF之web-Find me
WhaleCTF之web-Find me 前往题目 Where is the flag?这是给我提示吗? 没思路,看看源码,说不定有惊喜 哇,在这里啊,得到flag~ flag:{This_is_s0 ...
- js中的自执行匿名函数 (function(){})()
JS函数有两种命名方式 1.声明式 声明式会导致函数提升,function会被解释器优先编译.即我们用声明式写函数,可以在任何区域声明,不会影响我们调用. function XXX(){} 2.函数表 ...
- Vue设置element的dialog
1.设置css:参考https://www.jianshu.com/p/a3eb60b75b92 <style> .el-dialog { max-height: 600px; displ ...
- cmd命令调用powershell脚本方法
cmd方法: powershell -command ". ('ps1脚本路径'); WriteInfo -param 'param参数值'" ps1脚本代码: function ...
- CSS作业问题 内容回顾
CSS作业问题 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- css上下左右居中
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 修改input标签输入样式
去掉input自带的边框: border-style:none;修改input输入的文字样式: input{ font-size: 24px; color:#5d6494; } 修改input框中占位 ...
- web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解
1.方法 getElementsByName() 获取name 可以获取一个数组类型数据(参数加引号) getElementsByTagName() 获取元素 getAttribute() 获取元 ...
- R330 打印机连供墨水红灯常量处理
墨水灯红灯常量,表示墨盒没墨水 1.按红灯,将墨盒移动到右侧空处 2.按住连供顶部的重置小按钮 15秒以上,复位(这个应该是让连供墨盒产生一个另外的墨盒序号,骗打印机换了个新墨盒) 3.按打印机红灯, ...
- go语言:获取字符串长度
go语言字符串底层由字节数组实现,使用UTF-8编码,初始化以后不能被修改 获取字符串长度 一.当字符串中所有字符都是单字节字符时,使用 len 函数获取字符串的长度 package main imp ...