K - Transformation
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define p 10007
#define MAXN 100010
using namespace std;
int n,m;
struct nond{
int l,r;
int sum[];
int flag1,flag2,flag3;
}tree[MAXN*];
void up(int now){
tree[now].sum[]=(tree[now*].sum[]+tree[now*+].sum[])%p;
tree[now].sum[]=(tree[now*].sum[]+tree[now*+].sum[])%p;
tree[now].sum[]=(tree[now*].sum[]+tree[now*+].sum[])%p;
}
void build(int now,int l,int r){
tree[now].l=l;tree[now].r=r;
tree[now].sum[]=;tree[now].sum[]=;
tree[now].sum[]=;tree[now].flag2=;
tree[now].flag1=tree[now].flag3=;
if(tree[now].l==tree[now].r) return ;
int mid=(tree[now].l+tree[now].r)/;
build(now*,l,mid);
build(now*+,mid+,r);
up(now);
}
void down(int now){
if(tree[now].flag3){
tree[now*].sum[]=(((tree[now*].r-tree[now*].l+)%p)*tree[now].flag3)%p;
tree[now*].sum[]=(((((tree[now*].r-tree[now*].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*].sum[]=(((((((tree[now*].r-tree[now*].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*].flag3=tree[now].flag3%p;
tree[now*].flag1=;tree[now*].flag2=; tree[now*+].sum[]=(((tree[now*+].r-tree[now*+].l+)%p)*tree[now].flag3)%p;
tree[now*+].sum[]=(((((tree[now*+].r-tree[now*+].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*+].sum[]=(((((((tree[now*+].r-tree[now*+].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*+].flag3=tree[now].flag3%p;
tree[now*+].flag1=;tree[now*+].flag2=; tree[now].flag3=;
}
if(tree[now].flag2){
tree[now*].sum[]=(((((tree[now*].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*].sum[]=(((tree[now*].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*].sum[]=(tree[now*].sum[]*tree[now].flag2)%p;
tree[now*].flag1=(tree[now*].flag1*tree[now].flag2)%p;
tree[now*].flag2=(tree[now*].flag2*tree[now].flag2)%p; tree[now*+].sum[]=(((((tree[now*+].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*+].sum[]=(((tree[now*+].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*+].sum[]=(tree[now*+].sum[]*tree[now].flag2)%p;
tree[now*+].flag1=(tree[now*+].flag1*tree[now].flag2)%p;
tree[now*+].flag2=(tree[now*+].flag2*tree[now].flag2)%p; tree[now].flag2=;
}
if(tree[now].flag1){
tree[now*].sum[]=(tree[now*].sum[]+(((*tree[now].flag1*tree[now].flag1%p*tree[now*].sum[])%p+(*tree[now].flag1*tree[now*].sum[])%p)%p+(tree[now*].r-tree[now*].l+)%p*tree[now].flag1%p*tree[now].flag1%p*tree[now].flag1)%p)%p;
tree[now*].sum[]=(tree[now*].sum[]+((tree[now*].r-tree[now*].l+)%p*tree[now].flag1%p*tree[now].flag1%p+(*tree[now].flag1*tree[now*].sum[])%p)%p)%p;
tree[now*].sum[]=(tree[now*].sum[]+(tree[now*].r-tree[now*].l+)%p*tree[now].flag1)%p;
tree[now*].flag1=(tree[now*].flag1+tree[now].flag1)%p; tree[now*+].sum[]=(tree[now*+].sum[]+(((*tree[now].flag1*tree[now].flag1%p*tree[now*+].sum[])%p+(*tree[now].flag1*tree[now*+].sum[])%p)%p+(tree[now*+].r-tree[now*+].l+)%p*tree[now].flag1%p*tree[now].flag1%p*tree[now].flag1)%p)%p;
tree[now*+].sum[]=(tree[now*+].sum[]+((tree[now*+].r-tree[now*+].l+)%p*tree[now].flag1%p*tree[now].flag1%p+(*tree[now].flag1*tree[now*+].sum[])%p)%p)%p;
tree[now*+].sum[]=(tree[now*+].sum[]+(tree[now*+].r-tree[now*+].l+)%p*tree[now].flag1)%p;
tree[now*+].flag1=(tree[now*+].flag1+tree[now].flag1)%p; tree[now].flag1=;
}
}
void changeadd(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum[]=(tree[now].sum[]+(((*k*k%p*tree[now].sum[])%p+(*k*tree[now].sum[])%p)%p+(tree[now].r-tree[now].l+)%p*k%p*k%p*k)%p)%p;
tree[now].sum[]=(tree[now].sum[]+(((((tree[now].r-tree[now].l+)%p)*k)%p*k)%p+(*k*tree[now].sum[])%p)%p)%p;
tree[now].sum[]=(tree[now].sum[]+(tree[now].r-tree[now].l+)%p*k)%p;
tree[now].flag1=(tree[now].flag1+k)%p;
return ;
}
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) changeadd(now*,l,r,k);
else if(l>mid) changeadd(now*+,l,r,k);
else { changeadd(now*,l,mid,k); changeadd(now*+,mid+,r,k); }
up(now);
}
void changemul(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum[]=(((((tree[now].sum[]*k)%p)*k)%p)*k)%p;
tree[now].sum[]=(((tree[now].sum[]*k)%p)*k)%p;
tree[now].sum[]=(tree[now].sum[]*k)%p;
tree[now].flag1=(tree[now].flag1*k)%p;
tree[now].flag2=(tree[now].flag2*k)%p;
return ;
}
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) changemul(now*,l,r,k);
else if(l>mid) changemul(now*+,l,r,k);
else{ changemul(now*,l,mid,k); changemul(now*+,mid+,r,k); }
up(now);
}
void change(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum[]=(((tree[now].r-tree[now].l+)%p)*k)%p;
tree[now].sum[]=(((((tree[now].r-tree[now].l+)%p)*k)%p)*k)%p;
tree[now].sum[]=(((((((tree[now].r-tree[now].l+)%p)*k)%p)*k)%p)*k)%p;
tree[now].flag3=k%p;
tree[now].flag1=;tree[now].flag2=;
return ;
}
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) change(now*,l,r,k);
else if(l>mid) change(now*+,l,r,k);
else{ change(now*,l,mid,k); change(now*+,mid+,r,k); }
up(now);
}
int query(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r)
return tree[now].sum[k];
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) return query(now*,l,r,k);
else if(l>mid) return query(now*+,l,r,k);
else return (query(now*,l,mid,k)+query(now*+,mid+,r,k))%p;
}
int main(){
while(scanf("%d%d",&n,&m)&&n!=&&m!=){
build(,,n);
for(int i=;i<=m;i++){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a==) changeadd(,b,c,d);
if(a==) changemul(,b,c,d);
if(a==) change(,b,c,d);
if(a==) printf("%d\n",query(,b,c,d));
}
}
}
K - Transformation的更多相关文章
- K - Transformation HDU - 4578 线段树经典题(好题)
题意:区间 加 变成定值 乘 区间查询:和 平方和 立方和 思路:超级超级超级麻烦的一道题 设3个Lazy 标记分别为 change 改变mul乘 add加 优先度change>m ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- (七)Transformation和action详解-Java&Python版Spark
Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...
- hdu4952 Number Transformation (找规律)
2014多校 第八题 1008 2014 Multi-University Training Contest 8 4952 Number Transformation Number Transform ...
- spark transformation与action操作函数
一.Transformation map(func) 返回一个新的分布式数据集,由每个原元素经过函数处理后的新元素组成 filter(func) 返回一个新的数据集,经过fun函数处理后返回值为tru ...
- HDU 1041 Computer Transformation (简单大数)
Computer Transformation http://acm.hdu.edu.cn/showproblem.php?pid=1041 Problem Description A sequenc ...
- HDU P4578 Transformation
Problem Description Yuanfang is puzzled with the question below: There are n integers, a1, a2, …, an ...
- bzoj 3858: Number Transformation 暴力
3858: Number Transformation Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 82 Solved: 41[Submit][Sta ...
- HDU-4952 Number Transformation
http://acm.hdu.edu.cn/showproblem.php?pid=4952 Number Transformation Time Limit: 2000/1000 MS (Java/ ...
随机推荐
- Spark常见编程问题解决办法及优化
目录 1.数据倾斜 2.TopN 3.Join优化 预排序的join cross join 考虑Join顺序 4.根据HashMap.DF等数据集进行filter 5.Join去掉重复的列 6.展开N ...
- 【BZOJ2693】jzptab & 【BZOJ2154】Crash的数字表格
题目 弱化版题目的传送门([BZOJ2154]Crash的数字表格) 加强版题目的传送门([BZOJ2693]jzptab) 思路&解法 题目是要求: \(\sum\limits_{i = 1 ...
- 【LuoguP5004】 专心OI - 跳房子
首先这是一道计数类DP,那我们得先推式子,经过瞎掰乱凑,经过认真分析,我们可以得到这样的方程 F(N)=F(0)+F(1)+....+F(N-M-1) 所有F初值为1,F(1)=2 ANS=F(N+M ...
- 缓存,队列(Redis,RabbitMQ)
Redis Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- A - Word
Problem description Vasya is very upset that many people on the Net mix uppercase and lowercase lett ...
- React+Dva
Reducer reducer 是一个函数,接受 state 和 action,返回老的或新的 state .即:(state, action) => state Effect app.mode ...
- 【MySQL】源码安装
操作系统:Red Hat Enterprise Linux Server release 6.5 Mysql安装包:mysql-5.6.4-m7.tar.zip,下载地址:http://pan.bai ...
- 复习java基础第一天
一:static static: 静态的. 1. 若需要一个类的多个对象共享一个变量,则该变量需要使用 static 修饰. 2. 因为 static 修饰的变量为类的所有的实例所共享,所以 ...
- MFC和OpenCV结合
最重要的一点:如何把OpenCV的框嵌入MFC的ID.. 把cv显示框嵌入 pic控件 cvNamedWindow("kalman"); HWND hWnd = (HWND) cv ...
- MySQL创建临时表
drop TEMPORARY table if EXISTS temp_table; create TEMPORARY table temp_table( id int not null, usern ...