HDU 5741 Helter Skelter(构造法)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5741
【题目大意】
一个01相间的串,以0开头,给出的序列每个数字表示连续的0的个数或者1的个数,现在有m个询问,求0的个数为a且1的个数为b的串是否存在。
【题解】
我们发现形如11001这样子以1为开头结尾的串是包含1001这样子的串的,同理以0为开头结尾的串也是包含了一些开头结尾数字相同的子串。
可以发现,当0的个数固定,1的个数是数轴上的一个区间,而且在0的个数相差1时,必定可以取到相同的1的个数,因此可行域在二维平面内是一个实心的联通图,且上边界和下边界的点坐标单调非减。
那么我们首先计算出上下边界的点,可以发现在0的个数固定的情况下,1的个数的上界一定是由1开始,1结尾的子串产生的,下界是由0开始,0结尾的子串产生的,那么保存这些点。
然而在图形中两个横纵坐标都不相同的点就能够确定一个矩形可行区域,因此,只要保留上下边界坐标均单调递增的点即可,二分查询(a,b)是否在连通块区域内,就能够判断是否存在这样子的子串
【代码】
#include <cstdio>
#include <utility>
#include <climits>
#include <algorithm>
using namespace std;
const int N=1010,M=N*N;
typedef pair<int,int> PII;
char ans[M];
int T,n,m,a,b,t[N],cntd,cntu,cnt;
PII D[M],U[M];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&t[i]);
cntd=cntu=cnt=0;
for(int i=0;i<n;i++){
int x=0,y=0;
for(int j=i;j<n;j++){
if(j%2)y+=t[j];else x+=t[j];
if(i%2==0&&j%2==0)D[cntd++]=PII(x,y);
if(i%2&&j%2)U[cntu++]=PII(x,y);
}
}sort(D,D+cntd);
for(int i=0,j;i<cntd;i=j){
for(j=i;j<cntd&&D[i].first==D[j].first;j++);
while(cnt&&D[cnt-1].second>=D[i].second)cnt--;
D[cnt++]=D[i];
}cntd=cnt;
sort(U,U+cntu); cnt=0;
for(int i=0,j;i<cntu;i=j){
for(j=i;j<cntu&&U[i].first==U[j].first;j++);
if(!n||U[cnt-1].second<U[j-1].second)U[cnt++]=U[j-1];
}cntu=cnt;
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
int x=upper_bound(U,U+cntu,PII(a,INT_MAX))-U;
int y=upper_bound(D,D+cntd,PII(a,INT_MIN))-D;
ans[i]='0'+(y<cntd&&U[x-1].second>=b&&D[y].second<=b);
}ans[m]=0; puts(ans);
}return 0;
}
HDU 5741 Helter Skelter(构造法)的更多相关文章
- HDU 5741 Helter Skelter
离线处理+扫描线.题意很容易转化:若干个矩形形成并集,询问一些点是否在并集中? 官方题解不是这样做的....那种做法效率更高,暂时还不会.我这样是4500ms G++过的,C++TLE...... 区 ...
- Uva 120 - Stacks of Flapjacks(构造法)
UVA - 120 Stacks of Flapjacks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld &a ...
- 利用子集构造法实现NFA到DFA的转换
概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够 ...
- [Luogu4724][模板]三维凸包(增量构造法)
1.向量点积同二维,x1y1+x2y2+x3y3.向量叉积是行列式形式,(y1z2-z1y2,z1x2-x1z2,x1y2-y1x2). 2.增量构造法: 1)首先定义,一个平面由三个点唯一确定.一个 ...
- POJ 3295 Tautology (构造法)
Tautology Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7716 Accepted: 2935 Descrip ...
- 牛客网 牛客小白月赛2 A.数字方阵-反魔方阵,梁邱构造法
天坑未补... 水一波博客,再不写博客就咸成鱼干了,只写题不写题解,过一段时间就忘了自己学过什么了. 最近重点就是把开学以来写的题补出来,没学的就滚去学会啊(= =),填一下坑... 从这篇博客开始, ...
- 紫书 习题 8-24 UVa 10366 (构造法)
又是一道非常复杂的构造法-- #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a) ...
- 紫书 例题8-17 UVa 1609 (构造法)(详细注释)
这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...
- LeetCode42题,单调栈、构造法、two pointers,这道Hard题的解法这么多?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第23篇文章. 今天来看一道很有意思的题,它的难度是Hard,并且有许多种解法. 首先我们来看题面,说是我们有若 ...
随机推荐
- Java中Overload和Override的区别
由于项目正式收工,闲来无事突然发现以前的文档上有一个问题介绍的不是很详细 override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法 ...
- querySelectorAll的BUG
querySelector和querySelectorAll是W3C提供的新的查询接口 目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已经支持它们. 但是Eleme ...
- jjs 产生undefined的情况
<script type="text/javascript"> var outObj = { type :"java" } function inn ...
- nodejs 文件查找中文,替换为英文
帮以前同事解决一个需求,中文项目 翻译 英文项目~~~ 考虑到具体实现方面的问题,如果智能的话,肯定是要做中文的语法分析,不过感觉这个有难度. 所以最后的方案是遍历文件,将中文短语匹配出来,再进行人工 ...
- SQL Server 函数执行
在SQL Server 不只是procedure 可以用execute 来执行 function 也是可以的 例子: create function ufn_A( @i as int) returns ...
- [摘]ASP.Net标准控件(TextBox控件)
TextBox控件 TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属 性 说 ...
- 限制Inactive物料录入BOM
应用 Oracle Bill Of Materiel 层 Level Function 函数名 Funcgtion Name CUX_BOMFDBOM 表单名 Form Name CUXBOMFD ...
- javascript数组去重算法-----4
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- The Hardest Problem Ever(字符串)
The Hardest Problem Ever Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24039 Accept ...
- ZOJ1100 状压DP +深搜
记得做过类似于这类题目是能够用组合数学方法来解决的,可惜淡忘了,也找不到了,看了网上的也有人提到过能够用组合公式解决,但是没人做,都是用了状压DP的方法,这个状压非常难讲清楚吧,推荐两篇 第一遍大体看 ...