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;
}

P3660 [USACO17FEB]Why Did the Cow Cross the Road III G的更多相关文章

  1. 洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)

    题目背景 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 题目描述 The layout of Farmer ...

  2. 【题解】洛谷P3660 [USACO17FEB]Why Did the Cow Cross the Road III

    题目地址 又是一道奶牛题 从左到右扫描,树状数组维护[左端点出现而右端点未出现]的数字的个数.记录每个数字第一次出现的位置. 若是第二次出现,那么删除第一次的影响. #include <cstd ...

  3. P3660 【[USACO17FEB]Why Did the Cow Cross the Road III G】

    题外话:维护区间交集子集的小套路 开两个树状数组,一个维护进入区间,一个维护退出区间 $Query:$ 给定询问区间$l,r$和一些其他区间,求其他区间中与$[l,r]$交集非空的区间个数 用上面维护 ...

  4. [USACO17FEB]Why Did the Cow Cross the Road III G

    嘟嘟嘟 首先看到这种序列的问题,我就想到了逆序对,然后就想如何把这道题转化. 首先要满足这个条件:ai <bi.那么我们把所有数按第一次出现的顺序重新赋值,那么对于新的数列,一定满足了ai &l ...

  5. [USACO17FEB]Why Did the Cow Cross the Road III G (树状数组,排序)

    题目链接 Solution 二维偏序问题. 现将所有点按照左端点排序,如此以来从左至右便满足了 \(a_i<a_j\) . 接下来对于任意一个点 \(j\) ,其之前的所有节点都满足 \(a_i ...

  6. 洛谷 P3663 [USACO17FEB]Why Did the Cow Cross the Road III S

    P3663 [USACO17FEB]Why Did the Cow Cross the Road III S 题目描述 Why did the cow cross the road? Well, on ...

  7. [USACO17FEB]Why Did the Cow Cross the Road III P

    [USACO17FEB]Why Did the Cow Cross the Road III P 考虑我们对每种颜色记录这样一个信息 \((x,y,z)\),即左边出现的位置,右边出现的位置,该颜色. ...

  8. 洛谷 P3659 [USACO17FEB]Why Did the Cow Cross the Road I G

    //神题目(题目一开始就理解错了)... 题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's far ...

  9. [Luogu3659][USACO17FEB]Why Did the Cow Cross the Road I G

    题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of ...

随机推荐

  1. 利用GetPrivateProfileString读取配置文件(.ini)

    利用GetPrivateProfileString读取配置文件(.ini) 配置文件中经常用到ini文件,在VC中其函数分别为: 写入.ini文件:bool WritePrivateProfileSt ...

  2. 在Windows和MacOS下编译Lua

    官方说明: http://www.lua.org/manual/5.3/readme.html 在Windows下编译Lua动态链接库的注意事项: 1. 创建一个空的DLL项目: 2. 将src文件夹 ...

  3. Visual Studio编译Core程序部署到linux

    一.背景 随着微软拥抱开源,推出Net Core框架,目前已经支持跨平台,能部署到Linux.MacOS.Windows等系统上. 下面我们就来分享一下Visual Studio编译好的代码部署到Li ...

  4. 19_Python算法

    1.冒泡算法 list = [1, 5, 2, 6, 9, 3, 4, 0] print(len(list)) # conunt = 1 while conunt < len(list): fo ...

  5. Myeclipse 连接数据库(jdbc)

    1.找到DataBase Explorer,如下图所示: 2.点击下图红框内图标,new 3.进入下图界面 如果是JDBC驱动按下图配置: driver name自己起 url一定要注意:jdbc:m ...

  6. agumaster 分页方案

    本文例程下载:https://files.cnblogs.com/files/xiandedanteng/agumaster20200430-1.zip 之前的分页方案有点小瑕疵,这回修正了一下. 控 ...

  7. TCP三次握手、四次挥手理解及可能问为什么?

    三次握手:  TCP3次握手连接:浏览器所在的客户机向服务器发出连接请求报文(SYN标志为1),此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态. 服务器接收报文后,同意建立连接, ...

  8. JQuery的Ajax实现注册检测用户名

    Ajax(无需等待直接向服务器发起请求) (Asynchronous Javascript And Xml) :异步的 Google创新的一种js技术 实现方法一:比较原始没有封装的方法: //核对用 ...

  9. selenium+python对表格数据的操作

    一.直接获取整个表格数据,包含表头 def table_info(self): tr_data=[] table_data=[] css='id=>useradmin'#根据表格id找到表格 s ...

  10. linux下清空文件内容的3个命令

    1.使用echo "" > file_name,直接将空字符串重定向并覆盖到目标文件 2.使用cat /dev/null > file_name,读取dev目录下的一个 ...