Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)
Problem 1004: 蛤玮打扫教室
Time Limits: 1000 MS Memory Limits: 65536 KB
64-bit interger IO format: %lld Java class name: Main
Description
现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每个签上写着两个数L,R(L<=R),抽到的人要把[L,R]的教室全部打扫一遍.由于蛤玮是队长而且他很懒,他通过某种交易提前知道了所有m个签上面写的是什么,而且通过某种魔法可以控制自己抽到哪个签.一个教室被打扫一次就干净了,所以蛤玮想知道自己抽哪些签可以不用打扫教室而且不会被教练发现,即他抽到的区间全都会被别人打扫一遍.
蛤玮被教练叫去打扫机房,集训队有很多机房,也有很多队员,现在他们要用抽签的方式决定谁打扫哪间教室.
Input
第一行为一个整数T(1<=T<=20),代表数据组数。每组数据第一行n,m(1<=n,m<=100000),接下来m行,每行两个数L,R(1<=L<=R<=n).
Output
每组数据输出一个k,表示多少个签符合蛤玮的要求,接下来一行输出k个数,这些签的编号,下标从1开始.
Sample Input
3
15 5
1 4
5 5
6 8
9 10
5 6
3 6
1 1
1 1
2 2
2 2
3 3
3 3
10 3
1 4
2 6
6 10
Output for Sample Input
2
2 5
6 1 2 3 4 5 6
0
Hint
Author
这题应该是线段树,但是没学过也感觉看不太懂,于是找了其他大牛题解的做法,还好这种做法容易懂些。
思路:在vis数组里对每一个区间的L与R操作,vis[L]++,vis[R+1]--,这样可以标记一个区间的端点,然后再用这个数组求一个前缀和放入per,每一项即是对应点的被覆盖次数,然后这样就稍微好办了点,转化为告诉你每一个点的覆盖次数,求是否题目中的抽签的区间是否全部都是至少被覆盖两次的点,然后再开一个cnt数组,记录连续完整覆盖的区间长度。最后比较每一个抽签R-L+1(区间长度)与cnt[R]-cnt[L-1](连续覆盖区间长度)是否相等即可。不愧是大牛想出来的办法。
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
const int N=100010;
struct info
{
int l;
int r;
};
info point[N];//抽签信息记录
int vis[N];//端点标记
int cnt[N];//连续覆盖次数大于2区间
int ans[N];//记录答案
int per[N];//单点覆盖次数
int main(void)
{
int tcase,i,j,L,R,x,y,z,n,m;
scanf("%d",&tcase);
while (tcase--)
{
MM(point);MM(vis);MM(cnt);MM(ans);MM(per);
scanf("%d%d",&n,&m);
for (i=1; i<=m; i++)
{
scanf("%d%d",&point[i].l,&point[i].r);
vis[point[i].l]++;
vis[point[i].r+1]--;
}
int temp=0;
for (i=1; i<=n; i++)
{
temp+=vis[i];
per[i]=temp;
}
for (i=1; i<=n; i++)
{
if(per[i]>=2)
cnt[i]=cnt[i-1]+1;
else
cnt[i]=0;//或cnt[i]=cnt[i-1]也可以,反正最后求的是差值
}
int k=0;
for (i=1; i<=m; i++)
{
int left=point[i].l;
int righ=point[i].r;
if(righ-left+1==cnt[righ]-cnt[left-1])
ans[k++]=i;
}
printf("%d\n",k);
for (i=0; i<k; i++)
printf("%d%s",ans[i],i==k-1?"\n":" ");
}
return 0;
}
Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)的更多相关文章
- NBOJv2 1004 蛤玮打扫教室(线段树区间更新区间最值查询)
		Problem 1004: 蛤玮打扫教室 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: %l ... 
- 线段树区间覆盖  蛤玮打扫教室(zzuli 1877)
		http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877 Description 现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每 ... 
- NBOJv2 Problem 1009 蛤玮的魔法(二分)
		Problem 1009: 蛤玮的魔法 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: %ll ... 
- NBOJv2——Problem 1002: 蛤玮的财宝(多线程DP)
		Problem 1002: 蛤玮的财宝 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: %ll ... 
- BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)
		Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1747 Solved: 876[Submit][Status][Discuss] Descripti ... 
- ZZULI 1876: 蛤玮的项链 Hash + 二分
		Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 153 Solved: 11 SubmitStatusWeb Board Description 蛤玮向 ... 
- codeforces Gym 100187F F - Doomsday 区间覆盖贪心
		F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ... 
- 【区间覆盖问题】uva 10020 - Minimal coverage
		可以说是区间覆盖问题的例题... Note: 区间包含+排序扫描: 要求覆盖区间[s, t]; 1.把各区间按照Left从小到大排序,如果区间1的起点大于s,则无解(因为其他区间的左起点更大):否则选 ... 
- uvalive 2326 - Moving Tables(区间覆盖问题)
		题目连接:2326 - Moving Tables 题目大意:在一个走廊上有400个教室, 先在有一些桌子要移动, 每次移动需要十分钟, 但是不同房间的桌子可以在同一个十分钟内移动,只要走廊没有被占用 ... 
随机推荐
- 学习Unity 4.6新GUI系统
			(搬运自我在SegmentFault的博客) 最近在学习Unity的过程中,自己做一款小游戏自娱自乐.自然需要用到GUI.但4.5中的GUI很难用,一个选择是传说中的NGUI插件.但对于4.6中的新G ... 
- UVA11090 Going in Cycle (二分+判负环)
			二分法+spfa判负环.如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环.因此可用spfa来判负环. 一般spfa判负环dfs最快,用stack次之 ... 
- [uva]AncientMessages象形文字识别 (dfs求连通块)
			非常有趣的一道题目,大意是给你六种符号的16进制文本,让你转化成二进制并识别出来 代码实现上参考了//http://blog.csdn.net/u012139398/article/details/3 ... 
- UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
			摘要:中途相遇.对比map,快排+二分查找,Hash效率. n是4000的级别,直接O(n^4)肯定超,所以中途相遇法,O(n^2)的时间枚举其中两个的和,O(n^2)的时间枚举其他两个的和的相反数, ... 
- UVA225 Golygons 黄金图形(dfs+回溯)
			剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点. 剪枝2:当前位置怎么也走不回去. 3:沿途判断障碍即可. 在oj上提交0.347s,最快的0.012s,应该有 ... 
- Verilog设计分频器(面试必看)
			分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ... 
- 基于matlab的蓝色车牌定位与识别---定位
			接着昨天的工作继续.定位的过程有些是基于车牌的颜色进行定位的,自己则根据数字图像一些形态学的方法进行定位的. 合着代码进行相关讲解. 1.相对彩色图像进行灰度化,然后对图像进行开运算.再用小波变换获取 ... 
- 【模拟】HHHOJ#251. 「NOIP模拟赛 伍」高精度
			积累模拟经验 题目描述 维护一个二进制数,支持如下操作 "+" 该数加 11 "-" 该数减 11 "*" 该数乘 22 "\&q ... 
- Python学习笔记:字符串
			字符串 字符串定义:字符串可以使用一对单引号.双引号或三引号来定义,即便是单个字符也会当做字符串来处理(Python中没有字符类型,单个字符也就是只有一个字符的字符串而已). 原始字符串:字符串中反斜 ... 
- arm页表在linux中的融合
			参考:arm-linux内存页表创建 arm的第一级页表条目数为4096个,对于4K页第二级目录条目个数为256个,一级二级条目都是每个条目4字节. 在linux下二级分页如下:虚拟地址——> ... 
