hdu5249
这个是去年astar的题~
标准做法主席树,然而渣渣并不会(我确实叫zhazha。。。),
所以,他先离线,离散化,然后树状数组+二分水过了。。。。
离线的目的主要是为了离散化,剩下的就和用一个树状数组维护一个数之前有多少个数比他小差不多~~
二分答案+树状数组求和判断即可,注意二分何时终止~~(复杂度O(nlognlogn))
#include <bits/stdc++.h> using namespace std;
const int maxn = + ;
int n, a[maxn], input[maxn], c[maxn];
char str[maxn][]; int flag[maxn]; map<int, int> mp; inline int lowbit(int x){
return x & (-x);
} int sum(int x){
int ret = ;
while(x > ){
ret += c[x];
x -= lowbit(x);
}
return ret;
} void add(int x, int d){
while(x <= n){
c[x] += d;
x += lowbit(x);
}
} void solve(int p){
int left = , right = n+; while(left+<right){
int mid = (left + right)/;
int sum1 = sum(mid);
//cout << "mid: " << mid << " sum: " << sum1 << endl; if( sum1 > p ){
right = mid;
}else if( sum1 < p ){
left = mid;
}else{
if(flag[mid] == ){
printf("%d\n", a[mid]);
return;
}else{
right = mid;
}
}
}
} queue<int> q; int main(void){
int cas = ;
while(scanf("%d", &n) != EOF){
int len = , num;
for(int i = ; i < n; ++i){
scanf("%s", str[i]);
if(str[i][] == 'i'){
scanf("%d", &num);
input[++len] = num;
a[len] = num;
}
} //离散化
sort(a+, a+len+);
mp.clear();
for( int i = ; i <= len; ++i ){
mp[a[i]] = i;
} memset(c, , sizeof(c));
memset(flag, , sizeof(flag)); while(!q.empty())
q.pop(); printf("Case #%d:\n", cas++);
int sz = , cnt = ;
for( int i = ; i < n; ++i ){
if( str[i][] == 'i' ){
num = input[++cnt];
q.push(num);
sz++;
num = mp[num];
add(num, );
flag[num] = ;
}else if( str[i][] == 'q' ){
int p = sz/+;
//cout << "p: " << p << endl;
solve(p);
}else{
sz--;
num = q.front();
q.pop();
num = mp[num];
add(num, -);
flag[num] = ;
}
}
} return ;
} /**
11
in 32
in 16
in 87
out
in 96
in 34
query
out
out
in 3687
query
*/
hdu5249的更多相关文章
- 无序数组的中位数(set+deque)hdu5249
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 划分树 poj2104 hdu5249
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu5249 Tricks Device(网络流最大匹配)
分析题意可知: 1.最少须要切断多少边使吴不能找到张(题意吴仅仅能走最短路径上面的边),对从起点到终点的最短路径又一次建图,每条边的权值为1.求最大流就可以 2.在吴能够找到张的前提下,最多能够切断边 ...
- [hdu5249]动态中位数
题意:3种操作分别为入队,出队,查询当前队列的中位数.操作数为1e5数量级. 思路:先考虑离线算法,可以离散+线段树,可以划分树,考虑在线算法,则有treap名次树,SBtree(size balan ...
随机推荐
- 白盒-CNN纹理深度可视化: 使用MIT Place 场景预训练模型
MIT发文:深度视觉的量化表示................ Places2 是一个场景图像数据集,包含 1千万张 图片,400多个不同类型的场景环境,可用于以场景和环境为应用内容的视觉认知任务. ...
- java实例1
1.满天星星 import java.awt.*; public class xinxin { public static void main(String[] args) { Frame w = n ...
- C# 控件调整
//最大化 this.WindowState = FormWindowState.Maximized; //去掉标题栏 this.FormBorderStyle = FormBorderStyle.N ...
- linq 升序排序 空值放后面并根据另一个字段进行多重排序
List<PickingInfo> res = GetDatas(); var _d = (from e in res select new { aa = e.pickingLibrary ...
- cf 337 div2 c
C. Harmony Analysis time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- [nodejs]在mac环境下如何将node更新至最新?
在mac下安装angular-cli时,报出较多错误.初步怀疑是因为node环境版本过低导致. 在mac下,需要执行如下几步将node更新至最新版本,也可以更新到指定版本 1. sudo npm ca ...
- 【codeforces 509E】Pretty Song
[题目链接]:http://codeforces.com/contest/509/problem/E [题意] 让你计算一个字符串的所有子串里面元音字母出现的频率的和; [题解] 先处理出前缀和-&g ...
- mybatis源码阅读-初始化过程(七)
说明 mybatis初始化过程 就是解析xml到封装成Configuration对象 供后续使用 SqlSessionFactoryBuilder 代码例子 SqlSessionFactoryBuil ...
- hdu 4786 最小生成树与最大生成树
/* 题意 :有一些边权值为1和0,判断是否存在一个生成树使得他的总权值为一个斐波那契数. 解法:建立一个最小生成树向里面加权值为1的边替换为0的边,保证原来的联通.因为权值为1,可直接求出最大生成树 ...
- 【ACM】nyoj_132_最长回文子串_201308151713
最长回文子串 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串连续出现的字符串片段.回文的含义是:正着看和 ...