【题解】洛谷P1975排序
分块,注意重复的值之间的处理。跟普通分块的操作一样的啦,具体可以参见‘不勤劳的图书管理员’。
#include <bits/stdc++.h>
using namespace std;
#define maxn 500000
#define lowbit(i) i & (-i)
#define int long long
int n, m, cnt, ans, B, c[][maxn];
struct node
{
int num, id, rank;
}a[]; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} int Get_ans(int x, int y)
{
if(a[x].rank < a[y].rank) return ;
else if(a[x].rank > a[y].rank) return -;
return ;
} bool cmp1(node a, node b)
{
if(a.num != b.num) return a.num < b.num;
return a.id < b.id;
} bool cmp2(node a, node b)
{
return a.id < b.id;
} void update(int opt, int x, int sum)
{
if(!x) return;
for(int i = x; i <= cnt; i += lowbit(i))
c[opt][i] += sum;
} int query(int opt, int x)
{
if(x < ) return ;
int ans = ;
for(int i = x; i; i -= lowbit(i))
ans += c[opt][i];
return ans;
} signed main()
{
n = read();
B = sqrt(n);
for(int i = ; i <= n; i ++)
a[i].num = read(), a[i].id = i;
sort(a + , a + + n, cmp1);
a[].rank = ;
for(int i = ; i <= n; i ++)
if(a[i].num == a[i - ].num) a[i].rank = a[i - ].rank;
else a[i].rank = ++ cnt;
sort(a + , a + + n, cmp2);
for(int i = ; i <= n; i ++)
update(i / B, a[i].rank, );
for(int i = n; i >= ; i --)
{
ans += query(n / B + , a[i].rank - );
update(n / B + , a[i].rank, );
}
m = read();
cout << ans << endl;
for(int i = ; i <= m; i ++)
{
int x = read(), y = read();
if(x > y) swap(y, x);
int p = x / B, q = y / B;
if(a[x].rank < a[y].rank) ans ++;
else if(a[x].rank > a[y].rank) ans --;
if(p == q)
{
for(int i = x + ; i < y; i ++)
ans += Get_ans(x, i) + Get_ans(i, y);
swap(a[x], a[y]);
printf("%lld\n", ans);
continue;
}
for(int i = x + ; i < (p + ) * B; i ++)
if(i <= n) ans += Get_ans(x, i) + Get_ans(i, y);
for(int i = q * B; i < y; i ++)
ans += Get_ans(i, y) + Get_ans(x, i);
for(int i = p + ; i < q; i ++)
{
ans = (ans - query(i, a[x].rank - ) + query(i, a[y].rank - ));
ans = (ans - query(i, a[x].rank) + query(i, a[y].rank));
}
update(p, a[x].rank, -), update(q, a[y].rank, -);
update(q, a[x].rank, ), update(p, a[y].rank, );
swap(a[x], a[y]);
printf("%lld\n", ans);
}
return ;
}
【题解】洛谷P1975排序的更多相关文章
- 洛谷——P1347 排序
洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们 ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
随机推荐
- 关于antd-mobile中列表上拉加载PullToRefresh的使用
相信有很多小伙伴发现antd-mobile中的下拉刷新组件,也发现例子挺难的,其实这个组件并没有那么复杂,只是demo例子不好理解,给大家提供一个简单的demo,或许可以帮到你 上拉刷新下拉加载 - ...
- canvas实现半圆环形进度条
html部分 <canvas id="canvas" width="150" height="150"> <p>抱歉 ...
- flask钩子
请求钩子 从请求到响应的过程中,设置了一些方法来实现某些功能 before_first_request 在处理第一个请求前运行 before_request 在每次请求前运行 after_re ...
- 记一次MD5妙用
记一次MD5妙用 最近项目组中在做历史记录的改造工作,主持讨论了多次,但每次讨论完都觉的很完美了,但实际在写这部分逻辑的时候还是会发现一些问题出来,很难受,反反复复的暴露智商是硬伤,人艰不拆,暂先不扯 ...
- go学习笔记-包处理
包处理 package是go管理代码的重要工具,用于组织 Go 源代码,提供了更好的可重用性与可读性. 可见性 变量或函数名的首字母大写时,其就是可导出的,小写时则是不可导出的. 函数和变量的可访问性 ...
- MySQL分区的限制(最多有多少个分区)
MySQL分区的限制 • 只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列 • 最大分区数目不能超过1024 • 如果含有唯一索引或者主键,则分区列必须包含在所有的唯一 ...
- python操作nosql数据库之memcache
一.memcache的安装 1.memcache简介 Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象减少读取数据库的次数,从而 ...
- python语句和语法
python语句和语法 python程序结构: 1.程序由模块构成. 2.模块包含语句. 3.语句包含表达式. 4.表达式建立并处理对象. python的语法实质上是有语句和表达式组成的.表达式处理对 ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- Java与C++进行系统间交互:Protocol Buffer
在一次项目中,因笔者负责的java端应用需要与公司C++系统进行交互,公司选定Protocol Buffer方案,故简单的了解一下 有需要的可以看一下其他作者的文章,了解一下Protobuf: htt ...