#424 Div2 E
#424 Div2 E
题意
给出一个 n 个数的数列,从前往后取数,如果第一个数是当前数列的最小值,则取出,否则将它放到数列尾端,问使数列为空需要多少步操作。
分析
用数据结构去模拟。
线段树维护区间最小值及取得最小值的位置。树状数组维护仍存在的数的个数( 1 表示未取,0 表示已取)。
首先寻找全局最小值,那么答案加上它前面的存在的数的个数,然后删掉这个值,(在线段树中将这个值置为无穷大等价于删除掉它)。
设这个前面删掉的最小值位置为 idx,那么再从 idx+1 往后找,是否存在全局最小值。
如果存在下标为 pos ,那么答案加上区间 (idx, pos] 仍然存在的数的个数(使用树状数组计算),再把 idx 置为 pos。
如果不存在,答案加上 (idx, n] 仍然存在的数的个数,退出当前循环,从头开始找(即把 idx 置为 0)。
code
#include<bits/stdc++.h>
#define lson l, m, rt * 2
#define rson m + 1, r, rt * 2 + 1
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
const int INF = 2e9 + 1;
int a[MAXN];
struct BIT {
int f[MAXN];
void add(int p, int c) {
while(p <= MAXN) {
f[p] += c;
p += (p & -p);
}
}
int query(int p) {
int s = 0;
while(p) {
s += f[p];
p -= (p & -p);
}
return s;
}
} bit;
struct ST {
struct node {
int id, val;
node() {}
node(int id_, int val_):id(id_), val(val_) {}
} ary[MAXN << 2];
node pushUp(node& nd, int rt) {
if(ary[2 * rt].val <= ary[2 * rt + 1].val) {
nd.id = ary[2 * rt].id;
nd.val = ary[2 * rt].val;
} else {
nd.id = ary[2 * rt + 1].id;
nd.val = ary[2 * rt + 1].val;
}
}
void build(int l, int r, int rt) {
if(l == r) {
ary[rt].id = l;
ary[rt].val = a[l];
return;
}
int m = (l + r) / 2;
build(lson);
build(rson);
pushUp(ary[rt], rt);
}
void query(int L, int R, int& pos, int& res, int l, int r, int rt) {
if(L <= l && R >= r) {
if(ary[rt].val < res) {
res = ary[rt].val;
pos = ary[rt].id;
}
return;
}
int m = (l + r) / 2;
if(L <= m) query(L, R, pos, res, lson);
if(R > m) query(L, R, pos, res, rson);
}
void update(int p, int val, int l, int r, int rt) {
if(l == r) {
ary[rt].val = val;
return;
}
int m = (l + r) / 2;
if(m < p) update(p, val, rson);
else update(p, val, lson);
pushUp(ary[rt], rt);
}
} st;
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
bit.add(i, 1);
}
st.build(1, n, 1);
ll ans = 0;
for(int T = 0; T < n;) {
for(int idx = 0; idx < n && T < n;) {
int minV = INF, minv = INF, posV, posv;
st.query(1, n, posV, minV, 1, n, 1);
st.query(idx + 1, n, posv, minv, 1, n, 1);
if(minv != minV) {
ans += bit.query(n) - bit.query(idx);
break;
}
ans += bit.query(posv) - bit.query(idx);
st.update(posv, INF, 1, n, 1);
bit.add(posv, -1);
T++;
idx = posv;
}
}
cout << ans << endl;
return 0;
}
#424 Div2 E的更多相关文章
- #424 Div2 C
#424 Div2 C 题意 给出 k 个分数,初始分数未知,按顺序把这 k 个分数加到初始分数上,已知 n 个加入分数后的结果(无序),问初始分数有多少种可能. 分析 也就是说这 n 个结果,它们之 ...
- Codeforces Round #424 Div2 E. Cards Sorting
我只能说真的看不懂题解的做法 我的做法就是线段树维护,毕竟每个数的顺序不变嘛 那么单点维护 区间剩余卡片和最小值 每次知道最小值之后,怎么知道需要修改的位置呢 直接从每种数维护的set找到现在需要修改 ...
- codeforces round #424 div2
A 暴力查询,分三段查就可以了 #include<bits/stdc++.h> using namespace std; ; int n, pos; int a[N]; int main( ...
- #424 Div2 Problem C Jury Marks (二分 && 暴力 && std::unique && 思维)
题目链接 :http://codeforces.com/contest/831/problem/C 题意 :选手有一个初始积分,接下来有k个裁判为他加分或减分(时间顺序给出),然后告诉你n(1< ...
- bc#54 div2
用小号做的div2 A:竟然看错了排序顺序...白白WA了两发 注意读入一整行(包括空格):getline(cin,st) [gets也是资瓷的 #include<iostream> us ...
- $('div a') 与$('div>a'),.div+.div2与.div~.div2
$('div a'):div标签下所有层次a元素的jquery对象 $('div>a'):div标签下子元素层次a元素的jquery对象 <body> <div class=' ...
- SRM 657 DIV2
-------一直想打SRM,但是感觉Topcoder用起来太麻烦了.题目还是英文,不过没什么事干还是来打一打好了.但是刚注册的号只能打DIV2,反正我这么弱也只适合DIV2了.. T1: 题目大意: ...
- CodeForces Round 192 Div2
This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...
- Codeforce Round #211 Div2
真的是b到不行啊! 尼玛C题一个这么简单的题目没出 aabbccddee 正确的是aabccdee 我的是 aabcdee 硬是TM的不够用,想半天还以为自己的是对的... A:题... B:题. ...
随机推荐
- 《Cracking the Coding Interview》——第4章:树和图——题目9
2014-03-19 05:07 题目:给定一棵二叉树T和一个值value,在T中找出所有加起来和等于value的路径.路径的起点和终点都可以是树的任意节点. 解法:我偷了个懒,直接把这棵树看成一个无 ...
- Python 实现MD5加密
from hashlib import md5 def encrypt_md5(s): # 创建md5对象 new_md5 = md5() # 这里必须用encode()函数对字符串进行编码,不然会报 ...
- fiddler如何抓取夜神模拟器上的包
一.设置Fiddler代理 1.点击Tools-Fiddler Options进入Fiddler Options页面 2.点击Connections,将Fiddler listens on port设 ...
- 孤荷凌寒自学python第二十一天初识python的类
孤荷凌寒自学python第二十一天初识python的类 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 类是面向对象的编程语言非常重要的概念. 编程语言的进化史中从顺序编程到结构化编程,最后才 ...
- 立体匹配之Census Transform
1.立体匹配算法主要可分为两大类:基于局部约束和基于全局约束的立体匹配算法. (一)基于全局约束的立体匹配算法:在本质上属于优化算法,它是将立体匹配问题转化为寻找全局能量函数的最优化问题,其代表算法主 ...
- css background-size与背景图片填满div
background-size与背景图片填满div 在开发中,常有需要将一张图片作为一个div的背景图片充满div的需求 background-size的取值及解释 background-size共有 ...
- python request模板
# -*- coding: utf-8 -*- import time import requests class Request: def __init__(self): self.s=reques ...
- 百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统
这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前 ...
- noi2017 T1 整数 ——线段树
loj.ac上有 题目传送门 不过我还是把题目搬过来吧 整数(integer)[题目背景]在人类智慧的山巅,有着一台字长为 1048576 位的超级计算机,著名理论计算机科 学家 P 博士正用它进行 ...
- .net framework 2.0使用扩展方法
.net framework中使用扩展方法,由网摘上看到,是因为编译器将扩展方法带上了ExtensionAttribute特性 要在.net framework 2.0中使用的话,可以自定义一个特性: ...