HDU4267(2012长春网络赛)
生活随笔
收集整理的這篇文章主要介紹了
HDU4267(2012长春网络赛)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目:A Simple Problem with Integers
?
#include <stdio.h> #include <string.h> #include <iostream>using namespace std;const int N = 50100;struct node {int l;int r;int w;int add[55] ; }p[N*4];int a[N], b[11][11];void build(int x,int l,int r) {p[x].l = l;p[x].r = r;memset(p[x].add,0,sizeof(p[x].add));if(l == r){p[x].w = a[l];return ;}int mid = (l + r)>>1;build(2*x,l,mid);build(2*x+1,mid+ 1,r);p[x].w = p[x*2].w + p[x*2+1].w ;}void push_down(int x){if(p[x].w){p[x*2].w +=p[x].w;p[x*2+1].w +=p[x].w;p[x].w = 0;for(int i =0 ; i < 55;i++){p[x*2].add[i] +=p[x].add[i];p[x*2+1].add[i]+=p[x].add[i];p[x].add[i] = 0;}}}void update(int x,int l,int r,int num,int i,int j){if(p[x].l == l&&p[x].r == r){p[x].w +=num;p[x].add[b[i][j]]+=num ;return ;}push_down(x);int mid = (p[x].l + p[x].r)>>1 ;if(l > mid)update(x*2+1,l,r,num,i,j);else{if(r<=mid)update(x*2,l,r,num,i,j);else{update(x*2,l,mid,num,i,j);update(x*2+1,mid+1,r,num,i,j);}}}int query(int x,int pos){if(p[x].l == pos&&p[x].r == pos){int tmp = 0;for(int i = 1 ; i <= 10 ;i++)tmp+=p[x].add[b[i][pos%i]];return tmp + a[pos] ;}push_down(x) ;int mid = (p[x].l + p[x].r)>> 1;if(pos <= mid)return query(2*x,pos);elsereturn query(x*2+1,pos);}int main(){int n,s,e,k,c,i,j,q,ty;int cnt = 0;for(i = 1; i<= 10;i++){for(j = 0;j< i;j++)b[i][j] = cnt++; //由于內(nèi)存卡的緊,所以這樣編號,不能開 10*10 的}while(scanf("%d",&n)!=EOF){for(i =1 ; i <=n;i++){scanf("%d",&a[i]) ;}build(1,1,n);scanf("%d",&q);while(q--){scanf("%d",&ty);if(ty==1){scanf("%d%d%d%d",&s,&e,&k,&c);update(1,s,e,c,k,s%k); //這里為什么是 s% k 呢 ,因為 :} //(i- s)%k = (i%k - s%k + k)%k = 0 的話 i%k 應(yīng)該 = s%k ;else{int pos;scanf("%d",&pos);int ans = query(1,pos);printf("%d\n",ans);}}}return 0;}
?
總結(jié)
以上是生活随笔為你收集整理的HDU4267(2012长春网络赛)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用找因子来找方程解的个数
- 下一篇: HDU1066--高精度求阶乘最后非零位