题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点

解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询的任意一个点的。这时候我们可以建立点集的补集,以线段的形式,如果点集的补集线段包含了某条给出的线段,那么被包含的那条线段肯定不会包括任意一个点,那么该组查询的答案ans--即可。 用树状数组做,离线读入数据,按容易被包含的线段优先排个序,然后扫一遍,边统计边修改即可。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1000007int c[N],n,m,ans[300005],maxi;
struct node
{int l,r,ind;
}a[N];int lowbit(int x){ return x&-x; }void modify(int x)
{while(x <= maxi){c[x]++;x += lowbit(x);}
}int getsum(int x)
{int ans = 0;while(x > 0){ans += c[x];x -= lowbit(x);}return ans;
}int cmp(node ka,node kb)   //容易被覆盖的线段放在前面
{if(ka.l == kb.l){if(ka.r == kb.r)return ka.ind < kb.ind;return ka.r < kb.r;}return ka.l > kb.l;
}int main()
{int i,j,k,x,pre,cnt;maxi = N-5;while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++)scanf("%d%d",&a[i].l,&a[i].r),a[i].ind = 0;memset(ans,0,sizeof(ans));memset(c,0,sizeof(c));int tot = n;for(i=1;i<=m;i++){scanf("%d",&cnt);scanf("%d",&x);if(x > 1)a[++tot].l = 1, a[tot].r = x-1, a[tot].ind = i;pre = x;for(j=1;j<cnt;j++){scanf("%d",&x);if(x-1 >= pre+1)a[++tot].l = pre+1, a[tot].r = x-1, a[tot].ind = i;pre = x;}a[++tot].l = pre+1, a[tot].r = maxi, a[tot].ind = i;}sort(a+1,a+tot+1,cmp);for(i=1;i<=tot;i++){if(a[i].ind > 0)ans[a[i].ind] += getsum(a[i].r);elsemodify(a[i].r);}for(i=1;i<=m;i++)printf("%d\n",n-ans[i]);}return 0;
}

View Code

转载于:https://www.cnblogs.com/whatbeg/p/3989078.html

Codeforces 369E Valera and Queries --树状数组+离线操作相关推荐

  1. CodeForces - 1553F Pairwise Modulo(数论+树状数组)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求 pk=∑1≤i,j≤kaimodajp_k = \sum_{1 \le i, j \le k} a_i \bmod a_jpk​=∑1 ...

  2. Perform the Combo CodeForces - 1311C(字符串反转+树状数组)

    You want to perform the combo on your opponent in one popular fighting game. The combo is the string ...

  3. CodeForces 828E DNA Evolution(树状数组)题解

    题意:给你一个串k,进行两个操作: "1 a b":把a位置的字母换成b "2 l r s":求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s ...

  4. CodeForces - 987E Petr and Permutations(树状数组+逆序对定理)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,可能打乱过 3 * n 次,也可能打乱过 7 * n + 1 次,问到底打乱过多少次 题目分析:首先看出,3 * n 和 7 * n + 1 ...

  5. HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  6. HDU 4630 No Pain No Game 树状数组+离线操作

    题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...

  7. codeforces test #12 C. Subsequences 树状数组统计

    C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. hdu4417 Super Mario(树状数组+离线区间操作)

    题目链接 Problem Description Mario is world-famous plumber. His "burly" figure and amazing jum ...

  9. 8.8线段树和树状数组

    题目链接   http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28619#overview 密码 acmore 还是感觉不怎么会线段树,还是 ...

最新文章

  1. 最强大,最简洁的【禁止输入中文】
  2. LeetCode Generate Parentheses
  3. 怎样能用计算机打出表白数字,怎么用数字表白?盘点数字表白暗语
  4. Centos7jdk安装
  5. 如何获取用户当前详细的地理位置
  6. 更改项目project名称,与项目名称;
  7. Array类型的扩展
  8. asp优化:认识和优化connection对象
  9. Java类的域初始化_Java域的初始化
  10. Linux 文件系统(二)---执行过程及结构间的关系
  11. Linux中fork函数作用,深入解析Linux中的fork函数
  12. [USACO2008 Mar]土地购买
  13. FTP和FXP的区别
  14. pos收银系统 php,POS收银系统
  15. excel 置信区间 计算_用Excel求置信区间.ppt
  16. ubuntu 18.04/16.04/14.04 双硬盘分区方案
  17. 余弦距离的应用 -- cosine distance
  18. C++程序员的发展前景,老程序员:早知道当初就学C++了!
  19. 动手深度学习——Pytorch 入门语法一
  20. jquery 遍历集合

热门文章

  1. 3.3 计算神经网络的输出
  2. c hello world
  3. java如何设table只读_Table
  4. java createchannel_【原创】java NIO FileChannel 学习笔记 新建一个FileChannel
  5. java中this是实例吗_java中this用法实例
  6. vSphere 7 Kubernetes 初体验
  7. 技术人生系列——vCenter重启大法不香了?
  8. 内容库-管理介质和模板的最佳办法(转)
  9. Java Web学习总结(32)——Java程序员最亲睐的Web框架
  10. python怎么去重_python列表如何去重