日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 4027

發(fā)布時間:2023/12/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 4027 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:

http://acm.hdu.edu.cn/showproblem.php?pid=4027

先說這個題的關(guān)鍵:

  • 這道題不同于普通的成段更新,需要對每一個值進行求根操作,而如果每次都對區(qū)間的每個點進行求根操作的話,復(fù)雜度肯定很高。所以,第一個關(guān)鍵點就是,一個數(shù)不斷開方后的結(jié)果,最后一定會變成1的,即便是2的64次方這么大的數(shù),開方7次后也會變成1。所以,我們對一個點最多也就更新7次。
  • 一個很坑的點就是,題目并沒有告訴x>y,這個錯誤很隱秘,所以仔細讀題很重要。。。
  • 大部分代碼都是正常的線段樹操作,不同的是,lazy數(shù)組記錄該節(jié)點維護的區(qū)間是否還需要更新,pushup函數(shù)中,有個&&操作,就是當兩子節(jié)點的lazy值都為1,父節(jié)點也為1,說明這兩個數(shù)都不需要操作了。

    update中要注意只有當lazy值不為1的時候才需要更新下去,若為1則說明這段區(qū)間內(nèi)的所有值已經(jīng)都為1,不需要再進行開方運算了。

    1 #include<stdio.h> 2 #include<math.h> 3 #define maxn 100100 4 #define lson l,m,rt*2 5 #define rson m+1,r,rt*2+1 6 long long tree[maxn<<2]; 7 int lazy[maxn<<2]; 8 void pushup(int rt){ 9 tree[rt] = tree[rt*2]+tree[rt*2+1]; 10 lazy[rt] = lazy[rt*2]&&lazy[rt*2+1]; 11 } 12 void build(int l,int r,int rt){ 13 lazy[rt] = 0; 14 if(l==r){ 15 scanf("%lld",&tree[rt]); 16 return; 17 } 18 int m = (l+r)/2; 19 build(lson); 20 build(rson); 21 pushup(rt); 22 } 23 void update(int a,int b,int l,int r,int rt){ 24 if(l==r){ 25 tree[rt] = sqrt(tree[rt]); 26 if(tree[rt]<=1){ 27 lazy[rt] = 1; 28 } 29 return; 30 } 31 int m = (l+r)/2; 32 if(a<=m&&!lazy[rt]) 33 update(a,b,lson); 34 if(b>m&&!lazy[rt]) 35 update(a,b,rson); 36 pushup(rt); 37 } 38 long long query(int a,int b,int l,int r,int rt){ 39 if(a<=l&&b>=r) 40 return tree[rt]; 41 int m = (l+r)/2; 42 long long ret = 0; 43 if(a<=m) 44 ret += query(a,b,lson); 45 if(b>m) 46 ret += query(a,b,rson); 47 return ret; 48 } 49 int main(){ 50 int n,cnt = 1;; 51 while(scanf("%d",&n)!=EOF){ 52 build(1,n,1); 53 int m; 54 scanf("%d",&m); 55 int flag = 1; 56 while(m--){ 57 int t,x,y; 58 scanf("%d%d%d",&t,&x,&y); 59 if(x>y) 60 x^=y^=x^=y; 61 if(t==0){ 62 update(x,y,1,n,1); 63 }else{ 64 if(flag == 1){ 65 printf("Case #%d:\n",cnt); 66 flag = 0; 67 } 68 printf("%lld\n",query(x,y,1,n,1)); 69 } 70 } 71 cnt++; 72 printf("\n"); 73 } 74 return 0; 75 }

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/zqy123/p/5061337.html

    總結(jié)

    以上是生活随笔為你收集整理的HDU 4027的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。