题目传送门:E - At Least One (atcoder.jp)

题意:

给定大小为N的两个数组A,B,求长度分别为1~M的满足以下条件的连续序列数量,条件为:

对于每个i(从1~N),Ai和Bi至少有一个包含于此序列之内。

思路:双指针 + 差分

容易知道,当序列[L, R]是满足条件的连续序列时,则左边界向左拓展,右边界向右拓展时,得到的新序列依旧满足条件。

那么我们枚举左边界L,然后移动右边界,使得其为满足条件的最小右边界(记为Rmin),则长度在[Rmin - L + 1, M - L + 1]之间的答案都增加1,可以用双指针+差分实现。

 

代码参考:

//Jakon; Two Pointers and Difference
#include <bits/stdc++.h>
using namespace std; const int N = 200010; int n, m, cnt[N], ans[N];
vector<int> v[N]; int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
v[a].push_back(i), v[b].push_back(i);
} int sum = 0;
for(int i = 1, j = 0; i <= m && j <= m; i++)
{
//以i为左边界,找到满足条件的最小右边界j
while(sum < n && j < m) {
++ j;
for(auto& idx : v[j]) {
++ cnt[idx];
if(cnt[idx] == 1) ++ sum;
}
}
//若区间[i, j]满足条件,则长度在[j-i+1, m-i+1]的答案都+1,即以i为左边界的所有可能情况都+1
if(sum == n && j <= m) {
++ ans[j - i + 1], -- ans[m - i + 2];
}
//左边界i要右移一位,于是先把原本i的贡献去掉
for(auto& idx : v[i]) {
-- cnt[idx];
if(cnt[idx] == 0) -- sum;
}
} for(int i = 1; i <= m; i++) cout << (ans[i] += ans[i - 1]) << " ";
cout << endl; return 0;
}

AtCoder Beginner Contest 260 E // 双指针 + 差分的更多相关文章

  1. AtCoder Beginner Contest 260 (D-E)

    AtCoder Beginner Contest 260 - AtCoder D - Draw Your Cards 题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小( ...

  2. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...

  3. AtCoder Beginner Contest 260 F - Find 4-cycle

    题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...

  4. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  5. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  6. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  7. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  8. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  9. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

随机推荐

  1. 关于transform属性的一些理解

    3D transform transform进行动画演示时,是以元素的中心为基准点的,可以使用transform-origin改变元素转变的基准点. 所有的transform动作改变都会引起X.Y轴的 ...

  2. 第一个MVC程序

    配置版 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version="1.0" e ...

  3. Java学习笔记-基础语法Ⅲ

    继承:子类使用extends来继承父类,子类可以有父类的内容,还可以有子类自己特有的内容 继承的好处: 提高了代码的复用性(多个类相同的成员可以放到同一个类中) 提高了代码的维护性(如果方法的代码需要 ...

  4. R可视化:plot函数基础操作,小白教程

    最近迷恋上了画图,一方面是觉得挺有意思的,另一方面是觉得自己确实画图方面比较弱,所以决定比较系统地回顾反思一下,同时顺带记录下来分享给大家.也确实是好久好久没更新文章了,真的是杂事太多太忙太牵扯精力没 ...

  5. chkconfig-配置系统服务

    管理Linux系统开机启动项. chkconfig命令默认在CentOS7+中不被使用了,由于系统服务管理都交给了systemctl托管. 语法 chkconfig [--list] [--type ...

  6. liunx 服务器下面安装mysql8.0

    闲来无事,准备自己搭建一个服务器高点事情,不可避免的就是需要使用到mysql数据库了.在Linux系统安装MySQL8.0,网上已经有很多的教程了,到自己安装的时候却发现各种各样的问题,现在把安装过程 ...

  7. Python工程:ImportError: attempted relative import with no known parent package

    Python工程:ImportError: attempted relative import with no known parent package 解决方法: 1.对每个目录创建的时候都选择创建 ...

  8. c++ 快速乘

    First 在一些数学题中,两个数相乘运算很多,同时又很容易溢出,如两个 long long 相乘 今天本蒟蒻来总结一下快速乘的两种方法 1:二进制 和快速幂的原理一样,优化一个一个加的算法,复杂度\ ...

  9. 论文阅读 Real-Time Streaming Graph Embedding Through Local Actions 11

    9 Real-Time Streaming Graph Embedding Through Local Actions 11 link:https://scholar.google.com.sg/sc ...

  10. 关于使用 koa路由与mysql模块, ctx.body获取不到值的问题

    var Koa = require('koa');var Router = require('koa-router' );var bodyParser = require('koa-bodyparse ...