http://codeforces.com/problemset/problem/484/E

题意

给定一个长度为n的数列,有m次询问,询问形如l r k

要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值

整体二分啊。。。。O((n+m)log(n)log(值域))

对于一个询问,可以二分答案后(设二分出的答案为ans),将>=ans的数标记为1,<ans的数标记为0,然后求该询问区间内最长的连续且全为1的一段的长度x,如果x>=该询问要求的k则合法,否则不合法;

多次询问,发现可以整体二分

(如果带修改,貌似要可持久化一下整体二分中用的线段树?log^3??)

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Q
{
int type;
int l,r,x,num;
int pos,d;
}q[],qt1[],qt2[];
int n,m,ans[],len;
//二分答案后,将>=mid+1的数改为1,<mid+1的数改为0,判定区间最长连续1的长度是否>=k
namespace SegT
{
struct Info
{
int ld,rd,xd,sz;
bool a1;
}dat[];
Info operator+(const Info &a,const Info &b)
{
Info c;
c.a1=a.a1&&b.a1;c.sz=a.sz+b.sz;
c.ld=a.a1?a.sz+b.ld:a.ld;c.rd=b.a1?b.sz+a.rd:b.rd;
c.xd=max(a.rd+b.ld,max(a.xd,b.xd));
return c;
}
Info nn[]={{,,,,},{,,,,}};
int L,R,x;
#define mid (l+((r-l)>>1))
#define lc (num<<1)
#define rc (num<<1|1)
void build(int l,int r,int num)
{
if(l==r) {dat[num]=nn[];return;}
build(l,mid,lc);build(mid+,r,rc);
dat[num]=dat[lc]+dat[rc];
}
void _setx(int l,int r,int num)
{
if(l==r) {dat[num]=nn[x];return;}
if(L<=mid) _setx(l,mid,lc);
else _setx(mid+,r,rc);
dat[num]=dat[lc]+dat[rc];
}
Info _query(int l,int r,int num)
{
if(L<=l&&r<=R) return dat[num];
if(L<=mid&&mid<R) return _query(l,mid,lc)+_query(mid+,r,rc);
if(L<=mid) return _query(l,mid,lc);
if(mid<R) return _query(mid+,r,rc);
exit(-);
}
void setx(int l,int d)
{
L=l;x=d;_setx(,n,);
}
int query(int l,int r)
{
L=l;R=r;return _query(,n,).xd;
}
#undef mid
#undef lc
#undef rc
}
void solve(int lp,int rp,int l,int r)
{
if(lp>rp) return;
int i;
if(l==r)
{
for(i=lp;i<=rp;i++)
if(q[i].type==)
ans[q[i].num]=l;
return;
}
int mid=l+((r-l)>>),tlen1=,tlen2=;//qt1-->l,mid;qt2-->mid+1,r
for(i=lp;i<=rp;i++)
{
if(q[i].type==)
{
if(q[i].d>mid)
SegT::setx(q[i].pos,),qt2[++tlen2]=q[i];
else
qt1[++tlen1]=q[i];
}
else
{
if(SegT::query(q[i].l,q[i].r)>=q[i].x) qt2[++tlen2]=q[i];
else qt1[++tlen1]=q[i];
}
}
memcpy(q+lp,qt1+,sizeof(Q)*tlen1);
memcpy(q+lp+tlen1,qt2+,sizeof(Q)*tlen2);
solve(lp,lp+tlen1-,l,mid);
for(i=lp+tlen1;i<=rp;i++)
if(q[i].type==)
SegT::setx(q[i].pos,);
solve(lp+tlen1,rp,mid+,r);
}
int main()
{
int i,t;
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&t),q[++len].type=,q[len].pos=i,q[len].d=t;
scanf("%d",&m);
for(i=;i<=m;i++) q[++len].type=,scanf("%d%d%d",&q[len].l,&q[len].r,&q[len].x),q[len].num=i;
SegT::build(,n,);
solve(,len,,1e9);
for(i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}

