安徽省2016“京胜杯”程序设计大赛_G_木条染色
木条染色
Time Limit: 1000 MS | Memory Limit: 65536 KB |
Total Submissions: 134 | Accepted: 20 |
Description
有一天,他突发奇想,对于一根木条,他每次从木条中选取一个区间[l,r]进行染色,经过多次染色后,他想知道在[a,b]区间中有几个未被染色的子区间?
可惜小明虽然画画非常厉害,但是并不擅长解决这类问题,于是,他拿着这根木条来找你,希望你能够给他帮助。
假设木条无限长,所有查询都在木条长度范围内,未被染色的子区间是指,木条上染过色的区间的间断部分。
Input
对于每组数据,第一行给出两个整数n,q,分别代表染色的区间个数,以及查询个数。
之后n行,每行两个整数l,r,表示将l到r的区间进行染色,包含l,r两个节点。
之后q行,每行两个整数a,b,表示询问a到b总共有多少未被染色的子区间。
两组数据之间用一个空行隔开。
T<20
n<10000
q<100000
0<=l<r<1000000
0<=a<=b<1000000
Output
每组数据之后,请输出一个空行。
Sample Input
2 3
1 2
3 4
1 3
3 4
5 5
3 3
1 5
2 8
5 6
0 5
0 9
9 9
Sample Output
0
1
1
2
1
Hint
对于第二组数据,[0,1)和(8,+)是未染色的子区间,因此对于[0,5]只有子区间[0,1),对于查询[0,9],有子区间[0,1)和(8,9],对于查询[9,9],有[9,9]这个子区间。
//这道题还木有做出来,正在努力A中,欢迎各位朋友给出解题思路
2017-4-29 19:02:19----补下这道题的题解,这道题用的是线段是+离散化,代码参考如下
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson i<<1
#define rson (i<<1)+1
int maxn,t,n,m;
int va[500000];
int ha[1000005],pre,pre2;
struct node{
int x,y;
}b[100005];
int a[100005];
void build(int i,int l,int r)
{
va[i] = 1;
if(l==r)return;
build(lson,l,(l+r)/2);
build(rson,(l+r)/2+1,r);
}
inline void pushUp(int i)
{
if(va[lson]==va[rson])va[i] = va[lson];
else va[i] = -1;
}
inline void pushDown(int i)
{
va[lson] = va[i];
va[rson] = va[i];
}
void update(int i,int l,int r,int L,int R)
{
if(l==L&&r==R)
{
va[i] = 0;
return ;
}
if(va[i]!=-1)pushDown(i);
if(R<=(l+r)/2)update(lson,l,(l+r)/2,L,R);
else if(L>=(l+r)/2+1)update(rson,(l+r)/2+1,r,L,R);
else {
update(lson,l,(l+r)/2,L,(l+r)/2);
update(rson,(l+r)/2+1,r,(l+r)/2+1,R);
}
pushUp(i);
}
int query(int i,int l,int r,int L,int R)
{
if(va[i]!=-1)
{
return va[i];
}
if(R<=(l+r)/2)return query(lson,l,(l+r)/2,L,R);
else if(L>=(l+r)/2+1)return query(rson,(l+r)/2+1,r,L,R);
else return query(lson,l,(l+r)/2,L,(l+r)/2) + query(rson,(l+r)/2+1,r,(l+r)/2+1,R);
}
inline void init()
{
pre = 2;
sort(a,a+2*n);
ha[a[0]] = pre;
for(int i=1;i<2*n;i++)
if(a[i]>a[i-1])
{
pre+=2;
ha[a[i]] = pre;
}
pre2 = 1;
for(int i=max(a[0]-1,0);i<=a[2*n-1]+2;i++)
if(ha[i])
{
pre2 = ha[i]+1;
}
else ha[i] = pre2;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i*2],&a[i*2+1]);
b[i].x = a[i*2];
b[i].y = a[i*2+1];
}
init();
build(1,1,pre2);
for(int i=0;i<n;i++)
update(1,1,pre2,ha[b[i].x],ha[b[i].y]);
for(int i=0;i<m;i++)
{
int c,d;
c = max(c,max(0,a[0]-1));
d = min(a[2*i-1]+2,d);
scanf("%d%d",&c,&d);
printf("%d\n",query(1,1,pre2,ha[c],ha[d]));
}
for(int i=max(a[0]-1,0);i<=a[2*n-1]+2;i++)
ha[i] = 0;
if(t!=0)printf("\n");
}
return 0;
}
安徽省2016“京胜杯”程序设计大赛_G_木条染色的更多相关文章
- 安徽省2016“京胜杯”程序设计大赛_K_纸上谈兵
纸上谈兵 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 3 Accepted: 1 Description 战国时 ...
- 安徽省2016“京胜杯”程序设计大赛_J_YZK的大别墅
YZK的大别墅 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 24 Accepted: 12 Description 土豪 ...
- 安徽省2016“京胜杯”程序设计大赛_I_恶魔A+B
恶魔A+B Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 73 Accepted: 17 Description 相信大家 ...
- 安徽省2016“京胜杯”程序设计大赛_H_单身晚会
单身晚会 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 53 Accepted: 16 Description ZJ和Z ...
- 安徽省2016“京胜杯”程序设计大赛_F_吃在工大
吃在工大 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 51 Accepted: 15 Description ...
- 安徽省2016“京胜杯”程序设计大赛_E_转啊转
转啊转 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 59 Accepted: 15 Description 在二 ...
- 安徽省2016“京胜杯”程序设计大赛_D_梯田AGAIN
梯田AGAIN Time Limit: 5000 MS Memory Limit: 65536 KB Total Submissions: 95 Accepted: 21 Description 大家 ...
- 安徽省2016“京胜杯”程序设计大赛_C_箭无虚发
箭无虚发 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 128 Accepted: 21 Description ...
- 安徽省2016“京胜杯”程序设计大赛_B_阵前第一功
阵前第一功 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 63 Accepted: 29 Description A国每个 ...
随机推荐
- H5个性三级联动日期插件(一)
1. 先看效果:如图 2.如果跟你的需求一样的话,那就抓紧down(当)起来吧! 首先你的页面可能需要很多的开发需求文件: jquery,mobiscroll 等js框架插件等 自己参照官方的demo ...
- 修改apache的默认www目录
httpd.conf配置文件#DocumentRoot "/var/www/html" //修改前DocumentRoot "/www" #<Direct ...
- Visual Studio Debugger中七个鲜为人知的小功能
Visual Studio debugger是一个很棒的调试工具,可以帮助程序猿们快速地发现和解决问题.这里给大家简单介绍一下VS调试工具中的七个鲜为人知的小功能. 1. 一键跳转到指定语句 调 ...
- 【Android Developers Training】 20. 创建一个Fragment
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- JAVA基础——编程练习(二)
JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...
- H3CNE实验:通过Console端口本地访问H3C设备
连接好Console线后,将交换机开机,在SecureCRT上会显示如下信息: Starting...... RAMLine.....OK System is booting............. ...
- VB6之Mandelbrot集
Mandelbrot真是上帝之作,数学之美最直观的表现. 围观wiki和百科(百度百科)上关于Mandelbrot的解释至今仍是不能理解,没办法我高数实在学得不好. 搜素到园友用F#写的一篇实现代码, ...
- asp.net core高级应用:TagHelper+Form
上一篇博客我讲解了TagHelper的基本用法和自定义标签的生成,那么我就趁热打铁,和大家分享一下TagHelper的高级用法~~,大家也可以在我的博客下随意留言. 对于初步接触asp.net cor ...
- 使用jenkins实现持续集成
一.jenkins 介绍 它是一个自动化的周期性的集成测试过程,从检出代码.编译构建.运行测试.结果记录.测试统计等都是自动完成的,无需人工干预: 它需要有专门的集成服务器来执行集成构建: 它需要有代 ...
- 【PHP】PHP面向对象编程--phpOOP入门
PHP从入门到精通 之PHP的面相对象编程 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序 ...