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个教室, 先在有一些桌子要移动, 每次移动需要十分钟, 但是不同房间的桌子可以在同一个十分钟内移动,只要走廊没有被占用 ...
随机推荐
- 在SAP C4C里触发SAP ERP的ATP check和Credit check
在C4C里创建一个新的Sales Quote: 添加三个行项目: 执行action "Request External Pricing"会从ERP更新pricing信息,触发ATP ...
- MFC多文档无法显示可停靠窗格
当我们使用MFC多文档创建项目时,我们可停靠窗格关闭之后就无法显示了.即使重新编译项目也无法再次显示它们. 原因:因为MFC多文档把这些设置存储在注册表 “HKEY_CURRENT_USER \ SO ...
- 查询linux文件的MD5值
Linux下查询文件的MD5值:md5sum xxx.iso.md5 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algor ...
- Python 生成器和协程
Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...
- Python 消息框的处理
在实际系统中,在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框. 1.警告消息框 ...
- window.addEventListener介绍说明
原型 public override function addEventListener(type:String, listener:Function, useCapture:Boolean = fa ...
- ios sinaweibo 客户端(一)
上一篇sina微博Demo已经完成的认证,下面就开始进入微博相关内容的加载及显示.其实主要的工作就是调用微博API 加载相关的json数据,然后进行解析,然后在界面中进行组织好在tableview中进 ...
- I/O理解
I/O是什么 我的理解I/O就是用于读写的一个流 官方解释:I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出. node中的io ...
- 【Python学习之四】递归与尾递归
看完廖雪峰老师的教程,感觉尾递归函数是一个相对难点.于是复习一下,思考了一下,发表一些见解,记录一下. 1.递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 ...
- java上传附件,批量下载附件(一)
上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...