Link

题意

给定长度为 \(2N\) 的序列,\(1~N\) 各处现过 \(2\) 次,i第一次出现位置记为\(ai\),第二次记为\(bi\),求满足\(ai<aj<bi<bj\)的对数.

转化一下题意:求 \(a_i - b_i\) 中出现次数为 \(1\) 的个数。

既然数据范围那么小,直接上莫队。

先预处理出每个数第一次出现以及第二次出现的位置。

然后就变成了我们熟悉的区间问题。就可以套用莫队的板子啦,

但最后答案要除以 二,因为 \((x,y)\) 这两个数对,你在 \(x\) 这个位置会算一遍,在 \(y\) 这个位置同样也会被算一遍。

可这个却只能算一遍,所以最后答案要除以二。

计算移动指针的贡献的时候,不要忘记计算移动前和移动后对现在答案的影响。

具体的细节可以看代码:

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e5+10;
int n,m,ans,tmp,l,r,block,x;
int pos[N],fir[N],sec[N],cnt[N],a[N];
struct node
{
int l,r,id;
}q[N];
inline int read()
{
int s = 0,w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
return s * w;
}
bool comp(node a,node b)
{
if(pos[a.l] == pos[b.l]) return a.r < b.r;
return pos[a.l] < pos[b.l];
}
void add(int x)
{
if(cnt[a[x]] == 0) tmp++;//如果说当前这个数在这段区间第一次出现,对答案的贡献加1
cnt[a[x]]++;
if(cnt[a[x]] == 2) tmp--;//出现两次对答案没有贡献
}
void del(int x)
{
if(cnt[a[x]] == 2) tmp++;//出现次数变为一次,就会对答案的贡献加1
cnt[a[x]]--;
if(cnt[a[x]] == 0) tmp--;//没有出现,对答案的贡献就会变为0
}
int main()
{
n = read(); block = sqrt(2 * n);
for(int i = 1; i <= 2 * n; i++)
{
a[i] = read();
if(fir[a[i]] == 0) fir[a[i]] = i;//求一个数第一次以及第二次出现的位置
else sec[a[i]] = i;
}
for(int i = 1; i <= 2 * n; i++) pos[i] = (i - 1) / block + 1;//分块预处理,注意是对序列分块
for(int i = 1; i <= n; i++)
{
q[i].l = fir[i];
q[i].r = sec[i];
q[i].id = i;
}
sort(q+1,q+n+1,comp);
l = 1, r = 0, tmp = 0;
for(int i = 1; i <= n; i++)//莫队板子
{
while(l < q[i].l) del(l++);
while(l > q[i].l) add(--l);
while(r < q[i].r) add(++r);
while(r > q[i].r) del(r--);
ans += tmp;
}
printf("%d\n",ans/2);//最后不要忘记除以二
return 0;
}

最新文章

  1. SQL入门语句之运算符
  2. [转]python问题:IndentationError:expected an indented block错误解决
  3. TreeMap按照value进行排序
  4. 创建 PDO 实例并在构造函数中设置错误模式
  5. subline 快捷键
  6. 2.3CUDA矩阵乘法
  7. Response.ContentType 详细列表 (转载)
  8. 关于socket的关闭:close和shutdown
  9. 大数据时代的精准数据挖掘——使用R语言
  10. Python教程(2.1)——控制台输入
  11. Abp(.NetCore)开发与发布过程2
  12. The C++ Programming Language 学习笔记 第四章 类型和声明
  13. 第九次java课堂笔记
  14. Pandas基础使用
  15. TTL是什么意思?
  16. ORA-01578 ORACLE data block corrupted (file # 29, block # 2889087)
  17. QT入门系列(3):控制台输出QString
  18. 铁乐学python_day22_面向对象编程4
  19. 用prerender-spa-plugin插件Vue项目优化SEO做ssr服务端渲染及预渲染
  20. c++基本

热门文章

  1. A little something to get you started(Hacker101 CTF)
  2. unity 4种实现动态障碍方法
  3. 如何把一个一般的git库变成“裸库”?
  4. 敏捷转型谁先动:老总,项目经理or团队
  5. Flutter Toast消息提示框插件
  6. 【Gin-API系列】守护进程和平滑重启(八)
  7. luogu P3796 【模板】AC自动机(加强版)
  8. [oracle/sql]关于清除重复,not in方案和not exists方案的对比
  9. websocket劫持
  10. leetcode刷题-51N皇后