码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2276: [Poi2011]Temperature(单调队列/堆)

时间:2017-09-16 14:59:58      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:show   eve   最大   int   zoj   inter   get   isp   empty   

  这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已

  单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为结尾的最大答案了

技术分享
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
const int maxn=1000010,inf=1e9;
int n,fir,ans;
int a[maxn],b[maxn],q[maxn];
inline void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<0||c>9)c==-&&(f=-1),c=getchar();
    while(c<=9&&c>=0)k=k*10+c-0,c=getchar();
    k*=f;
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++)read(a[i]),read(b[i]);
    int l=1,r=0;fir=1;
    for(int i=1;i<=n;i++)
    {
        while(l<=r&&a[q[l]]>b[i])fir=max(fir,q[l++]+1);
        ans=max(ans,i-fir+1);
        while(l<=r&&a[q[r]]<=a[i])r--;
        q[++r]=i;
    }
    printf("%d\n",ans);
}
View Code

  堆O(Nlogn):

    比赛时候的写法...实在没想到单调队列

    用two pointers,从l,r要扩展到l,r+1的时候只需要判断l~r里最大的a[]是不是<=b[r+1]就可以扩展了,这个可以用堆维护,左指针移动的时候删去堆中左指针的数。

技术分享
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<queue>
using namespace std;
const int maxn=1000010,inf=1e9;
struct poi{int sum,pos;};
priority_queue<poi>q;
bool operator<(poi a,poi b){return a.sum<b.sum;}
int n,ans;
int a[maxn],b[maxn];
bool v[maxn];
inline void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<0||c>9)c==-&&(f=-1),c=getchar();
    while(c<=9&&c>=0)k=k*10+c-0,c=getchar();
    k*=f;
}
inline int find()
{
    if(q.empty())return -inf;
    poi t;for(t=q.top();v[t.pos]&&(!q.empty());q.pop(),t=q.top());
    return q.empty()?-inf:t.sum;
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++)read(a[i]),read(b[i]);
    for(int i=1,j=1;j<=n;i++)
    {
        j=max(i,j);
        for(int t=find();j<=n;j++,t=find())
        {
            if(t>b[j])break;
            q.push((poi){a[j],j});
            ans=max(ans,j-i+1);
        }
        v[i]=1;
    }
    printf("%d\n",ans);
}
View Code

 

bzoj2276: [Poi2011]Temperature(单调队列/堆)

标签:show   eve   最大   int   zoj   inter   get   isp   empty   

原文地址:http://www.cnblogs.com/Sakits/p/7531154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!