zoukankan      html  css  js  c++  java
  • 【NOIP】提高组2012 借教室

    【算法】线段树||二分+前缀和

    【题解】线段树记录区间加值和区间最大值。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=1e6;
    struct treess{int l,r,ms,delta;}t[maxn*3];
    int a[maxn],n,m;
    int read()
    {
        int x=0,f=1;
        char c=getchar();
        while(c<'0'||c>'9')
         {
             if(c=='-')f=-1;
             c=getchar();
         }
        while(c>='0'&&c<='9')
         {
             x=x*10+c-'0';
             c=getchar();
         }
        return x*f;
    }
    void build(int k,int l,int r)
    {
        t[k].l=l;t[k].r=r;
        if(l==r){t[k].ms=a[l];return;}
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        t[k].ms=min(t[k<<1].ms,t[k<<1|1].ms);
    }
    void update(int k,int l,int r,int num)
    {
        int left=t[k].l,right=t[k].r;
        if(l<=left&&r>=right)
         {
    //         t[k].ms-=num;
             t[k].delta+=num;
         }
        else
         {
            int mid=(left+right)>>1;
            if(l<=mid)update(k<<1,l,r,num);
            if(r>mid)update(k<<1|1,l,r,num);
            t[k].ms=min(t[k<<1].ms-t[k<<1].delta,t[k<<1|1].ms-t[k<<1|1].delta);
         }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)a[i]=read();
        build(1,1,n);
        for(int i=1;i<=m;i++)
         {
             int d=read(),s=read(),t_=read();
             update(1,s,t_,d);
             if(t[1].ms-t[1].delta<0)
              {
                  printf("-1
    %d",i);
                  return 0;
              }
         }
        printf("0");
        return 0;
    }
    View Code

    另一种写法:

    二分答案,将询问差分,O(1)修改,然后O(n)查询前缀和。复杂度O(n log n+n log n)。

  • 相关阅读:
    【转载】C++汇编器、连接器
    【转载】vi的使用命令
    JDK,SDK,JRE概念
    iOS 使用xmpp做聊天客户端
    cocopods安装
    用XMPP实现完整Android聊天项目
    xmpp发送文件
    ember.js学习笔记
    html5 drag and drop
    jquery 数组深拷贝
  • 原文地址:https://www.cnblogs.com/onioncyc/p/5841909.html
Copyright © 2011-2022 走看看