UVA 12003 Array Transformer (分块)
来源:互联网 发布:淘宝缩水女是谁 编辑:程序博客网 时间:2024/06/05 02:07
题意:
给出数列长度为 N 的数列,做 M 次操作和一个常数 U。
每次操作为求出 L R 区间内小于 V 的数的个数 K ,并将数列第 P 个数修改为 U * K / ( R - L + 1 )。
输出变化后最终的数列。
思路:
分块维护数据
预处理:对每个块排序 sqrt(n)*log(sqrt(n))
查询 K 复杂度为 sqrt(n)*log(sqrt(n))
修改复杂度为 sqrt(n)
总的复杂度大概为 O(m*sqrt(n)*log(sqrt(n)))3e8左右
代码:
#include <bits/stdc++.h>using namespace std;const int MAXN=3e5+7;int blen,belong[MAXN],r[MAXN],l[MAXN],num;int a[MAXN],b[MAXN],u;int n,m;void build(){ blen=sqrt(n); num=n/blen;if(n%blen) num++; for(int i=1;i<=num;i++) l[i]=blen*(i-1)+1,r[i]=blen*i; r[num]=n; for(int i=1;i<=num;i++){ for(int j=l[i];j<=r[i];j++) belong[j]=i; sort(a+l[i],a+r[i]+1); }}int query(int st,int en,int v){ int ans=0; if(belong[st]==belong[en]){ ans=lower_bound(a+st,a+en+1,v)-a-st; }else{ for(int i=st;i<=r[belong[st]];i++) ans+=b[i]<v; for(int i=belong[st]+1;i<belong[en];i++) ans+=lower_bound(a+l[i],a+r[i]+1,v)-a-l[i]; for(int i=l[belong[en]];i<=en;i++) ans+=b[i]<v; } return ans;}void update(int st,int en,int k,int p){ int bel=belong[p]; int pos=lower_bound(a+l[bel],a+r[bel]+1,b[p])-a; int now=(long long)u*k/(en-st+1); a[pos]=now; if(now<b[p]){ while(pos>l[bel]&&a[pos]<a[pos-1]) swap(a[pos],a[pos-1]),pos--; }else{ while(pos<r[bel]&&a[pos]>a[pos+1]) swap(a[pos],a[pos+1]),pos++; } b[p]=now;}int main(){ int st,en,v,p; while(scanf("%d%d%d",&n,&m,&u)!=-1){ for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; build(); for(int i=1;i<=m;i++){ scanf("%d%d%d%d",&st,&en,&v,&p); update(st,en,query(st,en,v),p); } for(int i=1;i<=n;i++) printf("%d\n",b[i]); }}
阅读全文
0 0
- uva 12003 - Array Transformer(分块+树套树)
- UVA 12003Array Transformer (分块)
- UVA 12003 Array Transformer (分块)
- UVA 12003 Array Transformer [分块]
- 【uva 12003 Array Transformer】【分块】
- 【分块】UVA 12003 Array Transformer 水题
- uva 12003 Array Transformer (块状数组)
- uva12003 Array Transformer 分块
- UVA 12003Array Transformer(树套树)
- uva12003 - Array Transformer 分块结构
- UVA12003.Array Transformer——分块
- Uva 12003 Array Transformation(分块查找)
- uvaoj 12003 - Array Transformer
- UVa 11922 - Permutation Transformer (Splay)
- UVA 11922 Permutation Transformer(Splay Tree)
- 数组分块(array chuncking)
- uva 11922 - Permutation Transformer
- uva 11922 Permutation Transformer
- Hadoop(七)---MapReduce计算模型
- (7)2017.8.7-面向对象(2)
- curl
- Kotlin:基本类型都是对象,原生类型将成为回忆
- 从外网访问内网服务器的方法
- UVA 12003 Array Transformer (分块)
- 如何对字符串进行左、右和居中对齐
- 构造函数的隐藏及访问
- HDU1006
- 版本管理工具介绍(SVN篇)--慕课网笔记
- MySQL的这些显而易见的坑你踩过了没
- HashTable【哈希表/散列表】
- Cocos2d-x教程-多线程与异步加载
- 从外网访问内网服务器的方法