Codeforces 369E Valera and Queries --树状数组+离线操作
题意:给一些线段,然后给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 --树状数组+离线操作相关推荐
- CodeForces - 1553F Pairwise Modulo(数论+树状数组)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,求 pk=∑1≤i,j≤kaimodajp_k = \sum_{1 \le i, j \le k} a_i \bmod a_jpk=∑1 ...
- Perform the Combo CodeForces - 1311C(字符串反转+树状数组)
You want to perform the combo on your opponent in one popular fighting game. The combo is the string ...
- CodeForces 828E DNA Evolution(树状数组)题解
题意:给你一个串k,进行两个操作: "1 a b":把a位置的字母换成b "2 l r s":求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s ...
- CodeForces - 987E Petr and Permutations(树状数组+逆序对定理)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,可能打乱过 3 * n 次,也可能打乱过 7 * n + 1 次,问到底打乱过多少次 题目分析:首先看出,3 * n 和 7 * n + 1 ...
- HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)
Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...
- HDU 4630 No Pain No Game 树状数组+离线操作
题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...
- codeforces test #12 C. Subsequences 树状数组统计
C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- hdu4417 Super Mario(树状数组+离线区间操作)
题目链接 Problem Description Mario is world-famous plumber. His "burly" figure and amazing jum ...
- 8.8线段树和树状数组
题目链接 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28619#overview 密码 acmore 还是感觉不怎么会线段树,还是 ...
最新文章
- 最强大,最简洁的【禁止输入中文】
- LeetCode Generate Parentheses
- 怎样能用计算机打出表白数字,怎么用数字表白?盘点数字表白暗语
- Centos7jdk安装
- 如何获取用户当前详细的地理位置
- 更改项目project名称,与项目名称;
- Array类型的扩展
- asp优化:认识和优化connection对象
- Java类的域初始化_Java域的初始化
- Linux 文件系统(二)---执行过程及结构间的关系
- Linux中fork函数作用,深入解析Linux中的fork函数
- [USACO2008 Mar]土地购买
- FTP和FXP的区别
- pos收银系统 php,POS收银系统
- excel 置信区间 计算_用Excel求置信区间.ppt
- ubuntu 18.04/16.04/14.04 双硬盘分区方案
- 余弦距离的应用 -- cosine distance
- C++程序员的发展前景,老程序员:早知道当初就学C++了!
- 动手深度学习——Pytorch 入门语法一
- jquery 遍历集合
热门文章
- 3.3 计算神经网络的输出
- c hello world
- java如何设table只读_Table
- java createchannel_【原创】java NIO FileChannel 学习笔记 新建一个FileChannel
- java中this是实例吗_java中this用法实例
- vSphere 7 Kubernetes 初体验
- 技术人生系列——vCenter重启大法不香了?
- 内容库-管理介质和模板的最佳办法(转)
- Java Web学习总结(32)——Java程序员最亲睐的Web框架
- python怎么去重_python列表如何去重