嘟嘟嘟

首先看到这种序列的问题,我就想到了逆序对,然后就想如何把这道题转化。

首先要满足这个条件:ai <bi。那么我们把所有数按第一次出现的顺序重新赋值,那么对于新的数列,一定满足了ai < bi。

因为要转换成逆序对,所以先出现的数赋成更大的值,得到了ai > bi。

接下来的操作都是在新的序列上进行的:像原来求逆序对一样从后往前扫,则扫到的第一个数实际上是该数第二次出现,这时候统计已经出现的比他小的数的个数,那么这些数和它构成的数对满足要求,累加到答案中。然后为了以后的查询,在树状数组上给这个数所在的位置加1。

如果遇到了第二次出现的数,我们就在树状数组上给这个数所在的位置减1,相当于清除这个数,不用来更新答案。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-;
const int maxn = 5e4 + ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch)) {ans = ans * + ch - ''; ch = getchar();}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} int n, a[maxn << ];
int id[maxn], cnt = ;
bool vis[maxn];
ll ans = ; int c[maxn];
int lowbit(int x)
{
return x & -x;
}
void add(int pos, int d)
{
for(; pos <= n; pos += lowbit(pos)) c[pos] += d;
}
int query(int pos)
{
int ret = ;
for(; pos; pos -= lowbit(pos)) ret += c[pos];
return ret;
} int main()
{
n = read(); cnt = n;
for(int i = ; i <= (n << ); ++i) a[i] = read();
for(int i = ; i <= (n << ); ++i) if(!id[a[i]]) id[a[i]] = cnt--; //倒序赋值
for(int i = (n << ); i; --i)
{
if(!vis[id[a[i]]])
{
vis[id[a[i]]] = ;
ans += query(id[a[i]]);
add(id[a[i]], );
}
else add(id[a[i]], -);
}
write(ans), enter;
return ;
}

最新文章

  1. 配置mysql允许远程连接的方法
  2. 深入NSQ 之旅[转载]
  3. 【整理】--【字符设备】分配设备号register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
  4. 【Hihocoder】1014 : Trie树
  5. Linux 4.6分支已到生命尽头 请尽快升级至Linux 4.7.1
  6. lstm的debug模式下编译不行貌似
  7. 友盟分享--集成QQ和微信
  8. QTP关于AOM的Javascript启动方式
  9. std::vector的分片拷贝和插入
  10. JSON.parse这个是啥?
  11. Macbook怎么强制关闭后台程序?Macbook强制关闭后台程序的方法
  12. 201521123026 《Java程序设计》第4周学习总结
  13. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-10项目各种全局帮助类
  14. javascrip学习之 数据类型和变量
  15. win10 安装 open live write
  16. Codeforce 835B - The number on the board (贪心)
  17. WINRAR 自解压脚本命令及变量
  18. css之IE hack 方法[ IE6 - IE9]
  19. 2016/2/13 《计算机系统要素》(The Elements of Computing Systems)读书笔记(1)
  20. Servlet笔记6--Servlet程序改进

热门文章

  1. java se系列(三) 顺序语句、if...else、switch、While、do-while、for、break、continue
  2. Epplus导出Excel(DataTable)
  3. linux 命令之重定向
  4. java泛型中的各种限制
  5. 如何在ThinkPHP中开启调试模式
  6. React.js 小书 Lesson9 - 事件监听
  7. Python快速入门_1
  8. 【Linux】Linux系统启动过程
  9. [转]Razor里写函数
  10. UiPath进阶