HDU - 4627 (线段树)
来源:互联网 发布:心事谁人知 艋舺 编辑:程序博客网 时间:2024/05/22 14:15
#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn = 50110;int MIN[11][maxn<<2];int col[11][maxn<<2];int id[11][maxn],vis[11][maxn];void build(int l,int r,int rt){for(int i=1;i<=10;i++) MIN[i][rt]=0;for(int i=1;i<=10;i++) col[i][rt]=0;if(l==r) return ;int m=(l+r)>>1;build(lson);build(rson);}void pushup(int l,int r,int rt,int i){MIN[i][rt]=min(MIN[i][rt<<1],MIN[i][rt<<1|1]);}void pushdown(int l,int r,int rt,int i){if(l==r){ col[i][rt]=0; return ;}if(col[i][rt]){ col[i][rt<<1]+=col[i][rt]; MIN[i][rt<<1]+=col[i][rt]; col[i][rt<<1|1]+=col[i][rt]; MIN[i][rt<<1|1]+=col[i][rt]; col[i][rt]=0;}}int ql,qr,addv;void update(int l,int r,int rt,int i){if(ql<=l&&r<=qr){ col[i][rt]+=addv; MIN[i][rt]+=addv; // cout<<l<<"-->"<<r<<" "<<(r-l+1)*addv<<endl; return ;}pushdown(l,r,rt,i);int m=(l+r)>>1;if(ql<=m) update(lson,i);if(qr> m) update(rson,i);pushup(l,r,rt,i);}int res;int posi;void query(int l,int r,int rt,int i){if(l==r){ res+=MIN[i][rt]; // cout<<l<<"-->"<<r<<" "<<sum[i][rt]<<endl; return ;}pushdown(l,r,rt,i);int m=(l+r)>>1;if(posi<=m) query(lson,i);else if(posi> m) query(rson,i);}int lim = 50010;int find(int yu,int wei,int i){int x=0,y=lim;while(x<y){ int m = x + (y - x)/2; if(id[i][m]%i>yu) y=m; else if(id[i][m]%i<yu) x=m+1; else { if(id[i][m]/i==wei) return m; if(id[i][m]/i >wei) y=m; else x = m+1; } // cout<<m<<" "<<id[i][m]<<" "<<id[i][m]%i<<endl;}}int query_id(int st,int ed,int k,int i){int x = st % k;int l = 0,r=lim;while(l<r){ // 查找第一个符合位置的起点 int m = l + ( r- l)/2; if(x + m*k>=st) r=m; else l=m+1;}int si = l; // cout<<"start-->"<<si<<endl;l = 0,r=lim;while(l<r){ // 查找最后一个符合位置的起点 int m = l + ( r- l)/2; if(x + m*k<=ed) l=m+1; else r=m;}int ei = l-1; // cout<<"end-->"<<ei<<endl;ql = find(x,si,i);qr = find(x,ei,i);}int main(){ for(int i=1;i<=10;i++){ int te=0; for(int j=0;j<i;j++){ for(int k=j;k<lim;k+=i){ id[i][te++]=k; } } int n; while(scanf("%d",&n)==1){ for(int i=0;i<n;i++){ scanf("%d",&id[0][i]); } build(0,lim,1); int Q; scanf("%d",&Q); while(Q--){ int cmd; scanf("%d",&cmd); if(cmd==1){ int a,b,k; scanf("%d %d %d %d",&a,&b,&k,&addv); query_id(a,b,k,k); update(0,lim,1,k); } else { int pos; scanf("%d",&pos); res=0; res+=id[0][pos-1]; for(int i=1;i<=10;i++){ int yu= pos%i,wei=pos/i; posi=find(yu,wei,i); query(0,lim,1,i); } printf("%d\n",res); } } } return 0;}
0 0
- HDU - 4627 (线段树)
- hdu 1754 线段树
- hdu 1754 线段树
- HDU 1698 线段树
- hdu 1754 线段树
- 【线段树】hdu 1754
- hdu-1166 线段树
- HDU-2688 线段树
- HDU 4027 线段树
- HDU-1166 线段树
- hdu 1166 线段树
- hdu 1754 线段树
- hdu 1754 线段树
- hdu 4027#线段树
- hdu 1754 线段树
- HDU-4351-线段树
- hdu 2795 线段树
- hdu 1540 线段树
- pyserial应用实例——对工厂模式下的Android手机收发AT命令
- Android下WindowManager的作用
- Android APK 混码---proguard-project.txt说明
- IOS之UILabel中文字添加下划线
- BZOJ 1588 HNOI2002 营业额统计 Treap
- HDU - 4627 (线段树)
- Java中hashCode的作用
- 前端验证文件上传
- POJ 3304 Segments 【计算几何】【直线和线段的关系】
- 给了淘宝店一个差评 田女士收到一堆冥币?
- 数据挖掘领域十大经典算法初探
- dxf文件预览打开编辑相关控件推荐
- 移动端meta标签搜集
- JAVA Person类