博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ3211]花神游历各国(小清新线段树)
阅读量:7281 次
发布时间:2019-06-30

本文共 1856 字,大约阅读时间需要 6 分钟。


题目描述:

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

每一次旅行中,花神会选择一条旅游路线,它在那一串国家中是连续的一段,这次旅行带来的开心值是这些国家的喜欢度的总和,当然花神对这些国家的喜欢程序并不是恒定的,有时会突然对某些国家产生反感,使他对这些国家的喜欢度δ变为δ​​(可能是花神虐爆了那些国家的 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
#define L(x) x<<1#define R(x) x<<1|1using 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;}

 cpp

rp++

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

你可能感兴趣的文章
Andorid Launcher程序代码分析(转)
查看>>
1_NAT模式和桥接模式下的网络配置
查看>>
jquery ui draggable,droppable 学习总结
查看>>
Matlab变量及其含义
查看>>
EOS智能合约开发(三):EOS创建和管理账号
查看>>
常见dos命令汇总
查看>>
fedora22 安装fcitx 输入法
查看>>
简单的ASP.NET无刷新分页
查看>>
一段代码引发的思考
查看>>
实验三 编程、编译、连接、跟踪
查看>>
构建之法第一章
查看>>
进制之间的互相转换,进制的原码,反码,补码
查看>>
Tomcat02
查看>>
SQL Server 添加描述
查看>>
locust===Writing a locustfile
查看>>
生产者消费者模式
查看>>
oracle学习篇五:组函数,分组统计
查看>>
PHP-Manual的学习----【语言参考】----【类型】-----【NULL】
查看>>
Colorable Fantasy UI
查看>>
C# Reflection BindingFlags
查看>>