博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 920F - SUM and REPLACE
阅读量:6659 次
发布时间:2019-06-25

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

思路1:

线段树(982 ms)

每个点最多更新6次

代码:

#include
using namespace std;#define ll long long#define pb push_back#define ls rt<<1,l,m#define rs rt<<1|1,m+1,r#define mem(a,b) memset(a,b,sizeof(a))const int N=1e6+5;const int INF=0x3f3f3f3f;int a[N];int d[N];ll tree[N<<2];int mx[N<<2];void init(){ for(int i=1;i
>1; build(ls); build(rs); push_up(rt);}void update(int L,int R,int rt,int l,int r){ if(mx[rt]<=2)return ; if(l==r){ tree[rt]=mx[rt]=d[tree[rt]]; return ; } int m=(l+r)>>1; if(L<=m)update(L,R,ls); if(R>m)update(L,R,rs); push_up(rt);}ll query(int L,int R,int rt,int l,int r){ if(L<=l&&r<=R)return tree[rt]; int m=(l+r)>>1; ll ans=0; if(L<=m)ans+=query(L,R,ls); if(R>m)ans+=query(L,R,rs); return ans;}int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,m,t,l,r; init(); cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; build(1,1,n); while(m--){ cin>>t>>l>>r; if(t==1)update(l,r,1,1,n); else cout<
<

思路2:

分块(1326 ms)

每个块最多更新6次

代码:

#include
using namespace std;#define ll long long #define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=1e6+5;int d[N];int a[N],belong[N],blo,flag[1000];ll sum[1000];void init(){ for(int i=1;i
2)flag[x]=0; } } void update(int l,int r){ if(belong[l]==belong[r]){ for(int i=l;i<=r;i++){ sum[belong[i]]-=a[i]; a[i]=d[a[i]]; sum[belong[i]]+=a[i]; } return ; } for(int i=l;i<=belong[l]*blo;i++){ sum[belong[i]]-=a[i]; a[i]=d[a[i]]; sum[belong[i]]+=a[i]; } for(int i=belong[l]+1;i<=belong[r]-1;i++)solve(i); for(int i=(belong[r]-1)*blo+1;i<=r;i++){ sum[belong[i]]-=a[i]; a[i]=d[a[i]]; sum[belong[i]]+=a[i]; }}ll query(int l,int r){ ll ans=0; if(belong[l]==belong[r]){ for(int i=l;i<=r;i++)ans+=a[i]; return ans; } for(int i=l;i<=belong[l]*blo;i++)ans+=a[i]; for(int i=belong[l]+1;i<=belong[r]-1;i++)ans+=sum[i]; for(int i=(belong[r]-1)*blo+1;i<=r;i++)ans+=a[i]; return ans;} int main(){ ios::sync_with_stdio(false); cin.tie(0); init(); int n,m,t,l,r; cin>>n>>m; blo=sqrt(n); for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++){ belong[i]=(i-1)/blo+1; sum[belong[i]]+=a[i]; } while(m--){ cin>>t>>l>>r; if(t==1)update(l,r); else cout<
<

 

转载于:https://www.cnblogs.com/widsom/p/8412521.html

你可能感兴趣的文章
kvm-net模式(三)
查看>>
用vagrant搭建CoreOS+Docker环境
查看>>
除了梦想,你还剩下什么?
查看>>
1.5 单用户模式 救援模式
查看>>
浅谈几点用户体验优化
查看>>
webshell与网站管理后台密码爆破笔记
查看>>
Linux系统内存管理
查看>>
关于CloudLinux
查看>>
我的友情链接
查看>>
[slf4j+log] 源码解析
查看>>
DNS解析(包括主从实时备份)
查看>>
AWS常见问题
查看>>
zabbix 安装
查看>>
RESTful API设计指南
查看>>
Docker运维必备:监控宝Docker监控试用手记
查看>>
PHP防止XSS***
查看>>
linux 编译java并打包
查看>>
Linux基础命令---put上传ftp文件
查看>>
我的友情链接
查看>>
LVS算法,模型及ipvsadm工具的使用
查看>>