貌似由于此题没有修改,可持久化线段树就是一个log了23333还是两个log,询问还是要二分答案的;可持久化线段树的做法大概是先离散化,然后将所有位置的值从小到大排序,建n棵线段树(当然共用了很多节点),第i棵线段树的第j位表示a[j]是(1)否(0)大于等于(所有n个数中)第i小的数(建法...应该是好建的,先不管了);查询就二分答案(设二分出的答案为ans,注意离散化),在第ans棵线段树上对应区间查询最长连续全为1段的长度,判合法;

Sign on Fence CodeForces - 484E的更多相关文章

  1. AC日记——Sign on Fence Codeforces 484e

    E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...

  2. Codeforces 484E Sign on Fence(是持久的段树+二分法)

    题目链接:Codeforces 484E Sign on Fence 题目大意:给定给一个序列,每一个位置有一个值,表示高度,如今有若干查询,每次查询l,r,w,表示在区间l,r中, 连续最长长度大于 ...

  3. CF&&CC百套计划4 Codeforces Round #276 (Div. 1) E. Sign on Fence

    http://codeforces.com/contest/484/problem/E 题意: 给出n个数,查询最大的在区间[l,r]内,长为w的子区间的最小值 第i棵线段树表示>=i的数 维护 ...

  4. CF 484E - Sign on Fence

    E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...

  5. Codeforces Round #276 (Div. 1) E. Sign on Fence 二分+主席树

    E. Sign on Fence   Bizon the Champion has recently finished painting his wood fence. The fence consi ...

  6. 【CF484E】Sign on Fence(主席树)

    [CF484E]Sign on Fence(主席树) 题面 懒得贴CF了,你们自己都找得到 洛谷 题解 这不就是[TJOI&HEOI 排序]那题的套路吗... 二分一个答案,把大于答案的都变成 ...

  7. CF484E Sign on Fence && [国家集训队]middle

    CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...

  8. (困难) CF 484E Sign on Fence,整体二分+线段树

    Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...

  9. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)

    链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...

随机推荐

  1. [Javascript] Use JavaScript's for-in Loop on Objects with Prototypes

    Loops can behave differently when objects have chained prototype objects. Let's see the difference w ...

  2. VC++ VS2010 error LNK1123 转换到 COFF 期间失败 怎么办

    1 无法输出Hello world   2 点击项目-属性,打开属性页   3 配置属性-清单工具-输入和输出-嵌入清单改成否   4 找出计算机中的所有cvtres.exe,删掉早期的,只留最新版的 ...

  3. #define中的#和##作用

    #define语句中的#是把参数字符串化,##是连接两个参数成为一个整体. #define FACTORY_REF(name) { #name, Make##name } 中#name就是将传入的na ...

  4. 编程之美 之 让CPU占用率听你指挥

    昨天在bbs上淘到了这本编程之美.顺手刷了第一章,很有意思.第一章的要求是要控制CPU曲线,绘制出对应的形状. 拿到这个问题,我的第一反应是, 是不是有这么一个API,能在任务管理器上的对应区域直接绘 ...

  5. hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)

    1.题目大意是,给你一个1000位的数,要你删掉m个为,求结果最小数. 思路:在n个位里面删除m个位.也就是找出n-m个位组成最小数 所以在区间 [0, m]里面找最小的数.相应的下标标号i 接着找区 ...

  6. Spring AOP监控SQL运行

    对数据库连接池Proxool比較熟悉的读者,都知道Proxool能够记录SQL运行内容和时间等信息日志. 我们能够将该日志记录专门的SQL日志文件.对于查找运行特别耗时的SQL起了不小的作用. 对于一 ...

  7. HTML5裁剪图片并上传至服务器实现原理讲解

    HTML5裁剪图片并上传至服务器实现原理讲解   经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...

  8. PL/SQL Developer导入导出Oracle数据库方法

    前一篇博客介绍了Navicat工具备份Oracle的方法.这篇博客介绍一下使用PL/SQL Developer工具导入导出Oracle数据库的方法. PL/SQL Developer是Oracle数据 ...

  9. hibernate could not resolve property

    映射文件字段不匹配 这个异常一般是因为映射文件造成的: 1.hibernate.config.xml中添加的映射文件是否正确 2.映射文件中的类是否正确指定. 3.映射文件映射的属性名是否跟类中的属性 ...

  10. Pulse-code modulation

    脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ...