Codeforces Round #254 (Div. 1) C. DZY Loves Colors 分块
2016-05-07 16:46
603 查看
C. DZY Loves Colors
题目连接:
http://codeforces.com/contest/444/problem/CDescription
DZY loves colors, and he enjoys painting.On a colorful day, DZY gets a colorful ribbon, which consists of n units (they are numbered from 1 to n from left to right). The color of the i-th unit of the ribbon is i at first. It is colorful enough, but we still consider that the colorfulness of each unit is 0 at first.
DZY loves painting, we know. He takes up a paintbrush with color x and uses it to draw a line on the ribbon. In such a case some contiguous units are painted. Imagine that the color of unit i currently is y. When it is painted by this paintbrush, the color of the unit becomes x, and the colorfulness of the unit increases by |x - y|.
DZY wants to perform m operations, each operation can be one of the following:
Paint all the units with numbers between l and r (both inclusive) with color x.
Ask the sum of colorfulness of the units between l and r (both inclusive).
Can you help DZY?
Input
The first line contains two space-separated integers n, m (1 ≤ n, m ≤ 105).Each of the next m lines begins with a integer type (1 ≤ type ≤ 2), which represents the type of this operation.
If type = 1, there will be 3 more integers l, r, x (1 ≤ l ≤ r ≤ n; 1 ≤ x ≤ 108) in this line, describing an operation 1.
If type = 2, there will be 2 more integers l, r (1 ≤ l ≤ r ≤ n) in this line, describing an operation 2.
Output
For each operation 2, print a line containing the answer — sum of colorfulness.Sample Input
3 31 1 2 4
1 2 3 5
2 1 3
Sample Output
8题意
一开始,a[i]=i,b[i]=0然后两个操作
1.使得[l,r]的b[i]+=fabs(x-a[i]),a[i]=x
2.查询[l,r]的b[i]和
题解:
这种乱七八糟更新的,直接分块去莽一波就好了打一个lazy标记,然后直接跑分块就好了……
当然,这个更新为定值的,其实一般都是最后可以缩成一个点什么的,用一个线段树去莽,这感觉也是可以做的,这是套路
代码
#include <bits/stdc++.h> using namespace std; #define lowbit(x) ((x)&(-x)) const int maxn = 1e5 + 500; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n , m , unit , a[maxn] ; long long extra[maxn] , lz[maxn] , ls[maxn] , b[maxn]; int main( int argc , char * argv[] ){ n = read() , m = read(); unit = sqrt( n ); for(int i = 0 ; i < n ; ++ i) a[i] = i + 1; while( m -- ){ int op = read() , l = read() , r = read() , x; --l; --r; if( op == 1 ){ x = read(); for(int i = l ; i <= r ; ){ int idx = i / unit; int st = idx * unit; int ed = min( n , ( idx + 1 ) * unit ); if( i == st && r >= ed - 1 ){ if( ls[idx] ){ extra[idx] += 1LL * abs( x - ls[idx] ) * ( ed - st ) ; lz[idx] += abs( x - ls[idx] ); ls[idx] = x; } else{ for(int j = st ; j < ed ; ++ j){ b[j] += abs( a[j] - x ); extra[idx] += abs( a[j] - x ); a[j] = x; } ls[idx] = x; } i = ed; }else{ if( ls[idx] ){ for(int j = st ; j < ed ; ++ j) a[j] = ls[idx]; ls[idx] = 0; } extra[idx] += abs( a[i] - x ); b[i] += abs( a[i] - x ); a[i] = x; ++ i; } } }else{ long long res = 0; for(int i = l ; i <= r ; ){ int idx = i / unit; int st = idx * unit; int ed = min( n , ( idx + 1 ) * unit ); if( i == st && r >= ed - 1 ){ res += extra[idx]; i = ed; }else{ res += b[i] + lz[idx]; ++ i; } } printf("%lld\n" , res ); } } return 0; }
相关文章推荐
- [AWS] Install the AWS cli
- Remove Duplicates from Sorted Array
- 2016年5月7日所用即所需
- ScrollView&ListView
- idea中的jsp页面out对象无法调用write
- java中的IO整理
- hdu_3068_最长回文(Manacher)
- POJ-1459 Power Network (最大流[Ford-Fulkerson])
- MyEclipse开发J2EE常见问题
- xml解析-dom4j方式
- hdu_3068_最长回文(Manacher)
- 数据结构实验之链表六:有序链表的建立
- 谈C# using的用法与好处
- oracle数据库sql语句
- python 文件读写5个实例
- CSS三列自适应布局
- PAT L1-6. 连续因子 (暴力)
- 【皇甫】☀四套写入方案(仅供参考)
- JobClient
- YJPageView