分块练习 B
来源:互联网 发布:中国推理小说知乎 编辑:程序博客网 时间:2024/06/04 19:45
哇..偷懒调了一上午。。。结果是傻逼错。。。没救了
#include<cstdio>#include<cstring>#include<algorithm>#include<cctype>#include<iostream>#include<cmath>using namespace std;#define maxn 50010char _c;bool flag;inline void read(int& x){flag = false;_c = getchar();x = 0;while(!isdigit(_c)){if(_c=='-')flag=true;_c=getchar();}while(isdigit(_c)){x = x*10+_c-'0';_c=getchar();}if(flag)x = -x;}typedef long long LL;inline void read(LL& x){flag = false;_c = getchar();x = 0;while(!isdigit(_c)){if(_c=='-')flag=true;_c=getchar();}while(isdigit(_c)){x = x*10+_c-'0';_c=getchar();}if(flag)x = -x;}int n;int belong[maxn],L[maxn],R[maxn],num,block;LL a[maxn],add[maxn],sorted[maxn];inline void build(){block = sqrt(n);num = n/block;if(n%block)num++;for(int i=1;i<=num;i++)L[i]=(i-1)*block+1,R[i]=i*block;R[num] = n;for(int i=1;i<=n;i++)belong[i] = (i-1)/block+1;memcpy(sorted,a,sizeof(a));for(int i=1;i<=num;i++)sort(&sorted[L[i]],&sorted[R[i]+1]);}void update(int x,int y,int w){if(belong[x]==belong[y]){for(int i=x;i<=y;i++)a[i]+=w;for(int i=L[belong[x]];i<=R[belong[x]];i++)sorted[i] = a[i];sort(&sorted[L[belong[x]]],&sorted[R[belong[y]]+1]);return ;}for(int i=x;i<=R[belong[x]];i++)a[i]+=w;for(int i=L[belong[x]];i<=R[belong[x]];i++)sorted[i]=a[i];sort(&sorted[L[belong[x]]],&sorted[R[belong[x]]+1]);for(int i=belong[x]+1;i<belong[y];i++)add[i]+=w;for(int i=L[belong[y]];i<=y;i++)a[i]+=w;for(int i=L[belong[y]];i<=R[belong[y]];i++)sorted[i]=a[i];sort(&sorted[L[belong[y]]],&sorted[R[belong[y]]+1]);}int calc(int low,int up,LL ch){if(low==up)return sorted[low]<ch?1:0;int left = low;while(low<=up){int mid = (low+up)>>1;if(sorted[mid]>=ch){up = mid-1;}else {low = mid+1;}}return up-left+1;}int ask(int x,int y,LL k){LL ch;int ret = 0;if(belong[x]==belong[y]){ch = k - add[belong[x]];for(int i=x;i<=y;i++)if(a[i]<ch)ret++;return ret;}for(int i=x,ch = k-add[belong[x]];i<=R[belong[x]];i++)if(a[i]<ch)ret++;for(int i=belong[x]+1;i<belong[y];i++){ch = k - add[i];if(sorted[L[i]]>=ch)continue;ret+=calc(L[i],R[i],ch);}for(int i=L[belong[y]],ch = k-add[belong[y]];i<=y;i++)if(a[i]<ch)ret++;return ret;}int main(void){read(n);for(int i=1;i<=n;i++)read(a[i]);int op,a,b,c;build();for(int i=1;i<=n;i++){read(op),read(a),read(b),read(c);if(op)printf("%d\n",ask(a,b,(LL)c*c));else update(a,b,c);}return 0;}
1 0
- 分块练习 B
- 分块练习
- 分块练习 A
- 分块练习 C
- 分块练习 D
- Scala练习-分块查找
- HDU1166敌兵布阵 分块解法,分块练习
- Codevs2038 线段树练习3(分块)
- Codevs 4927 线段树练习5(分块)
- 分块练习- BZOJ2002-Bounce 弹飞绵羊
- 机房练习赛nan(分块压缩)
- 分块。。
- 分块
- 分块
- 分块
- 分块
- 分块
- 分块
- HDU 2819 Swap 【二分图匹配 交换方法】
- 【51Nod 1363】最小公倍数之和
- Android面试经验 -- 乐视
- BinarySearch(二分查找)
- 认识css布局模式(流动模式下的块状元素和内联元素)
- 分块练习 B
- 电子市场总结(一)
- Linux字符设备
- 3.消息类型(微信公众号开发实战)
- windows下安装python numpy+scipy+matlotlib+scikit-learn等流行库
- VIM选择文本块/复制/粘贴
- Web前端面试指导(二十四):事件是什么?如何阻止事件冒泡?
- 认识css样式(relative和absolute相结合)
- Increasing Sub-sequence