题目链接:西安:https://nanti.jisuanke.com/t/20759   (计蒜客的数据应该有误,题目和 LOJ 的大同小异,题解以 LOJ 为准)

        LOJ:https://loj.ac/problem/6062

题意:给出一个长度为n的数列a_i和一个长度为m的数列b_i求a_i有多少个长度为m的连续子数列能与b_i匹配。 两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当且仅当它们的和不小于h。

题解:先对 b 数组进行排序,建一颗线段树,将 b 数组中位置为 i 的数初始化为 -i ,那么当 [1,m] 中最小值大于等于 0 时即可匹配。枚举 a 的左端点,同时记录满足条件的最小右端点,当右端点 - 左端点 = m 时子区间满足条件 ans++。(西安现场赛的题则记录左端点可以匹配的最小右端点即可)

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 15e4 + ;
const int MAXM = 2e6 + ; int a[MAXN], b[MAXN];;
int st[MAXN << ], lazy[MAXN << ]; void pushup(int rt) {
st[rt] = min(st[rt << ],st[rt << | ]);
} void build(int rt,int l,int r) {
if(l == r) {
st[rt] = -l;
return ;
}
int mid = (l + r) >> ;
build(rt << ,l,mid);
build(rt << | ,mid + ,r);
pushup(rt);
} void pushdown(int rt) {
if(lazy[rt]) {
lazy[rt<<] += lazy[rt], lazy[rt<<|] += lazy[rt];
st[rt<<] += lazy[rt], st[rt<<|] += lazy[rt];
lazy[rt] = ;
}
} void update(int rt,int l,int r,int ql,int qr,int val) {
if(qr < ql) return ;
if(ql <= l && qr >= r) {
st[rt] += val;
lazy[rt] += val;
return ;
}
pushdown(rt);
int mid = (l + r) >> ;
if(ql <= mid) update(rt<<,l,mid,ql,qr,val);
if(qr > mid) update(rt<<|,mid+,r,ql,qr,val);
pushup(rt);
} int query(int rt,int l,int r,int ql,int qr) {
if(ql <= l && qr >= r) return st[rt];
int mid = (l + r) >> ;
int ans = 1e9;
if(ql <= mid) ans = min(ans,query(rt<<,l,mid,ql,qr));
if(qr > mid) ans = min(ans,query(rt<<|,mid+,r,ql,qr));
return ans;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int n,m,h;
scanf("%d%d%d",&n,&m,&h);
for(int i = ; i <= m; i++) scanf("%d",&b[i]);
for(int i = ; i <= n; i++) scanf("%d",&a[i]);
sort(b + , b + + m);
build(,,m);
int now = , ans = ;
for(int i = ; i <= n; i++) {
while(query(,,m,,m) < && now < n) {
int val = a[++now];
int pos = lower_bound(b + , b + + m, h - val) - b;
update(,,m,pos,m,);
}
if(query(,,m,,m) >= && now == i + m - ) ans++;
int pos = lower_bound(b + , b + + m, h - a[i]) - b;
update(,,m,pos,m,-);
}
printf("%d\n",ans);
return ;
}

ACM-ICPC 2017 西安赛区现场赛 K. LOVER II && LibreOJ#6062. 「2017 山东一轮集训 Day2」Pair(线段树)的更多相关文章

  1. LOJ #6062. 「2017 山东一轮集训 Day2」Pair

    这是Lowest JN dalao昨天上课讲的一道神题其实是水题啦 题意很简单,我们也很容易建模转化出一个奇怪的东西 首先我们对b进行sort,然后我们就可以通过二分来判断出这个数可以和哪些数配对 然 ...

  2. LOJ6062「2017 山东一轮集训 Day2」Pair(Hall定理,线段树)

    题面 给出一个长度为 n n n 的数列 { a i } \{a_i\} {ai​} 和一个长度为 m m m 的数列 { b i } \{b_i\} {bi​},求 { a i } \{a_i\} ...

  3. loj#6062. 「2017 山东一轮集训 Day2」Pair hall定理+线段树

    题意:给出一个长度为 n的数列 a和一个长度为 m 的数列 b,求 a有多少个长度为 m的连续子数列能与 b匹配.两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当 ...

  4. 【LOJ6062】「2017 山东一轮集训 Day2」Pair(线段树套路题)

    点此看题面 大致题意: 给出一个长度为\(n\)的数列\(a\)和一个长度为\(m\)的数列\(b\),求\(a\)有多少个长度为\(m\)的子串与\(b\)匹配.数列匹配指存在一种方案使两个数列中的 ...

  5. ACM-ICPC 2017 西安赛区现场赛 A. XOR(线性基+线段树)

    题目链接:https://nanti.jisuanke.com/t/20749 参考题解:https://blog.csdn.net/Lee_w_j__/article/details/8266418 ...

  6. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  7. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. MySQL中的InnoDB中产生的死锁深究

    查考地址:https://blog.csdn.net/loophome/article/details/79867174 待研究中.....

  2. (五)mybatis开发dao层

    目录 SqlSession 是线程不安全的 原始 dao 开发方法 Mapper 代理方法 关于代理对象 SqlSession 是线程不安全的 SqlSession 是 线程不安全 的: 对于它,我们 ...

  3. Laravel框架与ThinkPHP框架的不同

    作为一个PHP菜鸟初学Laravel框架 在学习过程中我发现了其与TP框架的不同点,由于时间问题和认识还不够完善我先写出其中几点,有错误的地方希望各位大牛斧正... 1.渲染模版方式的不同:在Lara ...

  4. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

  5. 【第一季】CH05_FPGA设计Verilog基础(二)Enter a post title

    [第一季]CH05_FPGA设计Verilog基础(二) 5.1状态机设计 状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路.通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态 ...

  6. Devexpress xaf BO中字段为RuleRequiredField必输字段时,文本标签默认添加*标记

    BO中字段为RuleRequiredField必输字段时,文本标签默认添加*标记.需要在模型编辑器中设置,如图. 官网地址:https://docs.devexpress.com/eXpressApp ...

  7. SWATS算法剖析(自动切换adam与sgd)

    SWATS算法剖析(自动切换adam与sgd) 战歌指挥官 搬砖.码砖.代查水表.... 27 人赞同了该文章 SWATS是ICLR在2018的高分论文,提出的一种自动由Adam切换为SGD而实现更好 ...

  8. Linux weblogic启停

    一般weblogic启停在windows下很方便使用图标方式.但是在linux下需要杀掉weblogic进程才能真正关掉weblogic. 1.查询weblogic进程 ps -ef | grep & ...

  9. 怎样设置HTTP请求头Header

    使用: xhr.setRequestHeader(); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.setRequest ...

  10. Java 8 Collectors 类的静态工厂方法

    摘自<<Java 8 实战>> Collectors 类的静态工厂方法 工厂方法 返回类型 用于 toList List<T>  把流中所有项目收集到一个 List ...