题目链接:http://codeforces.com/contest/444/problem/C
线段树水题。。
==反正就是那么搞,复杂度也没算,看看数据范围应该是差不多
嘛不要在意这些细节。。
cf注重暴力出奇迹_(:зゝ∠)_
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set> #include <vector> #include <map> using namespace std; #define ll long long #define L(x) (x<<1) #define R(x) (x<<1|1) #define N 100005 inline int Mid(int a,int b){return (a+b)>>1;} inline ll ABS(ll x){return x>0?x:-x;} int n,m; struct node{ int l, r, id; ll siz(){return (ll)(r-l+1);} ll sum, col, lazy, same; }tree[N<<2]; void push_down(int id){ if(tree[id].l==tree[id].r)return ; if(tree[id].lazy) { tree[L(id)].sum += tree[L(id)].siz()*tree[id].lazy; tree[R(id)].sum += tree[R(id)].siz()*tree[id].lazy; tree[L(id)].lazy += tree[id].lazy; tree[R(id)].lazy += tree[id].lazy; tree[id].lazy = 0; } if(tree[id].col>=0){ tree[L(id)].col = tree[R(id)].col = tree[id].col; } } void push_up(int id){ if(tree[L(id)].col==tree[R(id)].col&&tree[L(id)].col>=0) tree[id].col = tree[L(id)].col, tree[id].same = 1; else tree[id].col = -1, tree[id].same = 0; tree[id].sum = tree[L(id)].sum+tree[R(id)].sum; } void build(int l, int r, int id){ tree[id].l = l, tree[id].r = r; tree[id].sum = 0; tree[id].lazy = 0; tree[id].col = -1; tree[id].same = 0; if(l==r){ tree[id].col = l; tree[id].same = 1; return ; } int mid = Mid(l,r); build(l,mid,L(id)); build(mid+1,r,R(id)); } void updata(int l, int r, int id, ll col){ push_down(id); if(l==tree[id].l&&tree[id].r==r && tree[id].same){ tree[id].sum += tree[id].siz() * ABS(col-tree[id].col); tree[id].lazy += ABS(col-tree[id].col); tree[id].col = col; return ; } int mid = Mid(tree[id].l, tree[id].r); if(mid<l) updata(l,r,R(id),col); else if(r<=mid) updata(l,r,L(id),col); else { updata(l,mid,L(id),col); updata(mid+1,r,R(id),col); } push_up(id); } ll query(int l, int r, int id){ push_down(id); if(l==tree[id].l && tree[id].r==r) return tree[id].sum; int mid = Mid(tree[id].l, tree[id].r); if(mid<l) return query(l,r,R(id)); else if(r<=mid) return query(l,r,L(id)); else return query(l,mid,L(id))+query(mid+1,r,R(id)); } int main(){ int type, l, r; ll x; while(~scanf("%d %d",&n,&m)){ build(1,n,1); while(m--){ scanf("%d %d %d",&type,&l,&r); if(type==1){ scanf("%I64d",&x); updata(l,r,1,x); } else { printf("%I64d\n",query(l,r,1)); } } } return 0; }