[ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)
\(\\\)
\(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)相关推荐
- bzoj 4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III(Pu1 2018.10.1)
算法:dfs,连通块 难度:NOIP 题解:搜索出每个连通块,找到每个连通块里有几头牛.然后每个连通块内牛数量相乘,求和即为正解 不清楚luogu题解中的代码明明MLE了,却还能AC??? 代码如下: ...
- [BZOJ4994] [Usaco2017 Feb]Why Did the Cow Cross the Road III(树状数组)
传送门 1.每个数的左右位置预处理出来,按照左端点排序,因为左端点是从小到大的,我们只需要知道每条线段包含了多少个前面线段的右端点即可,可以用树状数组 2.如果 ai < bj < bi, ...
- 【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 样例输 ...
- BZOJ 4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
本来想做一道搜索 最后发现是一道并查集的水题 如果两个邻格之间没有路 就把他们合并就行了 #include <cstdio> #include <cstring> #inclu ...
- BZOJ4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III
欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4997 题意概括 在n*n的区域里,每一个1*1的块都是一个格子. 有k头牛在里面. 有r个篱笆把格 ...
- bzoj4997 [Usaco2017 Feb]Why Did the Cow Cross the Road III(bfs)
枚举每一个起点,bfs能访问到几头牛即可.复杂度O(n3)O(n^3) #include <cstdio> #include <cstring> #include <al ...
- bzoj 4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III
题意: 给你一个n*n的地图 某对相邻的点中间有墙. 然后给你n个坐标,问你有多少对坐标不可以互相到达. 题解: 至今为止,提交记录就只有1个WA的-- 随便暴力做一下就好了.
- bzoj4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III
题意 给你一个n*n的地图 一开始两个相邻的点是有边的的 然后告诉你,某对相邻的点没有边了 然后给你n个坐标,问你有多少对坐标不可以互相到达 题解 随便暴力做一下就好了 至今为止,提交记录就只有1个W ...
- [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$第一次出现 ...
最新文章
- 源码|批量执行invokeAll()多选一invokeAny()
- VC++ 解析JSON 学习总结
- 缓冲区Buffer-Buffer操作基本API
- sublime php语法检查
- Bailian2710 数制转换(POJ NOI0113-01)【进制】
- 【算法与数据结构】哈希表-链地址法
- cuda-gdb 调试python中的module/cu文件
- MFC程序设计——标尺的例子
- 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
- Spring核心是什么
- python 京东签到_Python实战—京东用户行为分析
- HGET key field
- [Qt]QLabel的显示圆形
- 超分辨率技术:Adobe Photoshop与深度神经网络对比
- 荣耀4a android art,荣耀4A黑科技大揭秘,真是给工程师给跪了!!
- 进程管理API之find_get_pid
- 3Dmax Script 自动减面
- ceres学习笔记(四)
- Photoshop如何修改图片的颜色
- 【数据结构】带头结点的单链表
热门文章
- left join 与left outer join的区别
- 数据库中间件支持数据库集群方案
- iOS:网络编程解析协议一:HTTP超文本传输协议
- [BZOJ 1098] [POI2007] 办公楼biu 【链表优化BFS】
- ORACLE 11GR2 RAC的网络规划解析
- 美好生活从java开始
- 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
- jQ.Mobi框架介绍
- Spring3.1+SpringMVC3.1+JPA2.0
- LINQ学习(六):OrderBy/Group By子句