CodeForces 444C 分块
题目链接:http://codeforces.com/problemset/problem/444/C
题意:给定一个长度为n的序列a[]。起初a[i]=i,然后还有一个色度的序列b[],起初b[i]=0。现在有2种操作:
1 l r x:区间染色,a[l],a[l+1]...a[r]变成x.同时b[l],b[l+1]...b[r]加上对应的|x-a[i]|值。
2 l r:统计区间和,统计区间b[l],b[l+1]...b[r]的和。
思路:线段树是比较常见的做法。考虑分块。每块维护一个lazy表示是否整块颜色都相同,Bsum表示块的b[i]总和.lazyb表示块的b[i]累加值的和。然后暴力维护即可。
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<math.h>
#include<time.h>
#include<vector>
#include<iostream>
#include<map>
using namespace std;
typedef long long int LL;
const int MAXN = + ;
int belong[MAXN], block, num, L[MAXN], R[MAXN];
int n, q;
LL a[MAXN],b[MAXN];
struct Node{
LL lazy, Bsum,lazyb;
}Bval[];
void build(){
block = (int)sqrt(n + 0.5);
num = n / block; if (n%block){ num++; }
for (int i = ; i <= num; i++){
Bval[i].Bsum = ; Bval[i].lazy = ; Bval[i].lazyb=;
L[i] = (i - )*block + ; R[i] = i*block;
}
R[num] = n;
for (int i = ; i <= n; i++){
belong[i] = ((i - ) / block) + ;
}
}
void modify(int st, int ed,int val){
if (belong[st] == belong[ed]){
if(Bval[belong[st]].lazy){
for(int i=L[belong[st]];i<=R[belong[st]];i++){
a[i]=Bval[belong[st]].lazy;
}
Bval[belong[st]].lazy=;
}
for(int i=st;i<=ed;i++){
Bval[belong[st]].Bsum+=abs(a[i]-val);
b[i]+=abs(a[i]-val);
a[i]=val;
}
return;
}
if(Bval[belong[st]].lazy){
for(int i=L[belong[st]];i<=R[belong[st]];i++){
a[i]=Bval[belong[st]].lazy;
}
Bval[belong[st]].lazy=;
}
for (int i = st; i <= R[belong[st]]; i++){
Bval[belong[st]].Bsum+=abs(val-a[i]);
b[i]+=abs(val-a[i]);
a[i]=val;
}
for (int i = belong[st] + ; i < belong[ed]; i++){
if(Bval[i].lazy){
Bval[i].lazyb+=abs(val-Bval[i].lazy);
Bval[i].Bsum+=(1LL*abs(Bval[i].lazy-val)*(R[i]-L[i]+));
Bval[i].lazy=val;
}
else{
for(int j=L[i];j<=R[i];j++){
b[j]+=abs(a[j]-val);
Bval[i].Bsum+=abs(a[j]-val);
a[j]=val;
}
Bval[i].lazy=val;
}
}
if(Bval[belong[ed]].lazy){
for(int i=L[belong[ed]];i<=R[belong[ed]];i++){
a[i]=Bval[belong[ed]].lazy;
}
Bval[belong[ed]].lazy=;
}
for (int i = L[belong[ed]]; i <= ed; i++){
Bval[belong[ed]].Bsum+=abs(val-a[i]);
b[i]+=abs(val-a[i]);
a[i]=val;
}
}
LL query(int st, int ed){
LL ans = ;
if (belong[st] == belong[ed]){
for (int i = st; i <= ed; i++){
ans += (b[i]+Bval[belong[st]].lazyb);
}
return ans;
}
for (int i = st; i <= R[belong[st]]; i++){
ans += (b[i]+Bval[belong[st]].lazyb);
}
for (int i = belong[st] + ; i < belong[ed]; i++){
ans += Bval[i].Bsum;
}
for (int i = L[belong[ed]]; i <= ed; i++){
ans += (b[i]+Bval[belong[ed]].lazyb);
}
return ans;
}
int main(){
//#ifdef kirito
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
//#endif
// int start = clock();
while (~scanf("%d%d", &n,&q)){
for (int i = ; i <= n; i++){ a[i]=i; b[i]=;}
build();
int type, l, r, v;
for (int i = ; i <= q; i++){
scanf("%d", &type);
if (type == ){
scanf("%d%d%d", &l, &r,&v);
modify(l, r,v);
}
else{
scanf("%d%d", &l, &r);
printf("%lld\n", query(l, r));
}
}
}
//#ifdef LOCAL_TIME
// cout << "[Finished in " << clock() - start << " ms]" << endl;
//#endif
return ;
}
CodeForces 444C 分块的更多相关文章
- Codeforces 444C DZY Loves Colors(线段树)
题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...
- CodeForces 455D 分块
题目链接:http://codeforces.com/problemset/problem/455/D 题意:给定一个长度为n的序列a[]. m次操作.共有两种操作 1 l r:将序列的a[l].a[ ...
- CodeForces 551E 分块
题目链接:http://codeforces.com/problemset/problem/551/E 题意:给定一个长度为N的序列. 有2个操作 1 l r v:序列第l项到第r项加v(区间加), ...
- CodeForces 103D 分块处理
题目链接:http://codeforces.com/problemset/problem/103/D 题意:给定一个长度为n的序列.然后q个询问.每个询问为(a,b),表示从序列第a项开始每b项的加 ...
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 828E) - 分块
Everyone knows that DNA strands consist of nucleotides. There are four types of nucleotides: "A ...
- CodeForces 13E 分块
题目链接:http://codeforces.com/problemset/problem/13/E 题意:给定n个弹簧和每个弹簧初始的弹力a[].当球落在第i个位置.则球会被弹到i+a[i]的位置. ...
- Serega and Fun CodeForces - 455D (分块 或 splay)
大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...
- CodeForces 444C 线段树
想分块想了很久一点思路都没有,结果一看都是写的线段树= = ...完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 ...
- CodeForces 444C. DZY Loves Physics(枚举+水题)
转载请注明出处:http://blog.csdn.net/u012860063/article/details/37509207 题目链接:http://codeforces.com/contest/ ...
随机推荐
- python变量
1. 系统变量 (1) '__doc__' 文件注释,在py中代码最上方""" """里面一般写注释,系统会把文件注释自动存放在'__doc ...
- java并发编程实战(java concurrency in practice)
第一章 线程共享进程范围内的资源,但每个线程都有各自的程序计数器.栈以及局部变量等. 多个线程可以同时调度到多个CPU上运行. 线程的优势? 在服务应用程序中,可以提升资源利用率以及系统吞吐率 ...
- CSS3学习(圆角、图片、阴影、背景、渐变、文本、字体、2D、3D、过渡等)
matrix CSS3 1. 圆角 border-radius:边框圆角的圆角半径 四个值:第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下角. 三个值:第一个值为左上角, 第二 ...
- SDL简介(网络汇总)
摄像头视频播放采用sdl,下面简单介绍下.不保证正确及网址永远有效.后面文章采用tao框架http://sourceforge.net/projects/taoframework/ SDL. ...
- 修改Excel2013默认模版(启动模版和新建Sheet模版)
1. C:\Windows\ShellNew\EXCEL12.XLSX 设置好格式后另存为, 然后复制过来覆盖掉,如果覆盖不了,注意修改所有者权限 2. 新建文件保存为模版文件Sheet.xltx, ...
- windows7下修改hosts文件无效解决办法(转)
通常会为了开发方便.或者屏蔽掉一些恶意网站,我们会在hosts(c:\windows\system32\drivers\etc\hosts)文件中进行相应的域名指向,例:
- [NHibernate]并发控制
目录 写在前面 文档与系列文章 并发控制 乐观并发控制(Optimistic Concurrency) 一个例子 悲观并发控制(Pessimistic Concurrency) 总结 写在前面 上篇文 ...
- FreeCodeCamp练习笔记
CSS样式表: 嵌套:body是最外层包围其他所有HTML元素(标签),其中的元素样式都可覆盖body的样式. 覆盖:同一元素有多个样式,位置靠后的样式覆盖位置靠前的样式. id:id与位置无关,可任 ...
- UI第七节——UISlider详解
- (void)viewDidLoad { [super viewDidLoad]; // 实例化UISlider,高度对外观没有影响 UISlider *slider = [[UISlider al ...
- 【荐】JavaScript编码风格
作者:阮一峰 Douglas Crockford是 JavaScript 权威,Json 格式就是他的发明. 去年 11 月他有一个演讲(Youtube),谈到了好的 JavaScript 编程风格是 ...