首页 > 代码库 > uva 12003 Array Transformer (块状数组)
uva 12003 Array Transformer (块状数组)
大白书上的393页。
一直在原数组上乱搞。其实要用另外一个数组记录块。
原数组是不能变的。
注意好原数组和块数组的关系,细心一点处理边界。还是不难的。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #define maxn 300005 #define SIZE 600 using namespace std; int a[maxn]; int block[maxn]; int b[maxn]; void work(int p,int x) { int old=b[p]; b[p]=x; int BLOCK=p/SIZE; int pos=p; for(int i=BLOCK*SIZE;i<BLOCK*SIZE+SIZE;i++) { if(a[i]==old) { pos=i; a[i]=x; break; } } while(block[pos+1]==block[p] && a[pos+1]<a[pos]) { swap(a[pos+1],a[pos]); pos++; } while(pos-1>=0 && block[pos-1]==block[p] && a[pos-1]>a[pos]) { swap(a[pos-1],a[pos]); pos--; } } int main() { int n,m,u; while(scanf("%d%d%d",&n,&m,&u)!=EOF) { memset(a,0x3f,sizeof a); memset(block,0x3f,sizeof block); for(int i=0;i<n;i++) { scanf("%d",&a[i]); b[i]=a[i]; block[i]=i/SIZE; } for(int i=0;i<(n-1)/SIZE;i++) { sort(a+i*SIZE,a+(i+1)*SIZE); } sort(a+((n-1)/SIZE*SIZE),a+n); while(m--) { int l,r,v,p; scanf("%d%d%d%d",&l,&r,&v,&p); l--,r--,p--; int ans=0; if(block[l]==block[r]) { for(int i=l;i<=r;i++) if(b[i]<v)ans++; } else { for(int i=l;block[i]==block[l];i++) { if(b[i]<v)ans++; } for(int i=r;block[i]==block[r];i--) if(b[i]<v)ans++; for(int i=SIZE*(l/SIZE+1);i<r/SIZE*SIZE;i+=SIZE) { ans+=lower_bound(a+i,a+i+SIZE,v)-(a+i); } } work(p,(long long)u*ans/(r-l+1)); } for(int i=0;i<n;i++) printf("%d\n",b[i]); } return 0; } /* 10 3 5 10 9 8 7 6 5 4 3 2 1 2 5 9 4 2 9 6 5 4 10 5 6 */
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。