bzoj1293题解
【题意分析】
给你一条有n个点的数轴,每个点属于一个种类,总共有k个种类。求一段最短的线段,使对于每个种类,这段线段上有至少一个点属于它。
【算法分析】
1.对于50%的数据,N≤10000
对于每一个从左到右枚举的l,从左到右枚举r>=l并不断加入r号彩珠,直到满足条件为止,更新答案。
时间复杂度O(n2)。
2.对于80%的数据,N≤800000
预处理k个种类的前缀和。对于每一个从左到右枚举的l,进行O(klog2n)的二分询问。
时间复杂度O(nklog2n)
3.对于100%的数据,1≤N≤1000000,1≤K≤60,0≤Ti<231
动态维护一个大小为k的离散数组,s[i]表示当前状态下第i个种类的彩珠数。深入考虑算法一,我们发现对于每一个从左到右枚举的l,r是单调不减的。于是固定l时,不断将r号彩珠加入s并右移指针r,直到满足条件为止,更新答案;当l自增时,在s中弹出原l号彩珠,不重置r。这样扫描的时间就是线性的了。
时间复杂度O(nk)
【参考代码】
#pragma GCC optimize(2)
#include <algorithm>
#include <cstdio>
#include <functional>
#define REP(i,low,high) for(register int i=(low);i<=(high);i++)
using namespace std; //ex_cmp {
template<typename T,class Compare> inline bool getcmp(T &target,const T &pattern,Compare comp)
{
return comp(pattern,target)?target=pattern,:;
}
//} ex_cmp struct beat
{
int kind,pos; void input(const int &K) {kind=K,scanf("%d",&pos);}
bool operator<(const beat &another)const{return pos<another.pos;}
}beats[];
int s[]={}; static int n,k;
inline bool cannot() {REP(i,,k) if(!s[i]) return ; return ;}
int main()
{
scanf("%d%d",&n,&k); int tot=; REP(i,,k)
{
int cnt; for(scanf("%d",&cnt);cnt--;) tot++,beats[tot].input(i);
}
sort(beats+,beats+n+),s[beats[].kind]=; int j=;
for(;j<=n&&cannot();s[beats[j].kind]++) j++; int ans=beats[j].pos-beats[].pos;
REP(i,,n)
{
s[beats[i-].kind]--; for(;j<=n&&cannot();s[beats[j].kind]++) j++;
if(j>n) break; getcmp(ans,beats[j].pos-beats[i].pos,less<int>());
}
return printf("%d\n",ans),;
}
bzoj1293题解的更多相关文章
- BZOJ1293:[SCOI2009]生日礼物——题解
		http://www.lydsy.com/JudgeOnline/problem.php?id=1293 https://www.luogu.org/problemnew/show/P2564#sub ... 
- BZOJ1293 [SCOI2009]生日礼物  离散化
		欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1293 题意概括 彩珠有N个,分为K种.每一个彩珠有一个对应的坐标.坐标上可以没有彩珠,多个彩珠也可 ... 
- 【BZOJ1293】[SCOI2009]生日礼物(单调队列)
		[BZOJ1293][SCOI2009]生日礼物(单调队列) 题面 BZOJ 洛谷 题解 离散之后随便拿单调队列维护一下就好了. #include<iostream> #include&l ... 
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
		我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ... 
- noip2016十连测题解
		以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ... 
- BZOJ-2561-最小生成树 题解(最小割)
		2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ... 
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
		Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ... 
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
		题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ... 
- 2016ACM青岛区域赛题解
		A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ... 
随机推荐
- php操作redis--有序集合(sorted set)篇
			常用函数:zAdd,zRange,zRem,zCard等. 应用场景:类似集合,可以提供一个优先级的参数来为成员排序,如:分数 连接 $redis = new Redis(); $redis-> ... 
- Magento多语言注意事项
			Magento一般使用CSV文件方式翻译国际化词条 一般用法是代码中: <?php echo Mage::helper("module_name")->__('Item ... 
- Array排序和List排序
			public class SortTest { public static void main(String[] args) { int arr[]={12,4,45,23,5,7,9,33}; Sy ... 
- NX二次开发-MFC对话框获取UG界面句柄,设置MFC对话框在UG界面固定显示位置
			extern "C" DllExport void ufusr(char *param, int *retcod, int param_len) { if (UF_initiali ... 
- js委托事件-addEventListeners(冒泡方向)
			JQuery中live().delegate().on()事件都能给新增元素绑定事件,原理就是用了事件委托. 实例: 给id为div的元素绑定一个click委托,如果冒泡上来的元素是P元素就会执行al ... 
- Golang flag包使用详解(一)
			概述 flag包提供了一系列解析命令行参数的功能接口 命令行语法 命令行语法主要有以下几种形式 -flag //只支持bool类型 -flag=x -flag x //只支持非bool类型 以上语法对 ... 
- Java-Class-E:org.springframework.http.HttpStatus
			ylbtech-Java-Class-E:org.springframework.http.HttpStatus 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 1. /* * C ... 
- 使用poi实现生成excel文件
			import java.util.ArrayList; import javax.servlet.ServletOutputStream; import org.apache.poi.hssf.use ... 
- bigdecimal解决小数间的加减乘除
			public class bigdecimal { public static BigDecimal div(double v1,double v2){ BigDecimal b1=new BigDe ... 
- 分析由Python编写的大型项目(Volatility和Cuckoo)
			之前使用python都是用来做一些简单的脚本,本质上和bat批处理文件没有区别. 但是Python是可以用来编写大型的项目的,比如: Volatility:https://code.google.co ... 
