第一次写成段更新的线段树。。。刚开始不晓得记录节点信息好,也不知道什么时候lazy标记向下传递。。。现在终于理解了lazy标记。。。贴上自己写的代码。。不过一直不知道为嘛自己写的代码跑的没别人快。。。。
#include <iostream> #include <sstream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <climits> #define maxn 400005 #define eps 1e-7 #define mod 1000000007 #define INF 99999999 #define lowbit(x) (x&(-x)) typedef long long LL; using namespace std; struct node { int v, mark; }segtree[maxn]; int n, m, k; int ql, qr, __; void build(int o, int L, int R) { segtree[o].v=R-L+1; segtree[o].mark=0; if(L==R) return; int mid=(L+R)>>1; build(o<<1, L, mid); build((o<<1)+1, mid+1, R); } void pushdown(int o, int L, int R) { if(!segtree[o].mark) return; int tmp=segtree[o].mark, mid=(L+R)>>1; segtree[o<<1].mark=segtree[o].mark; segtree[o<<1].v=(mid-L+1)*tmp; segtree[(o<<1)+1].mark=segtree[o].mark; segtree[(o<<1)+1].v=(R-mid)*tmp; segtree[o].mark=0; } void updata(int o, int L, int R) { if(ql<=L && qr>=R){ segtree[o].mark=k; segtree[o].v=(R-L+1)*k; return; } pushdown(o, L, R); int mid=(L+R)>>1; if(ql<=mid) updata(o<<1, L, mid); if(qr>mid) updata((o<<1)+1, mid+1, R); segtree[o].v=segtree[o<<1].v+segtree[(o<<1)+1].v; } void solve(void) { while(m--){ scanf("%d%d%d",&ql,&qr,&k); updata(1, 1, n); } printf("Case %d: The total value of the hook is %d.\n", ++__, segtree[1].v); } int main(void) { int _; while(scanf("%d",&_)!=EOF){ __=0; while(_--){ scanf("%d%d",&n,&m); build(1, 1, n); solve(); } } return 0; }