博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 444 C - DZY Loves Colors
阅读量:6544 次
发布时间:2019-06-24

本文共 2862 字,大约阅读时间需要 9 分钟。

思路:

分块,复杂度有点玄学,和普通分块不同的是在这个块被一次染色的时候暴力染整个块。

代码:

#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#include
using namespace std;#define fi first#define se second#define pi acos(-1.0)#define LL long long//#define mp make_pair#define pb push_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair
#define pii pair
#define piii pair
#define mem(a, b) memset(a, b, sizeof(a))#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);//headconst int N = 1e5 + 5, M = 410;int a[N], lazy[M], bl[N], blo, n;LL v[N], bv[M], sm[M];void push_down(int x) { for (int i = (x-1)*blo + 1; i <= min(x*blo, n); i++) a[i] = lazy[x]; lazy[x] = 0;}void first_color(int x, int value) { for (int i = (x-1)*blo + 1; i <= min(x*blo, n); i++) v[i] += abs(value - a[i]), sm[x] += abs(value - a[i]), a[i] = value;}void update(int l, int r, int x) { if(bl[l] == bl[r]) { if(lazy[bl[l]]) push_down(bl[l]); for (int i = l; i <= r; i++) v[i] += abs(a[i] - x), sm[bl[i]] += abs(a[i] - x), a[i] = x; return ; } else { if(lazy[bl[l]]) push_down(bl[l]); for (int i = l; i <= bl[l]*blo; i++) { sm[bl[i]] += abs(a[i] - x); v[i] += abs(a[i] - x); a[i] = x; } for (int i = bl[l]+1; i <= bl[r]-1; i++) { if(lazy[i]) { bv[i] += abs(x - lazy[i]); sm[i] += 1LL * blo * abs(x - lazy[i]); lazy[i] = x; } else { first_color(i, x); lazy[i] = x; } } if(lazy[bl[r]]) push_down(bl[r]); for (int i = (bl[r]-1)*blo + 1; i <= r; i++) { sm[bl[i]] += abs(a[i] - x); v[i] += abs(a[i] - x); a[i] = x; } }}LL query(int l, int r) { LL ans = 0; if(bl[l] == bl[r]){ for (int i = l; i <= r; i++) { ans += v[i] + bv[bl[i]]; } return ans; } for (int i = l; i <= bl[l]*blo; i++) { ans += v[i] + bv[bl[i]]; } for (int i = bl[l]+1; i <= bl[r]-1; i++) { ans += sm[i]; } for (int i = (bl[r]-1)*blo+1; i <= r; i++) { ans += v[i] + bv[bl[i]]; } return ans;}int main() { int m, ty, l, r, x; scanf("%d %d", &n, &m); blo = sqrt(n); for (int i = 1; i <= n; i++) { bl[i] = (i-1)/blo + 1; a[i] = i; v[i] = 0; } while(m--) { scanf("%d", &ty); if(ty == 1) { scanf("%d %d %d", &l, &r, &x); update(l, r, x); } else { scanf("%d %d", &l, &r); printf("%lld\n", query(l, r)); } } return 0;}

 

转载于:https://www.cnblogs.com/widsom/p/9524426.html

你可能感兴趣的文章
ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」
查看>>
2011/7/3 第二次评审
查看>>
Openvswitch手册(2): OpenFlow Controller
查看>>
tar解压
查看>>
inheritprototype原型继承封装及综合继承最简实例
查看>>
【磁耦隔离接口转换器】系列产品选型指南
查看>>
Apriori 关联算法学习
查看>>
Junit核心——测试集(TestSuite)
查看>>
MVPArms官方首发一键生成组件化,体验纯傻瓜式组件化开发
查看>>
Log4j_学习_00_资源帖
查看>>
制作iso镜像U盘自动化安装linux系统
查看>>
JSLint的使用
查看>>
命令行常用命令--软连接
查看>>
HTTP POST GET 本质区别详解
查看>>
OC继承专题
查看>>
PHP中HASH函数的优化技巧
查看>>
MD5加密
查看>>
ant
查看>>
微信,想要说爱你,却没有那么容易!
查看>>
有关sqlite与sql
查看>>