hdu 4578 Transformation 线段树
没什么说的裸线段树,注意细节就好了!!!
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 100003
#define M 10007
#define lson i<<1
#define rson i<<1|1
using namespace std;
struct tree
{
int l,r,sum[],add,mul;
void init(int _l,int _r){
l=_l;r=_r;mul=;add=;
}
void Add(int a){
sum[]=(sum[]+a*a%M*a%M*len()%M+*a*sum[]%M+*a*a%M*sum[]%M)%M;
sum[]=(sum[]+a*a%M*len()%M+*a*sum[]%M)%M;
sum[]=(sum[]+a*len()%M)%M;
add=(add+a)%M;
}
void Mul(int a){
sum[]=sum[]*a%M*a%M*a%M;
sum[]=sum[]*a%M*a%M;
sum[]=sum[]*a%M;
add=add*a%M;
mul=mul*a%M;
}
int len(){
return r-l+;
}
int mid(){
return (l+r)>>;
}
}T[MAX*];
void down(int i)
{
T[lson].Mul(T[i].mul);
T[rson].Mul(T[i].mul);
T[lson].Add(T[i].add);
T[rson].Add(T[i].add);
T[i].add=;
T[i].mul=;
}
void updateson(int i)
{
for(int j=;j<;j++)
T[i].sum[j]=(T[lson].sum[j]+T[rson].sum[j])%M;
}
void built(int i,int l,int r)
{
T[i].init(l,r);
memset(T[i].sum,,sizeof(T[i].sum));
if(l==r) return ;
int m=T[i].mid();
built(lson,l,m);
built(rson,m+,r);
}
void update(int i,int l,int r,int mul,int add)
{
if(T[i].l==l&&T[i].r==r){
T[i].Mul(mul);
T[i].Add(add);
return ;
}
down(i);
int m=T[i].mid();
if(r<=m) update(lson,l,r,mul,add);
else if(l>m) update(rson,l,r,mul,add);
else{
update(lson,l,m,mul,add);
update(rson,m+,r,mul,add);
}
updateson(i);
}
int query(int i,int l,int r,int p)
{
if(T[i].l==l&&T[i].r==r) return T[i].sum[p-];
down(i);
int m=T[i].mid();
if(r<=m) return query(lson,l,r,p);
else if(l>m) return query(rson,l,r,p);
else return (query(lson,l,m,p)+query(rson,m+,r,p))%M;
}
int main(){
int m,n,op,x,y,p;
while(scanf("%d%d",&n,&m)&&(m+n)){
built(,,n);
while(m--){
scanf("%d%d%d%d",&op,&x,&y,&p);
if(op==) update(,x,y,,p);
else if(op==) update(,x,y,p,);
else if(op==) update(,x,y,,p);
else printf("%d\n",query(,x,y,p)%M);
}
}
return ;
}
hdu 4578 Transformation 线段树的更多相关文章
- HDU 4578 Transformation --线段树,好题
题意: 给一个序列,初始全为0,然后有4种操作: 1. 给区间[L,R]所有值+c 2.给区间[L,R]所有值乘c 3.设置区间[L,R]所有值为c 4.查询[L,R]的p次方和(1<=p< ...
- hdu 4578 Transformation 线段树多种操作裸题
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
- Transformation HDU - 4578(线段树——懒惰标记的妙用)
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, …, a n. The initial val ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 4578 - Transformation - [加强版线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...
- HDU 4578 Transformation (线段树)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
随机推荐
- float,double和decimal的精度问题
先标注一个音标,因为我老是读错:decimal ['desɪml] 精度对比: 类型 CTS 类型 描述 有效数字 范围 float System.Single 32-bit single-preci ...
- VIM小技巧之文件名补全
恩,这两天在看<简明Python教程>,那里面作者建议写代码的时候前面的注释写上文件名,写上调用的解释器,比如这样: 恩,然后我当然不可能每回新建一个文件,就要在开头写上一大串东西啊,vi ...
- 版权控制之zend guard 6.0使用教程
zend guard6.0使用教程.doc 一.准备工具 1. ZendGuard-6_0_0 下载地址:http://www.zend.com/en/products/guard/downloads ...
- 如何开启MYSQL远程连接权限
开启MYSQL远程连接权限 //建议设置固定IP mysql> GRANT ALL PRIVILEGES ON *.* TO root@"8.8.8.8" IDENTIFIE ...
- Session原理简述
Session存在的意义,估计每个用做web开发的人都是了解的,就为了解决HTTP是个无状态协议所带来的问题,不多说了.这里主要想说的是服务端与客户端是如何利用session进行交互的. Sessio ...
- 通过百度地图API显示当前位置在地图上(图标显示)--第三方开源--百度地图(二)
1.下载百度地图的demo,下载地址:http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfuncti ...
- javascript中的省市级联效果
学习javascript的时候都遇到过这样的需求,不仅是省市,还有其他的一些场景,看看关键的代码有哪些吧. <head runat="server"> <titl ...
- 【转】Linux Framebuffer
全面的framebuffer详解 一.FrameBuffer的原理 FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口. Linux是工作在保护模式下,所以用户态进程是无法象D ...
- [转]Oracle学习记录 九 Prc C学习
经过前面的了解,现在想用C语言来编程了,搜索了很多东西,后来决定先用Pro C来进行学习 在安装完Oracle数据库后就可以进行编程了,里面有一个命令proc就是对程序进行预编译的. 在这记一下,这是 ...
- PAT IO-04 混合类型数据格式化输入(5)
/* *PAT IO-04 混合类型数据格式化输入(5) *2015-08-01 作者:flx413 */ #include<stdio.h> int main() { int a; fl ...