当前位置: 首页 > news >正文

[BZOJ3211]:花神游历各国(小清新线段树)

题目传送门


题目描述:

花神喜欢步行游历各国,顺便虐爆各地竞赛。花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家)。

每一次旅行中,花神会选择一条旅游路线,它在那一串国家中是连续的一段,这次旅行带来的开心值是这些国家的喜欢度的总和,当然花神对这些国家的喜欢程序并不是恒定的,有时会突然对某些国家产生反感,使他对这些国家的喜欢度δ变为δ​​(可能是花神虐爆了那些国家的 OI,从而感到乏味)。

现在给出花神每次的旅行路线,以及开心度的变化,请求出花神每次旅行的开心值。


输入格式:

第一行是一个整数N,表示有N个国家;
第二行有N个空格隔开的整数,表示每个国家的初始喜欢度;
第三行是一个整数M,表示有M条信息要处理;
第四行到最后,每行三个整数想x,l,r,当x=1时询问游历国家x到r的开心值总和,也就是Σδi(l~r)x=2时国家l到r中每个国家的喜欢度δi变为δi


输出格式:

每次x=1时,每行一个整数。表示这次旅行的开心度。


样例:

样例输入:

4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4

样例输出:

101
11
11


数据范围与提示:

对于全部数据,1≤n≤105,1≤m≤2×105,1≤l≤r≤n,0≤δi≤109

注:建议使用sqrt函数,且向下取整。


一句话题意:线段树区间开跟,区间求和。


 题解:

区间信息无法快速更新,无法使用延迟标记。(可怕)

但是注意,109最多开5次跟就不变了

那么,每次修改暴力递归下去,直到当前区间已全是0或1就return

是不是很帅?


代码时刻:

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
int n,m;
long long v[100001];
long long trsum[400001],trmax[400001];
void pushup(int x)
{
	trsum[x]=trsum[L(x)]+trsum[R(x)];
	trmax[x]=max(trmax[L(x)],trmax[R(x)]);
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		trsum[x]=trmax[x]=v[l];
		return;
	}
	int mid=(l+r)>>1;
	build(L(x),l,mid);
	build(R(x),mid+1,r);
	pushup(x);
}
void change(int x,int l,int r,int L,int R)
{
	if(l==r)
	{
		trsum[x]=sqrt(trsum[x]);
		trmax[x]=sqrt(trmax[x]);
		return;
	}
	if(trmax[x]<=1)return;//注意这里为≤,其他跟普通线段树别无两样 
	int mid=(l+r)>>1;
	if(L<=mid)change(L(x),l,mid,L,R);
	if(R>mid)change(R(x),mid+1,r,L,R);
	pushup(x);
}
long long ask(int x,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)return trsum[x];
	int mid=(l+r)>>1;
	long long rec=0;
	if(L<=mid)rec+=ask(L(x),l,mid,L,R);
	if(R>mid)rec+=ask(R(x),mid+1,r,L,R);
	return rec;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&v[i]);
	build(1,1,n);
	scanf("%d",&m);
	while(m--)
	{
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1)printf("%lld\n",ask(1,1,n,l,r));
		else change(1,1,n,l,r);
	}
	return 0;
}

 

rp++

转载于:https://www.cnblogs.com/wzc521/p/11015134.html

相关文章:

  • PyODPS DataFrame 的代码在哪里跑
  • css3D动画
  • 如何设计和实现自适应的负载均衡
  • Timestamp 基础知识及时间大小比较
  • jQuery选择器总结
  • 静态路由动态路由的差别
  • ActiveMQ快速入门
  • Java8 十大新特性详解
  • MyBatis学习总结(1)——MyBatis快速入门
  • 大型网站技术架构(三)架构核心要素
  • 什么是语法糖?
  • command injection命令注入
  • java 发送邮件
  • apt-fast
  • Excel导出通用操作方式
  • [LeetCode] Wiggle Sort
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【5+】跨webview多页面 触发事件(二)
  • 【node学习】协程
  • 4个实用的微服务测试策略
  • CSS 三角实现
  • Fastjson的基本使用方法大全
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Laravel核心解读--Facades
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • SSH 免密登录
  • Zsh 开发指南(第十四篇 文件读写)
  • 后端_MYSQL
  • 类orAPI - 收藏集 - 掘金
  • 聊聊flink的BlobWriter
  • 马上搞懂 GeoJSON
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 带你开发类似Pokemon Go的AR游戏
  • 数据库巡检项
  • ​secrets --- 生成管理密码的安全随机数​
  • ![CDATA[ ]] 是什么东东
  • #微信小程序:微信小程序常见的配置传值
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)JAVA使用POI操作excel
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (未解决)macOS matplotlib 中文是方框
  • (转)四层和七层负载均衡的区别
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • **python多态
  • *p++,*(p++),*++p,(*p)++区别?
  • .CSS-hover 的解释
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core WebAPI中封装Swagger配置
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。