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

FOJ2022车站 线段树区间合并

时间:2015-11-04 22:56:38      阅读:348      评论:0      收藏:0      [点我收藏+]

标签:

http://acm.fzu.edu.cn/problem.php?pid=2022

刚开始MLE,用map对应,果断爆内存了,然后改用去重,离散化, lowbound查找元素位置,速度还不错,不过pushup写也是醉了,一遍遍错,最后发现

if(o[rt].left==INF||o[rt].right==INF||o[rt].left==o[rt].right)l=INF;这一句第三个判断必须加,发现这样可以避免那种只由一个点往上更新的错误,也是非常的伤感。。。。。

技术分享
/*96655 ‘s source code for D
Memory: 30072 KB        Time: 265 MS
Language: GNU C++        Result: Accepted
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
const int maxn=500000+10;
const int INF=1e9+7;
struct asd
{
    int x;
    char c;
} q[maxn];
bool vis[maxn];
int a[maxn];
struct node
{
    int left,right,v;
} o[maxn<<2];
void pushup(int rt)
{
    o[rt].left=min(o[rt*2].left,o[rt*2+1].left);
    if(o[rt*2+1].right!=INF) o[rt].right=o[rt*2+1].right;
    else   o[rt].right=o[rt*2].right;
    int l=fabs(o[rt*2].right-o[rt*2+1].left);
    if(o[rt].left==INF||o[rt].right==INF||o[rt].left==o[rt].right)l=INF;
    o[rt].v=min(min(o[rt*2].v,o[rt*2+1].v),l);
}
void build(int rt,int l,int r)
{
    if(l==r)
    {
        o[rt].left=o[rt].right=o[rt].v=INF;
        return;
    }
    int m=(l+r)>>1;
    build(rt*2,l,m);
    build(rt*2+1,m+1,r);
    pushup(rt);
}
void change(int rt,int l,int r,int pos,int p)
{
    if(l==r)
    {
        if(p)o[rt].left=o[rt].right=a[l-1];
        else o[rt].left=o[rt].right=INF;
        return;
    }
    int m=(l+r)>>1;
    if(pos<=m)change(rt*2,l,m,pos,p);
    else change(rt*2+1,m+1,r,pos,p);
    pushup(rt);
}
int main()
{
    int T;
    char s[5];
    while(~scanf("%d",&T))
    {
        int cnt=1,sum=0,k=0;
        for(int i=1; i<=T; ++i)
        {
            scanf("%s",s);
            q[i].c=s[0];
            if(s[0]==m)continue;
            scanf("%d",&q[i].x);
            a[k++]=q[i].x;
        }
        sort(a,a+k);
        for(int i=1; i<k; i++)
            if(a[i]!=a[i-1])a[cnt++]=a[i];
        build(1,1,cnt);
        memset(vis,0,sizeof(vis));
        for(int i=1; i<=T; i++)
        {
            if(q[i].c==a)
            {
                int pos=lower_bound(a,a+cnt,q[i].x)-a;
                pos++;
                if(vis[pos])continue;
                vis[pos]=1;
                ++sum;
                change(1,1,cnt,pos,1);
            }
            else if(q[i].c==d)
            {
                int pos=lower_bound(a,a+cnt,q[i].x)-a;
                pos++;
                if(!vis[pos])continue;
                vis[pos]=0;
                --sum;
                change(1,1,cnt,pos,0);
            }
            else
            {
                if(sum<2)printf("0\n");
                else printf("%d\n",o[1].v);
            }
        }
    }
    return 0;
}
View Code

唯一值得欣慰的是速度还不错。。。。QAQ

FOJ2022车站 线段树区间合并

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/4937543.html

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