Transformation

http://acm.hdu.edu.cn/showproblem.php?pid=4578

题意:

含n个数字的的数列a各数字初值均为0,对其进行m次操作,每次操作可为下列之一:

1 x y c:ax到ay间的数字(含边界)均增加c

2 x y c:ax到ay间的数字(含边界)均乘以c

3 x y c:ax到ay间的数字(含边界)均变为c

4 x y p:输出ax到ay间的数字(含边界)的p次方之和

对于每个操作4,输出答案模10007

数据组数<=10。

1<=n,m<=1e5,1<=x<=y<=n,1<=c<=1e4,1<=p<=3

输入 0 0结束

解法:

有特意限制p就是水题了

假如p = 1那么显然就是普通的线段树

当p = 2或者p = 3的时候,第2、3种操作依然比较好处理

而对于第一种,我们列个求和公式就能发现更新其实很方便的

线段树里s[i]代表该线段覆覆盖元素的 i 次方之和

更新很简单(自己列求和公式想不出来就参照代码里pushdown函数吧

实现:

脑抽了没有线段树没有开s数组而是直接申请了三个变量s1,s2,s3

实际证明完全是给自己找麻烦

手残居然磨磨唧唧写了1h...

还WA了...算了明天再改吧晚安

  1 #include <cstdio>
  2
  3 #define lc (o << 1)
  4 #define rc (o << 1 | 1)
  5
  6 typedef long long ll;
  7
  8 const int Mod = 10007;
  9 const int maxn = 100010;
 10
 11 struct node {
 12     ll s1, s2, s3;
 13     ll laza, lazm, lazc;
 14     void clear() {
 15         s1 = s2 = s3 = 0;
 16         laza = lazc = 0;
 17         lazm = 1;
 18     }
 19 }tr[maxn << 2];
 20
 21 ll z;
 22 int Case, n, m, x, y, op;
 23
 24 void pushup(int o) {
 25     tr[o].s1 = tr[lc].s1 + tr[rc].s1;
 26     tr[o].s2 = tr[lc].s2 + tr[rc].s2;
 27     tr[o].s3 = tr[lc].s3 + tr[rc].s3;
 28 }
 29
 30 void pushdown(int o, int l, int r) {
 31     int mid = (l + r) >> 1;
 32     if(tr[o].lazc) {
 33         tr[lc].s3 = tr[o].lazc * tr[o].lazc * tr[o].lazc * (mid - l + 1)  % Mod;
 34         tr[rc].s3 = tr[o].lazc * tr[o].lazc * tr[o].lazc * (r - mid)  % Mod;
 35         tr[lc].s2 = tr[o].lazc * tr[o].lazc * (mid - l + 1) % Mod;
 36         tr[rc].s2 = tr[o].lazc * tr[o].lazc * (r - mid) % Mod;
 37         tr[lc].s1 = tr[o].lazc * (mid - l + 1) % Mod;
 38         tr[rc].s1 = tr[o].lazc * (r - mid) % Mod;
 39         tr[lc].lazc = tr[rc].lazc = tr[o].lazc;
 40         tr[lc].laza = tr[rc].laza = 0;
 41         tr[lc].lazm = tr[rc].lazm = 0;
 42         tr[o].lazc = 0;
 43     }
 44     if(tr[o].laza) {
 45         tr[lc].s3 = (tr[lc].s3 + tr[o].laza * tr[lc].s2 * 3 + tr[o].laza * tr[o].laza * tr[lc].s1 * 3 + tr[o].laza * tr[o].laza * tr[o].laza * (mid - l + 1)) % Mod;
 46         tr[rc].s3 = (tr[rc].s3 + tr[o].laza * tr[rc].s2 * 3 + tr[o].laza * tr[o].laza * tr[rc].s1 * 3 + tr[o].laza * tr[o].laza * tr[o].laza * (r - mid)) % Mod;
 47         tr[lc].s2 = (tr[lc].s2 + tr[o].laza * tr[lc].s1 * 2 + tr[o].laza * tr[o].laza * (mid - l + 1)) % Mod;
 48         tr[rc].s2 = (tr[rc].s2 + tr[o].laza * tr[rc].s1 * 2 + tr[o].laza * tr[o].laza * (r - mid)) % Mod;
 49         tr[lc].s1 = (tr[lc].s1 + tr[o].laza * (mid - l + 1)) % Mod;
 50         tr[rc].s1 = (tr[rc].s1 + tr[o].laza * (r - mid)) % Mod;
 51         tr[lc].laza = (tr[lc].laza + tr[o].laza) % Mod;
 52         tr[rc].laza = (tr[rc].laza + tr[o].laza) % Mod;
 53         tr[o].laza = 0;
 54     }
 55     if(tr[o].lazm != 1) {
 56         tr[lc].s3 = (tr[lc].s3 * tr[o].lazm * tr[o].lazm * tr[o].lazm) % Mod;
 57         tr[rc].s3 = (tr[rc].s3 * tr[o].lazm * tr[o].lazm * tr[o].lazm) % Mod;
 58         tr[lc].s2 = (tr[lc].s2 * tr[o].lazm * tr[o].lazm) % Mod;
 59         tr[rc].s2 = (tr[rc].s2 * tr[o].lazm * tr[o].lazm) % Mod;
 60         tr[lc].s1 = (tr[lc].s1 * tr[o].lazm) % Mod;
 61         tr[rc].s1 = (tr[rc].s1 * tr[o].lazm) % Mod;
 62         tr[lc].lazm = (tr[lc].lazm * tr[o].lazm) % Mod;
 63         tr[rc].lazm = (tr[rc].lazm * tr[o].lazm) % Mod;
 64         tr[o].lazm = 1;
 65     }
 66 }
 67
 68 void build(int o, int l, int r) {
 69     tr[o].clear();
 70     if(l == r) return;
 71     int mid = (l + r) >> 1;
 72     build(lc, l, mid);
 73     build(rc, mid + 1, r);
 74 }
 75
 76 void add(int o, int l, int r) {
 77     if(l != r) pushdown(o, l, r);
 78     if(x <= l && r <= y) {
 79         tr[o].s3 = (tr[o].s3 + z * tr[o].s2 * 3 + z * z * tr[o].s1 * 3 + z * z * z * (r - l + 1)) % Mod;
 80         tr[o].s2 = (tr[o].s2 + z * tr[o].s1 * 2 + z * z * (r - l + 1)) % Mod;
 81         tr[o].s1 = (tr[o].s1 + z * (r - l + 1)) % Mod;
 82         tr[o].laza = (tr[o].laza + z) % Mod;
 83         return;
 84     }
 85     int mid = (l + r) >> 1;
 86     if(x <= mid) add(lc, l, mid);
 87     if(y >  mid) add(rc, mid + 1, r);
 88     pushup(o);
 89 }
 90
 91 void multiply(int o, int l, int r) {
 92     if(l != r) pushdown(o, l, r);
 93     if(x <= l && r <= y) {
 94         tr[o].s3 = (tr[o].s3 * z * z * z) % Mod;
 95         tr[o].s2 = (tr[o].s2 * z * z) % Mod;
 96         tr[o].s1 = (tr[o].s1 * z) % Mod;
 97         tr[o].lazm = (tr[o].lazm * z) % Mod;
 98         return;
 99     }
100     int mid = (l + r) >> 1;
101     if(x <= mid) multiply(lc, l, mid);
102     if(y >  mid) multiply(rc, mid + 1, r);
103     pushup(o);
104 }
105
106 void cover(int o, int l, int r) {
107     if(l != r) pushdown(o, l, r);
108     if(x <= l && r <= y) {
109         tr[o].s3 = z * z * z * (r - l + 1)  % Mod;
110         tr[o].s2 = z * z * (r - l + 1) % Mod;
111         tr[o].s1 = z * (r - l + 1) % Mod;
112         tr[o].lazc = z;
113         return;
114     }
115     int mid = (l + r) >> 1;
116     if(x <= mid) cover(lc, l, mid);
117     if(y >  mid) cover(rc, mid + 1, r);
118     pushup(o);
119 }
120
121 ll ask(int o, int l, int r) {
122     if(l != r) pushdown(o, l, r);
123     if(x <= l && r <= y) {
124         switch(z) {
125             case 1:return tr[o].s1;
126             case 2:return tr[o].s2;
127             case 3:return tr[o].s3;
128         }
129     }
130     ll res = 0;
131     int mid = (l + r) >> 1;
132     if(x <= mid) res += ask(lc, l, mid);
133     if(y >  mid) res += ask(rc, mid + 1, r);
134     return res;
135 }
136
137 int main() {
138     while(scanf("%d %d", &n, &m), n != 0) {
139         build(1, 1, n);
140         while(m --) {
141             scanf("%d %d %d %lld", &op, &x, &y, &z);
142             switch(op) {
143                 case 1:add(1, 1, n);break;
144                 case 2:multiply(1, 1, n);break;
145                 case 3:cover(1, 1, n);break;
146                 case 4:printf("%lld\n", ask(1, 1, n));break;
147             }
148         }
149     }
150     return 0;
151 }

时间: 2024-10-06 19:29:18

Transformation的相关文章

Some useful facts on Fourier transformation

We denote by $L^1(R^n)$ the space of Lebesgue integrable functions on $R^n$. For $f\in L^1(R^n)$, the Fourier transformation $\widehat{f}$ of $f$ is defined by $$\widehat{f}(\xi)=\int f(x)e^{i\xi \cdot x}dx, \quad \xi \in R^n.$$ Fact 1. $\widehat{f}(

SSIS: 使用Lookup 和 Cache transformation 进行数据匹配简单介绍

本文将讲解Cache transformation的使用方式,并且用Lookup transformation进行匹配. 背景 如下图,我们的产品目标表中有些有尺寸信息有些没有.我们需要用Cache组件获取缓存信息.并且用Lookup组件进行匹配. 实际操作 1.建立以下工作流 Flat File 内容如下 打开 Cache组件,点击Edit->Columns . 我们可以看到从管道传递过来的数据. 如果 Index Position 是0 .那么表示不用lookup. 如果要把管道数据保存到文

Kettle笔记: Transformation 笔记

触发器表输入:select a.*,b.*,0 as ztflag from exchange_trigger a left join MAEA_NET_BIZ_BASEINFO b on (a.keyvalue=b.id) where a.flag=0 and a.tablename='MAEA_NET_BIZ_BASEINFO' 附件处理脚本: //Script here var byte_FILEDATA = null; if(FILEDATA != null && FILEDATA

Transformation(线段树多个lz标记)

这里以3次方来举例讲一下这题的做法,其它维类似. 如果要求某一个值的3次方那么sum = t^3,设t = x+y.那也就是sum = (x+y)^3. 假如我让每个数都加z t = x+y+z,我可以让新的y = y+z,这里发现新来的总会加在y上,那么可以给他一个延迟,slz, 那么新的值t = t + slz,再看如果让每个数都乘k,t = (x+y)*k = xk+yk.可以看出刚才的slz = slz*k; 另外发现系数会跟着变换,可以给他一个延迟,mlz. 那么一个数t = (mlz

何为仿射变换(Affine Transformation)

http://www.cnblogs.com/ghj1976/p/5199086.html 变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型.可采用的变换模型有如下几种:刚性变换.仿射变换.透视变换和非线形变换等,如下图: 参考: http://wenku.baidu.com/view/826a796027d3240c8447ef20.html 其中第三个的仿射变换就是我们这节要讨论的. 仿射变换(Affine Transformation

RDD之五:Key-Value型Transformation算子

Transformation处理的数据为Key-Value形式的算子大致可以分为:输入分区与输出分区一对一.聚集.连接操作. 输入分区与输出分区一对一 mapValues mapValues:针对(Key,Value)型数据中的Value进行Map操作,而不对Key进行处理. 方框代表RDD分区.a=>a+2代表只对( V1, 1)数据中的1进行加2操作,返回结果为3. 源码: [plain] view plain copy /** * Pass each value in the key-va

Text Template Transformation Toolkit

1.且算简介 笔者以一个英文字母和一个数字取了一个简单的名字.名唤"T4"(名字太短,不易点,体验不好,已修改). 也许你会好奇,想着T4何也?然后轻击鼠标,点开.亦或您知道,只是想看看,您或轻或重的点击鼠标,打开. 笔者这里写的T4是指“T4文本模板”.它是微软自家产的.一个基于模板的代码生成器.它由文本块和控制逻辑块组成的一个模板,可以自动的生成一些文本.有点类似于动软或者Code Smith,只是笔者认为它可比动软或者Code Smith优秀些.,毕竟它是微软自己家的. 那也许您

hdu 4578 Transformation

http://acm.hdu.edu.cn/showproblem.php?pid=4578 又做了一道好题.. 有三种操作: 1 a b c [a,b]加上c 2 a b c [a,b]乘上c 3 a b c [a,b]变为c 4 a b c 求[a,b]的c次方和(1<=c<=3) 这题首先需要解决的第一个问题是加上或乘上一个数对这个区间的c次方和分别产生什么改变,很简单,一化简就能得到. 第二个问题是当一段区间上既有乘又有加的lazy时应该怎么向下推送,因为一段区间上只能有一个lazy,

HDU 4952 Number Transformation 多校8 机智数学

哎.这个题想了好久,状态不对啊...一个大家都出的题..当时想到肯定是可以有什么规律来暴力,不用算到10的10次方 对于某个k,x.从1到k循环,每次求一个新的x,这个x要大于等于原x,并且要是i的倍数... 一直觉得有规律可循,后来知道就是倍数,我们设倍数为 b, 则b2*(i+1)>=b1*(i);可以知道b2>=b1-b1/(i+1),则,b2在b1小于等于i+1的时候便不会再变换,题目最大的倍数为10的10次方,根据第一个式子,最多经过10的五次方,倍数就会缩为10的五次方,此时i也&

OpenCV】透视变换 Perspective Transformation(续)

载分 [OpenCV]透视变换 Perspective Transformation(续) 分类: [图像处理] [编程语言] 2014-05-27 09:39 2776人阅读 评论(13) 收藏 举报 透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cpp] view plaincopyprint? Mat getPerspectiveTransform(c