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,并且有许多种解法. 首先我们来看题面,说是我们有若 ...
随机推荐
- 独立版Jexus
一:下载资源包 把 jexus压缩包下载到linux临时文件夹中. cd /tmp wget linuxdot.net/down/jexus--x64.tar.gz 二,解压: tar -zxvf j ...
- eclipse序列化生成serialVersionUID
serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 如果你修改代码重新部署后出现序列化错误,可以考虑给相应的类增加serialVersio ...
- JavaScript装逼指南
如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?下面列出一些在JavaScrip ...
- ajax防止重复提交请求1
ajax防止重复提交请求 A. 独占型提交 只允许同时存在一次提交操作,并且直到本次提交完成才能进行下一次提交. module.submit = function() { if (this.pro ...
- 使用bootstrap做一个响应式的页面
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python 字符串格式化示例
先看代码吧. #!/usr/bin/env python #-*- coding: utf-8 -*- __author__ = 'jiang' __creattime__ = '2015/10/31 ...
- 概率法求解三阶幻方[C语言]
#include <stdio.h> #include <string.h> ]={,,,,,,,,}; ]; ][]; int sum(int su[]) { ; ;su[i ...
- poj2163
#include <stdio.h> #include <stdlib.h> int main() { ; ]; scanf("%d %d %d",& ...
- 汉诺塔III 汉诺塔IV 汉诺塔V (规律)
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Android开发实例之闹钟提醒
本实例通过TimePickerDialog时间选择对话框让用户设置闹钟.并通过AlarmManager全局定时器在指定的时间启动闹钟Activity . 程序执行效果图: 实例代码: package ...