博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 920F. SUM and REPLACE / bzoj 3211 花神游历各国
阅读量:4671 次
发布时间:2019-06-09

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

题目大意:

一个数列 支持两种操作

1 把区间内的数变成他们自己的约数个数

2 求区间和

思路:

可以想到每个数最终都会变成2或1

然后我们可以线段树

修改的时候记录一下每段有没有全被修改成1或2 是的话就不修改了

不是就暴力修改 因为每个数被修改的次数很小

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #define inf 213906214310 #define ll long long11 #define MAXN 100100012 using namespace std;13 inline int read()14 {15 int x=0,f=1;char ch=getchar();16 while(!isdigit(ch)) { if(ch=='-') f=-1;ch=getchar();}17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}18 return x*f;19 }20 int n,g[MAXN],cnt[MAXN],m;21 struct data{ll sum,mx;}tr[MAXN<<2];22 inline void pshp(int k)23 {24 tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;25 tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);26 }27 void build(int k,int l,int r)28 {29 if(l==r) {tr[k].sum=tr[k].mx=g[l];return ;}30 int mid=(l+r)>>1;31 build(k<<1,l,mid);build(k<<1|1,mid+1,r);32 pshp(k);33 }34 inline ll query(int k,int a,int b,int l,int r)35 {36 if(l==a&&r==b) return tr[k].sum;37 int mid=(l+r)>>1;38 if(mid>=b) return query(k<<1,a,b,l,mid);39 else if(mid
>1;47 if(mid>=b) upd(k<<1,a,b,l,mid);48 else if(mid
View Code

 UPD:

bzoj 3211 区间开根号 思路同上

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #define inf 213906214310 #define ll long long11 #define MAXN 10010012 using namespace std;13 inline int read()14 {15 int x=0,f=1;char ch=getchar();16 while(!isdigit(ch)) { if(ch=='-') f=-1;ch=getchar();}17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}18 return x*f;19 }20 int n,g[MAXN],m;21 struct data{ll sum,mx;}tr[MAXN<<2];22 inline void pshp(int k)23 {24 tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;25 tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);26 }27 void build(int k,int l,int r)28 {29 if(l==r) {tr[k].sum=tr[k].mx=g[l];return ;}30 int mid=(l+r)>>1;31 build(k<<1,l,mid);build(k<<1|1,mid+1,r);32 pshp(k);33 }34 inline ll query(int k,int a,int b,int l,int r)35 {36 if(l==a&&r==b) return tr[k].sum;37 int mid=(l+r)>>1;38 if(mid>=b) return query(k<<1,a,b,l,mid);39 else if(mid
>1;47 if(mid>=b) upd(k<<1,a,b,l,mid);48 else if(mid
View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/8448508.html

你可能感兴趣的文章
Windows服务器上使用phpstudy部署PHP程序
查看>>
[唐胡璐]QTP框架 - 关键字驱动测试框架之三 - 对象库管理
查看>>
zoj 2112 树状数组 套主席树 动态求区间 第k个数
查看>>
4538: [Hnoi2016]网络
查看>>
186. [USACO Oct08] 牧场旅行
查看>>
一个屌丝程序猿的人生(三十九)
查看>>
Linux常用命令
查看>>
Spring之@Configuration配置解析
查看>>
Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)...
查看>>
pip安装第三方库以及版本
查看>>
一、app更新提示后台接口开发-(2)数据库表设计
查看>>
利用data-src属性 更换图片
查看>>
Spring(3)
查看>>
SSM整合 mybatis多条件查询与分页
查看>>
VS2010中dumpbin工具的使用
查看>>
使用Golang搭建web服务
查看>>
HTML5触摸事件(touchstart、touchmove和touchend)
查看>>
架构师软技能之协商(上)
查看>>
商品翻牌效果(纯css)
查看>>
win10 UWP 序列化
查看>>