\(\\\)

\(Description\)


给定长度为\(2N\)的序列,\(1\text ~N\)各出现过\(2\)次,\(i\)第一次出现位置记为\(a_i\),第二次记为\(b_i\),求满足\(a_i<a_j<b_i<b_j\)的\((i,j)\)对数。

  • \(N\in [1,10^5]\)

\(\\\)

\(Solution\)


考虑以一个数作为\(i\)出现在答案里,对应的\(j\)应满足\(a_j\in (a_i,b_i),b_j>b_i\)。也就是说,我们需要对每一个数统计它两次出现的位置构成的区间里,有多少个数字是第一次出现。

考虑树状数组的做法,第一次遇到一个数时,在出现位置打标记,记录下这个数第一次出现的位置,便于询问。

当第二次遇到这个数时,直接查询区间\((a_i,b_i)\)的区间和即可。因为这个数已经出现了两次,不能对后续的询问做出贡献了,所以要将之前的打标记处撤销标记。

\(\\\)

\(Code\)


#include<map>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 50010
#define R register
#define gc getchar
using namespace std;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}int n,ans,p[N];struct BIT{int c[N];inline int lowbit(int x){return x&-x;}inline void add(int p,int x){for(;p<=n;p+=lowbit(p))c[p]+=x;}inline int sum(int p){int res=0;for(;p;p-=lowbit(p)) res+=c[p];return res;}
}bit;int main(){n=rd()<<1;for(R int i=1,x;i<=n;++i){x=rd();if(!p[x]) bit.add((p[x]=i),1);else ans+=bit.sum(i)-bit.sum(p[x]),bit.add(p[x],-1);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9740980.html

[ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)相关推荐

  1. bzoj 4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III(Pu1 2018.10.1)

    算法:dfs,连通块 难度:NOIP 题解:搜索出每个连通块,找到每个连通块里有几头牛.然后每个连通块内牛数量相乘,求和即为正解 不清楚luogu题解中的代码明明MLE了,却还能AC??? 代码如下: ...

  2. [BZOJ4994] [Usaco2017 Feb]Why Did the Cow Cross the Road III(树状数组)

    传送门 1.每个数的左右位置预处理出来,按照左端点排序,因为左端点是从小到大的,我们只需要知道每条线段包含了多少个前面线段的右端点即可,可以用树状数组 2.如果 ai < bj < bi, ...

  3. 【bzoj4994】[Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组

    题目描述 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 样例输入 4 3 2 4 4 1 3 2 1 样例输 ...

  4. BZOJ 4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III

    本来想做一道搜索 最后发现是一道并查集的水题 如果两个邻格之间没有路 就把他们合并就行了 #include <cstdio> #include <cstring> #inclu ...

  5. BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4997 题意概括 在n*n的区域里,每一个1*1的块都是一个格子. 有k头牛在里面. 有r个篱笆把格 ...

  6. bzoj4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III(bfs)

    枚举每一个起点,bfs能访问到几头牛即可.复杂度O(n3)O(n^3) #include <cstdio> #include <cstring> #include <al ...

  7. bzoj 4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III

    题意: 给你一个n*n的地图 某对相邻的点中间有墙. 然后给你n个坐标,问你有多少对坐标不可以互相到达. 题解: 至今为止,提交记录就只有1个WA的-- 随便暴力做一下就好了.

  8. bzoj4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III

    题意 给你一个n*n的地图 一开始两个相邻的点是有边的的 然后告诉你,某对相邻的点没有边了 然后给你n个坐标,问你有多少对坐标不可以互相到达 题解 随便暴力做一下就好了 至今为止,提交记录就只有1个W ...

  9. [bzoj4994][Usaco2017 Feb]Why Did the Cow Cross the Road III_树状数组

    Why Did the Cow Cross the Road III bzoj-4994 Usaco-2017 Feb 题目大意:给定长度为$2N$的序列,$1~N$各处现过$2$次,$i$第一次出现 ...

最新文章

  1. 源码|批量执行invokeAll()多选一invokeAny()
  2. VC++ 解析JSON 学习总结
  3. 缓冲区Buffer-Buffer操作基本API
  4. sublime php语法检查
  5. Bailian2710 数制转换(POJ NOI0113-01)【进制】
  6. 【算法与数据结构】哈希表-链地址法
  7. cuda-gdb 调试python中的module/cu文件
  8. MFC程序设计——标尺的例子
  9. 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
  10. Spring核心是什么
  11. python 京东签到_Python实战—京东用户行为分析
  12. HGET key field
  13. [Qt]QLabel的显示圆形
  14. 超分辨率技术:Adobe Photoshop与深度神经网络对比
  15. 荣耀4a android art,荣耀4A黑科技大揭秘,真是给工程师给跪了!!
  16. 进程管理API之find_get_pid
  17. 3Dmax Script 自动减面
  18. ceres学习笔记(四)
  19. Photoshop如何修改图片的颜色
  20. 【数据结构】带头结点的单链表

热门文章

  1. left join 与left outer join的区别
  2. 数据库中间件支持数据库集群方案
  3. iOS:网络编程解析协议一:HTTP超文本传输协议
  4. [BZOJ 1098] [POI2007] 办公楼biu 【链表优化BFS】
  5. ORACLE 11GR2 RAC的网络规划解析
  6. 美好生活从java开始
  7. 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
  8. jQ.Mobi框架介绍
  9. Spring3.1+SpringMVC3.1+JPA2.0
  10. LINQ学习(六):OrderBy/Group By子句