题目链接:http://codeforces.com/contest/830/problem/B

题解:其实这题就是求当前大小的数到下一个大小的数直接有多少个数,这时候可以利用数据结构来查询它们之间有几个数优先往后面找如果后面没了再轮到前面找。可以开始将每个数的下表定为1然后拿掉之后就为0然后两值之间有几个数就用区间求和来求。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 1e5 + ;
typedef long long ll;
int a[M] , b[M];
struct TGP {
int Min , pos;
TGP() {}
TGP(int Min , int pos):Min(Min), pos(pos) {}
};
struct TnT {
int l , r , sum;
TGP gp;
}T[M << ];
void push_up(int i) {
T[i].sum = T[i << ].sum + T[(i << ) | ].sum;
if(T[i << ].gp.Min <= T[(i << ) | ].gp.Min) {
T[i].gp = T[i << ].gp;
}
else T[i].gp = T[(i << ) | ].gp;
}
void build(int l , int r , int i) {
int mid = (l + r) >> ;
T[i].l = l , T[i].r = r;
if(l == r) {
T[i].gp.Min = a[l];
T[i].gp.pos = l;
T[i].sum = ;
return ;
}
build(l , mid , i << );
build(mid + , r , (i << ) | );
push_up(i);
}
void update(int pos , int i) {
int mid = (T[i].l + T[i].r) >> ;
if(T[i].l == T[i].r && T[i].l == pos) {
T[i].gp.Min = inf;
T[i].sum = ;
return ;
}
if(pos > mid) update(pos , (i << ) | );
else update(pos , i << );
push_up(i);
}
TGP query(int l , int r , int i) {
int mid = (T[i].l + T[i].r) >> ;
if(T[i].l == l && T[i].r == r) {
return T[i].gp;
}
if(mid < l) return query(l , r , (i << ) | );
else if(mid >= r) return query(l , r , i << );
else {
TGP a1 = query(l , mid , i << ) , a2 = query(mid + , r , (i << ) | );
if(a1.Min > a2.Min) return a2;
else return a1;
}
}
int getsum(int l , int r , int i) {
int mid = (T[i].l + T[i].r) >> ;
if(T[i].l == l && T[i].r == r) {
return T[i].sum;
}
if(mid < l) return getsum(l , r , (i << ) | );
else if(mid >= r) return getsum(l , r , i << );
else return getsum(l , mid , i << ) + getsum(mid + , r , (i << ) | );
}
int main() {
int n;
scanf("%d" , &n);
for(int i = ; i <= n ; i++) scanf("%d" , &a[i]) , b[i] = a[i];
sort(b + , b + n + );
build( , n , );
ll ans = ;
int now = ;
for(int i = ; i <= n ; i++) {
TGP gg = query(now , n , );
//cout << gg.Min << ' ' << gg.pos << endl;
if(gg.Min == b[i]) {
ans += getsum(now , gg.pos , );
//cout << "ans: " << ans << endl;
now = gg.pos + ;
if(now > n) now = ;
update(gg.pos , );
}
else {
TGP gb = query( , now , );
//cout << gb.Min << ' ' << gb.pos << endl;
if(gb.Min == b[i]) {
ans += getsum(now , n , );
ans += getsum( , gb.pos , );
now = gb.pos + ;
if(now > n) now = ;
update(gb.pos , );
}
}
}
printf("%lld\n" , ans);
return ;
}

最新文章

  1. SQL分页语句三方案
  2. CQRS, Task Based UIs, Event Sourcing agh!
  3. Unable to load performance pack. Using Java I/O instead的解决办法?
  4. Python——functools
  5. Xcode 移除(卸载)插件
  6. ORACLE恢复删除的数据
  7. Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation
  8. WinCE隐藏显示任务栏,当任务栏隐藏时将其显示,当任务栏显示时将其隐藏(FindWindow,ShowWindow,IsWindowVisible),
  9. windows phone (25) Canvas元素B
  10. 谈谈webpack 的优势
  11. 【C#入门教案-02】用记事本编写第一个C#程序-Hello World
  12. 根据地址查询经纬度Js
  13. python3 set(集合)
  14. 【ABP】工作单元——不进行事物独立执行功能
  15. Linux中Root密码破解
  16. delphi中退出是弹出让你确定的几种确定对话框怎么写?
  17. AJAX基础知识点学习
  18. ireport 添加行自增序号
  19. Jmeter(二十二)Jmeter-Question之“不同线程组之间传递变量”
  20. a标签属性 rel=noopener noreferrer

热门文章

  1. 【Python-Django】Jinja2模板引擎配置教程详解!!!!
  2. Hadoop 系列(七)—— HDFS Java API
  3. Spring Cloud 之 Stream.
  4. C#的委托事件总结
  5. powerdesign进军(三)--mysql驱动配置
  6. 测试自动化:java+selenium3 UI自动化(1) - 环境搭建
  7. 记一次 Windows MySQL 恢复
  8. 【redis】redis基础命令学习集合
  9. HelloDjango 第 09 篇:让博客支持 Markdown 语法和代码高亮
  10. Mac 打造开发工作环境