zoukankan      html  css  js  c++  java
  • Codeforces Round #254 (Div. 1) C. DZY Loves Colors 分块

    C. DZY Loves Colors

    题目连接:

    http://codeforces.com/contest/444/problem/C

    Description

    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 3
    1 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
    " , res );
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    C#--带参SQL语句数通用数据访问类
    VS 2017产品密匙
    关于编码中的字符和字节问题
    关于C++中的cin用法
    C++基础(一、基本语法,Hello World)
    Oracle查看用户所在的表空间
    静态变量、枚举、以及静态代码块的使用场景
    Java 枚举(enum) 详解7种常见的用法
    第一章 对象和封装
    摘抄Java反射
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5468637.html
Copyright © 2011-2022 走看看