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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj Buy Tickets

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj Buy Tickets 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://poj.org/problem?id=2828

類似的題目:http://www.cnblogs.com/lovychen/p/3674048.html

測試數據:

in:

4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492

out:

77 33 69 51
31492 20523 3890 19243

題目分析:直接倒著進行插入,然后按照從前向后尋找空位進行插入:

【題解】:

    線段樹節點中保存這一段中的空位數,然后倒序對pos插入:

    例如:  0 77
         1 51
         1 33
         2 69

  ? 先取: 2 69  ——? ——? —69—?? ——?? (需要前面有3個空位才能插入)

?????? 然后取: 1 33?? ——? ?—33—? ??—69—? ??——?? (需要前面有2個空位才能插入)

?????? 然后取: 1?51?? ——?? —33—??? —69—??? —51—?? (需要前面有2個空位才能插入)? 前面只有1個空位? 故插入后面空格

   然后取:?0?77?? —77—?? —33—??? —69—??? —51—?? (需要前面有1個空位才能插入)

AC代碼:

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<string> 7 #include<cmath> 8 using namespace std; 9 const int N = 200010; 10 int T,tot; 11 int pre[N],vis[N]; 12 struct TT 13 { 14 int x,y; 15 }a[N]; 16 int lowbit(int x) 17 { 18 return x&(-x); 19 } 20 void init() 21 { 22 for(int i=1;i<=T;i++) 23 vis[i] =lowbit(i); 24 } 25 int sum(int x) 26 { 27 int ans = 0; 28 while(x>0) 29 { 30 ans = ans+vis[x]; 31 x = x-lowbit(x); 32 } 33 return ans; 34 } 35 int update(int x) 36 { 37 while(x<=T) 38 { 39 vis[x] = vis[x] - 1; 40 x = x +lowbit(x); 41 } 42 } 43 void add(int x,int y) 44 { 45 int l=1,r=T,mid; 46 while(l<r) 47 { 48 //printf("l === %d %d %d\n",l,r,mid); 49 mid = (l+r)/2; 50 if(sum(mid)>=x) r = mid; 51 else l = mid+1; 52 } 53 //printf("l = %d\n",l); 54 update(l); 55 pre[l] = y; 56 } 57 int main() 58 { 59 int aa,bb; 60 while(~scanf("%d",&T)) 61 { 62 init(); 63 for(int i=1;i<=T;i++) 64 { 65 scanf("%d %d",&aa,&bb); 66 a[i].x = aa+1; 67 a[i].y = bb; 68 } 69 for(int i=T;i>0;i--) 70 add(a[i].x,a[i].y); 71 for(int i=1;i<=T;i++) 72 { 73 if(i==1) printf("%d",pre[i]); 74 else printf(" %d",pre[i]); 75 } 76 printf("\n"); 77 } 78 return 0; 79 }

?

總結

以上是生活随笔為你收集整理的poj Buy Tickets的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。