搜索
查看: 522|回复: 5
打印 上一主题 下一主题

借教室 线段树+懒标记

[复制链接]
跳转到指定楼层
楼主
发表于 2017-10-23 20:02:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[mw_shl_code=cpp,true]#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
    int left,right,num,lazy;
}dataa[2000010];
int readd[1000001],jud=0;
void buildtree(int x,int y,int cur)
{
    int mid;
    dataa[cur].left=x;dataa[cur].right=y;
    if(x==y) dataa[cur].num=readd[x];
    else
    {
        mid=(x+y)/2;
        buildtree(x,mid,cur*2);buildtree(mid+1,y,cur*2+1);
        dataa[cur].num=min(dataa[cur*2].num,dataa[cur*2+1].num);
    }
}
void change(int sum,int x,int y,int cur)
{
    int mid;
    if(dataa[cur].left>=x && dataa[cur].right<=y)
    {
        dataa[cur].num-=sum;dataa[cur].lazy+=sum;
        if(dataa[cur].num<0) jud=1;
    }
    else
    {
        mid=(dataa[cur].left+dataa[cur].right)/2;
        dataa[cur*2].num-=dataa[cur].lazy;dataa[cur*2+1].num-=dataa[cur].lazy;
        dataa[cur*2].lazy+=dataa[cur].lazy;dataa[cur*2+1].lazy+=dataa[cur].lazy;
        dataa[cur].lazy=0;
        if(y<=mid) change(sum,x,y,cur*2);
        else if(x>=mid+1) change(sum,x,y,cur*2+1);
        else{change(sum,x,y,cur*2);change(sum,x,y,cur*2+1);}
        dataa[cur].num=min(dataa[cur*2].num,dataa[cur*2+1].num);
    }
}
int main()
{
    int m,n,i,a,b,c,ans=0;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++) scanf("%d",&readd);
    buildtree(1,n,1);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&a,&b,&c);
        change(a,b,c,1);
        if(jud==1 && ans==0) {ans=i;break;}
    }
    if(ans==0) printf("0");
    else printf("-1\n%d",ans);
    return 0;
}[/mw_shl_code]
沙发
发表于 2017-11-5 19:21:46 | 只看该作者
- -
4567890
板凳
发表于 2018-3-24 14:23:57 | 只看该作者
但是为什么这个题我写的线段树会被卡掉一个点?
地板
发表于 2018-3-24 14:29:38 | 只看该作者
而且你这个代码还没有位运算优化。所以我到底哪儿常数写大了...
5#
发表于 2018-3-27 18:22:27 | 只看该作者
CommandCraft 发表于 2018-3-24 14:29
而且你这个代码还没有位运算优化。所以我到底哪儿常数写大了...

我看你真的是常数大了.jpg
标算差分的题强行加 log

6#
发表于 2018-3-31 23:14:05 | 只看该作者
4399APPLE 发表于 2018-3-27 18:22
我看你真的是常数大了.jpg
标算差分的题强行加 log

标算我记得是有个二分答案吧。跟线段树一样都是nlogn。
反正我写的代码一直都是自带大常数了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表