[kuangbin带你飞]专题七 线段树 E HDU 1698

来源:互联网 发布:淘宝寄错东西怎么办 编辑:程序博客网 时间:2024/05/20 23:57

题目地址:https://vjudge.net/contest/66989#problem/E

思路:区间更新为特定值。套了一下之前的lazy操作的模板,结果样例都过不了。各种查,最后才发现,位运算要加括号啊!!

AC代码:

#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;struct seq{    int l,r,n,add;}T[maxn*4];void build(int l,int r,int k){    T[k].l=l,T[k].r=r,T[k].add=0;    if(l==r)    {        T[k].n=1;        return;    }    int mid=(l+r)>>1;    build(l,mid,k<<1);    build(mid+1,r,k<<1|1);    T[k].n=T[k<<1].n+T[k<<1|1].n;}void PushDown(int k,int m){    if(T[k].add)    {        T[k<<1].add=T[k<<1|1].add=T[k].add;        T[k<<1].n=T[k].add*(m-(m>>1));        T[k<<1|1].n=T[k].add*(m>>1);        T[k].add=0;    }}void update(int l,int r,int n,int k){    if(l==T[k].l && r==T[k].r)    {        T[k].add=n;        //printf("%d\n",k);        T[k].n=n*(r-l+1);        return;    }    if(T[k].l==T[k].r) return;    PushDown(k,T[k].r-T[k].l+1);    int mid=(T[k].l+T[k].r)>>1;    if(l>mid)        update(l,r,n,k<<1|1);    else if(r<=mid)        update(l,r,n,k<<1);    else    {        update(l,mid,n,k<<1);        update(mid+1,r,n,k<<1|1);    }    T[k].n=T[k<<1].n+T[k<<1|1].n;    //printf("%d %d\n",T[k].n,k);}int main(){    int t;    scanf("%d",&t);    for(int casei=1;casei<=t;casei++)    {        int n;        scanf("%d",&n);        build(1,n,1);        int m;        scanf("%d",&m);        while(m--)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            update(a,b,c,1);            //printf("\n");        }        printf("Case %d: The total value of the hook is %d.\n",casei,T[1].n);    }}


0 0