1. 程式人生 > >E - Just a Hook

E - Just a Hook

width div problem mem log .net cst size ret

E - Just a Hook

HDU 1698 思路:區間修改即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,m,tot;
struct nond{
    int l,r;
    int sum,falg;
}tree[101000*4];
void up(int now){
    tree[now].sum=tree[now<<1
].sum+tree[now<<1|1].sum; } void build(int now,int l,int r){ tree[now].l=l; tree[now].r=r; if(tree[now].l==tree[now].r){ tree[now].sum=1; return ; } int mid=(tree[now].l+tree[now].r)>>1; build(now<<1,l,mid); build(now<<1|1
,mid+1,r); up(now); } void down(int now){ tree[now<<1].sum=(tree[now<<1].r-tree[now<<1].l+1)*tree[now].falg; tree[now<<1|1].sum=(tree[now<<1|1].r-tree[now<<1|1].l+1)*tree[now].falg; tree[now<<1].falg=tree[now<<1|1].falg=tree[now].falg; tree[now].falg
=0; } void change(int now,int l,int r,int x){ if(tree[now].l==l&&tree[now].r==r){ tree[now].sum=(tree[now].r-tree[now].l+1)*x; tree[now].falg=x; return; } if(tree[now].falg) down(now); int mid=(tree[now].l+tree[now].r)>>1; if(r<=mid) change(now<<1,l,r,x); else if(l>mid) change(now<<1|1,l,r,x); else{ change(now<<1,l,mid,x);change(now<<1|1,mid+1,r,x); } up(now); } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n);tot++; memset(tree,0,sizeof(tree)); build(1,1,n);scanf("%d",&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); change(1,x,y,z); } printf("Case %d: The total value of the hook is %d.\n",tot,tree[1].sum); } }

E - Just a Hook