HDU4578 Transformation【线段树】
<题目链接>
<转载于 >>> >
题目大意:
有一个序列,有四种操作:
1:区间[l,r]内的数全部加c。
2:区间[l,r]内的数全部乘c。
3:区间[l,r]内的数全部初始为c。
4:询问区间[l,r]内所有数的P次方之和。
解题分析:
不可能全部查询的节点,最好的情况就是查询到一段[l,r],这段区间内所有的值都相等,那么返回(r-l+1)*val 的值即可。只要标记区间内的所有数是否相同,并记录下区间内所有数相同的区间的值即可。每次询问时查询到区间内所有值相同的区间即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const int mod=;
const int M =1e5+; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
int n,m;
bool cnt[M<<];
ll tr[M<<];
void Pushdown(int rt){
if(cnt[rt]){
cnt[rt<<]=cnt[rt<<|]=true;
tr[rt<<]=tr[rt<<|]=tr[rt];
}
}
void Pushup(int rt){
if(!cnt[rt<<]||!cnt[rt<<|])cnt[rt]=false;
else if(tr[rt<<]!=tr[rt<<|])cnt[rt]=false;
else cnt[rt]=true,tr[rt]=tr[rt<<];
}
void update(int rt,int l,int r,int L,int R,int c,int type){
if(cnt[rt]&&L<=l&&r<=R){
if(type==)tr[rt]=(tr[rt]+c)%mod; //分三种情况进行操作
else if(type==)tr[rt]=(tr[rt]*c)%mod;
else tr[rt]=c;
return;
}
Pushdown(rt);
int mid=(l+r)>>;
if(L<=mid)update(Lson,L,R,c,type);
if(R>mid)update(Rson,L,R,c,type);
Pushup(rt);
}
int query(int rt,int l,int r,int L,int R,int c){
if(cnt[rt]&&L<=l&&r<=R){
ll res=;for(int i=;i<=c;i++)res*=tr[rt]; //得到tr[rt]的c次方(因为c<=3,所以可以不用快速幂)
res=res*(r-l+); //乘上区间长度
return res%mod;
}
Pushdown(rt);
int mid=(l+r)>>;
ll ans=;
if(L<=mid)ans+=query(Lson,L,R,c);
if(R>mid)ans+=query(Rson,L,R,c);
return ans%mod;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF,n||m){
memset(tr,,sizeof(tr));
memset(cnt,true,sizeof(cnt));
while(m--){
int op,x,y,c;
scanf("%d%d%d%d",&op,&x,&y,&c);
if(op>=&&op<=)update(,,n,x,y,c,op);
else printf("%d\n",query(,,n,x,y,c));
}
}
return ;
}
2018-09-25
HDU4578 Transformation【线段树】的更多相关文章
- HDU4578 Transformation 线段树
这个题让我重新学习了加 乘 在区间的操作 题解:http://blog.csdn.net/guognib/article/details/25324025?utm_source=tuicool& ...
- 30-Transformation(HDU4578)-区间线段树(复杂)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 Transformation Time Limit: 15000/8000 MS (Java/Others ...
- Transformation 线段树好题 好题 (独立写出来对线段树不容易)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- 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 线段树
没什么说的裸线段树,注意细节就好了!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> ...
- hdu 4578 Transformation 线段树多种操作裸题
自己写了一个带结构体的WA了7.8次 但是测了几组小数据都对..感觉问题应该出在模运算那里.写完这波题解去对拍一下. 以后线段树绝不写struct!一般的struct都带上l,r 但是一条线段的长度确 ...
- HDU-4578 Transformation(线段树的多种区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others) Memory Lim ...
- 【HDU4578 Transformation】线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部 ...
- HDU - 4578 Transformation(线段树区间修改)
https://cn.vjudge.net/problem/HDU-4578 题意 4种操作,区间加,区间乘,区间变为一个数,求区间的和.平方和以及立方和. 分析 明显线段树,不过很麻烦..看kuan ...
- HDU 4578 - Transformation - [加强版线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is puzzled with the ...
随机推荐
- 基于ARM Cortex-M和Eclipse的SWO单总线输出
最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻 ...
- Java代码自动部署
注:本文来源于<it小熊> [ ①Java代码自动部署-总结简介] 代码部署是每一个软件开发项目组都会有的一个流程,也是从开发环节到发布功能必不可少的环节.对于Java开发者来说,Java ...
- Vue.extend和Vue.component的联系与差异
extend 是构造一个组件的语法器. 你给它参数 他给你一个组件 然后这个组件 你可以作用到Vue.component 这个全局注册方法里, 也可以在任意vue模板里使用apple组件 var ap ...
- css固定表头,表单内容可以滑动
<html><head> <meta charset="utf-8"> <title>Table</title&g ...
- 使用pm2离线部署nodejs项目
1.下载https://npm.taobao.org/mirrors/node/v8.11.1/node-v8.11.1-linux-x64.tar.xz 比如安装到/opt目录 xz -d node ...
- CF1019C
好玄学的东西... 核心思想:for循环! 首先,我们从前向后扫所有的点,如果这个点没被标记成不可用就把这个点标记成已使用,然后把所有与这个点直接相连的点标记成不可用 接下来,我们从后向前扫所有的点, ...
- vue中Axios的封装和API接口的管理
前端小白的声明: 这篇文章为转载:主要是为了方便自己查阅学习.如果对原博主造成侵犯,我会立即删除. 转载地址:点击查看 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题 ...
- Allegro PCB Design GXL (legacy) 使用slide无法将走线推挤到焊盘的原因
Allegro PCB Design GXL (legacy) version 16.6-2015 启用slide命令之后,单击鼠标右键,取消“Enhanced Pad Entry”即可.
- Mom and Dad
Mom Poodwaddle Life clock Dad Poodwaddlw Life clock Happiness is the meaning and the purpose of lif ...
- 用C语言实现窗口抖动
#include "stdafx.h" #include <stdio.h> #include<Windows.h> int main() { ; //休眠 ...