Codeforces 1139F(树状数组+扫描线)
做法
- 对于每个人,inc为x,pref为y;对于每道菜,p和s为x,b为y
- 于是根据题意有$$p[i]<=x<=s[i]$$$$p[i]+b[i]<=x+y$$$$p[i]-b[i]<=x-y$$
- 把所有出现的点都离散化一下,然后开始扫x轴
- 对于x+y和x-y这两个函数,分别开一个树状数组去维护合法点的个数
#include <cstdio>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <vector>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define All(x) (x.begin()), (x.end())
using namespace std;
template <typename T> void read(T &x) {
x = 0;
T s = 1, c = getchar();
for (; !isdigit(c); c = getchar())
if (c == '-') s = -1;
for (; isdigit(c); c = getchar())
x = x * 10 + c - 48;
x *= s;
}
typedef long long ll;
const int maxn = 1e5 + 5;
int n, m, tot;
ll p[maxn], s[maxn], b[maxn], inc[maxn], pref[maxn];
int ans[maxn];
vector<ll> A, B;
vector<pair<ll, int>>que;
class FenwickTree {
public:
int F[maxn << 1];
void Modify(int x, int val) {
for (; x <= maxn << 1; x += x&-x)
F[x] += val;
}
int Query(int x) {
int ret = 0;
for (; x; x -= x&-x)
ret += F[x];
return ret;
}
}bitA, bitB;
inline void Read() {
read(n), read(m);
rep(i, 1, n) read(p[i]);
rep(i, 1, n) read(s[i]);
rep(i, 1, n) read(b[i]);
rep(i, 1, m) read(inc[i]);
rep(i, 1, m) read(pref[i]);
}
inline void Discrete() {
A.push_back(-(1LL << 60));
B.push_back(-(1LL << 60));
rep(i, 1, n) {
que.push_back({p[i], i});
que.push_back({s[i], i + maxn * 2});
A.push_back(p[i] + b[i]);
B.push_back(p[i] - b[i]);
}
rep(i, 1, m) {
que.push_back({inc[i], i + maxn});
A.push_back(inc[i] + pref[i]);
B.push_back(inc[i] - pref[i]);
}
sort(All(que)), sort(All(A)), sort(All(B));
A.erase(unique(All(A)), A.end());
B.erase(unique(All(B)), B.end());
}
inline void Sweep() {
int num = 0;
for (auto i : que) {
int x = i.second, y;
if (x < maxn) {
num++;
y = lower_bound(All(A), p[x] + b[x]) - A.begin();
bitA.Modify(y, 1);
y = lower_bound(All(B), p[x] - b[x]) - B.begin();
bitB.Modify(y, 1);
} else if (x < maxn * 2) {//注意排序顺序p < inc < s
x -= maxn;
y = lower_bound(All(A), inc[x] + pref[x]) - A.begin();
ans[x] += bitA.Query(y);
y = lower_bound(All(B), inc[x] - pref[x]) - B.begin();
ans[x] += bitB.Query(y);
ans[x] -= num;
//当一个x一定大于等于另一个x时,无论y的关系如何,这样容斥一定能得到正确答案
} else {
x -= maxn * 2;
num--;
y = lower_bound(All(A), p[x] + b[x]) - A.begin();
bitA.Modify(y, -1);
y = lower_bound(All(B), p[x] - b[x]) - B.begin();
bitB.Modify(y, -1);
}
}
rep(i, 1, m) printf("%d%c", ans[i], " \n"[i == m]);
}
int main() {
Read();
Discrete();
Sweep();
return 0;
}
Codeforces 1139F(树状数组+扫描线)的更多相关文章
- Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)
[题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时 ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- Codeforces 1197E Count The Rectangles(树状数组+扫描线)
题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...
- HDU 3333 | Codeforces 703D 树状数组、离散化
HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...
- bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...
- codeforces 341d (树状数组)
problem Iahub and Xors 题目大意 一个n*n的矩阵,要求支持两种操作. 操作1:将一个子矩阵的所有值异或某个数. 操作2:询问某个子矩阵的所以值的异或和. 解题分析 由于异或的特 ...
- CodeForces 396C 树状数组 + DFS
本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...
- [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...
- Codeforces 276E(树状数组)
题意:一棵树有n个节点,1是根节点,根节点的子节点是单链,然后如今有两种操作0 v x d表示距离节点v为d的节点权值都加x,操作1 v问v节点的权值,初始节点权值都是0. 题解:看了别人的题解才会的 ...
随机推荐
- HDU1133 Buy the Ticket —— 卡特兰数
题目链接:https://vjudge.net/problem/HDU-1133 Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Me ...
- 测试工程师面试题之:给你印象最深的Bug
有人看到别人在侵淫面试技巧,什么<程序员面试宝典>,或者<面试测试工程师须知>等等,就会嗤之以鼻.他会觉得这不是“投机取巧”吗,最重要的还是踏实提高自己的能力. 非常同意这种看 ...
- CentOS软件管理之源代码以及RPM软件包管理
在Linux系统下,对于软件包的管理有多种机制,有源代码方式.RPM软件包管理方式以及YUM软件管理方式,本篇随笔将详细讲解CentOS下源代码形式安装软件以及RPM软件包管理机制 一.源代码形式 首 ...
- html5--5-7 绘制圆/弧
html5--5-7 绘制圆/弧 学习要点 掌握arc() 方法创建圆弧/曲线(用于创建圆或部分圆) 矩形的绘制方法 rect(x,y,w,h)创建一个矩形 strokeRect(x,y,w,hx,y ...
- 【转】看C++文档的小知识
转载:http://www.ggv.com.cn/forum/clib/ctype/isspace.html 函数isspace 原型:extern int isspace(int c); 用法 ...
- nyoj 1279 (河南省第九届ACM比赛 D 题)
思路:变换一下坐标系新的坐标系就是给定的两条直线,变换之后求 x,y 都严格递增的点的个数的max: 求 x,y 都严格递增的点的个数的max,按照x的从小到大排序,x相同的按照y的从大到小排序然后对 ...
- 初学Java(一)
基本语法: 编写Java程序时,应注意以下几点: 1.大小写敏感:java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 2.类名:对于所有的类来说,类名的首字母应该大写.如果类名由 ...
- 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归
标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...
- Ubuntu 16.04使用chrome闪屏
使用Chrome的时候上端经常出现闪动的情况, 但是速度特别快, 根本无法截图, 感觉特别扎心, 以为自己的电脑出现问题了或者显卡驱动出现问题了, 后来才发现问题, 只需要关闭Chrome的硬件加速就 ...
- CodeForces 1091G. New Year and the Factorisation Collaboration
题目简述:若你获得“超能力”:固定$n$,对任意$a$,可以快速求出$x \in [0, n)$(若存在),使得$x^2 \equiv a \pmod n$,若存在多个$x$满足条件,则返回其中一个( ...