青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

oyjpArt ACM/ICPC算法程序設計空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

HOJ 11107

Posted on 2008-01-09 14:11 oyjpart 閱讀(7775) 評論(8)  編輯 收藏 引用 所屬分類: ACM/ICPC或其他比賽
Number of stones
Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:32768KB
Total submit users: 13, Accepted users: 1
Problem 11107 : No special judgement
Problem description
There are N baskets rounded in a circle, and numbered as 1、2、3、…….、N-1、N, in clockwise. At the beginning, all of the baskets are empty. Some workers go to the moutain to collect stones. When they are back,they put their stones to some baskets. The workers have a habit, Once a worker come back, he choose a baskets, and choose a direction(clockwise or anticlockwise), he put one stone to this basket and move to the next basket according to the direction he has chosen, he continues doing this until all of the stones they have collected have been put down.
Sometimes the workers ask you how many stone it is in the basket, as there are too many baskets, You are to wirte a program to calculate this.


Input
The input test file will contain multiple cases. Each test case:
In the first line of the input contain two integers N,M(3 <= N <= 100000, 0 <= M <= 300000). Following M lines,each line represents an event. There are only three kinds of events: Q, C, U. And the format is:
“Q x”, query the number of stones in the basket x.
“C x num”, a worker comes back and the number of the stones he has picked up is num, he puts down stones from the basket x in clockwise.
“U x num”, a worker comes back and the number of the stone he has picked up is num, he puts down stones from the basket x in anticlockwise.
(x, num are both integers, 1 <= x <= N, 1 <= num <= 10000)


Output
For each query “Q x”, print the current number of stones in basket x.

Sample Input
5 8
            C 5 8
            Q 5
            Q 4
            U 5 3
            C 2 6
            Q 2
            Q 1
            U 2 8
            
Sample Output
2
            1
            4
            3
            
Problem Source
birdman


上次比賽沒有做..補做一個..挺好的題..重寫了點樹模板
 1/*
 2 * 主程序要作的事情
 3 * 1.確定N :必須是2^n,可以取實際n的上界
 4 * 2.build(left, right);
 5 *
 6 */

 7
 8#include <cstdio>
 9#include <cstring>
10
11const int N = 131072;                //必須是2^n,可以取實際n的上界
12
13int upperbound;
14
15struct Node {
16    int i, j, c, m;                    //left, right
17}
 T[N*2];
18
19void bd(int d, int left, int right) {
20    T[d].i = left, T[d].j = right, T[d].c = 0;
21    if(right > left) {
22        bd(d*2+1, left, T[d].m = (left+right)>>1);
23        bd(d*2+2, T[d].m+1, right);
24    }

25}

26
27void build(int left, int right) {
28    upperbound = 1;
29    while(upperbound < right-left+1) upperbound <<= 1;
30    bd(0, left, left + upperbound-1);
31}

32
33void add(int d, int left, int right, int c) {
34    if(left <= T[d].i && right >= T[d].j) {
35        T[d].c += c;
36    }

37    else {
38        if(left <= T[d].m) add(d*2+1, left, right, c);
39        if(right > T[d].m) add(d*2+2, left, right, c);
40    }

41}

42
43int get(int x) // 獲得點的覆蓋次數
44    int idx = upperbound+x-1, sum = 0;
45    do {
46        sum += T[idx].c;
47        idx = (idx-1)>>1;
48    }
 while(idx != 0);
49    return sum;
50}

51
52int n, m;
53
54void Add(int x, int num) {
55    int laps = (num-(n-x))/n;
56    if(laps > 0{
57        add(00, n-1, laps);
58    }

59    num -= laps*n;
60    if(n->= num) {
61        add(0, x, x+num-11);
62    }

63    else {
64        add(0, x, n-11);
65        add(00, (x+num-1)%n, 1);
66    }

67}

68
69int main() {
70    while(scanf("%d %d"&n, &m) != EOF) {
71        build(0, n-1);
72        while(m--{
73            char cmd;
74            int x, num;
75            scanf(" %c"&cmd);
76            if(cmd == 'Q'{
77                scanf("%d"&x); 
78                --x;
79                printf("%d\n", get(x));
80            }

81            else if(cmd == 'C'{
82                scanf("%d %d"&x, &num);
83                --x;
84                Add(x, num);
85            }

86            else if(cmd == 'U'{
87                scanf("%d %d"&x, &num);
88                --x;
89                int y = (x-num+1% n;
90                if(y < 0) y += n;
91                Add(y, num);
92            }

93        }

94    }

95
96    return 0;
97}

Feedback

# re: HOJ 11107   回復  更多評論   

2008-05-24 21:25 by terence_zhao
good pro
but cant follow you

# re: HOJ 11107   回復  更多評論   

2008-05-25 20:31 by sicheng[I am oyjpArt]
如果我們把這個環放成直線(準確的說是一個區間)來看的話,放入某一個籃子并且按照順時針旋轉一直放num,相當于在這個區間插入很多條線段。而進一步說,我們可以考慮只有3中線段,比如
區間是[0,4] 從3開始插入長度為11的線段 則可以分成
[3,4]
[0,4] * 2
[0,0]
而逆時針的情況很好處理,如果你現算出最后停在哪個點上,換一下起始點和終點就是順時針了.

最后是線段樹了,我們把所有的線段都分別插入.最后統計詢問中的點上有多少線段覆蓋就可以了.

要進行點的線段覆蓋查詢,有很多種做法,我覺得比較好的就是從葉節點向上到根節點,去疊加覆蓋數就可以了.

呵呵~~

# re: HOJ 11107   回復  更多評論   

2008-06-03 14:01 by w
建樹可以非遞歸話吧

# re: HOJ 11107   回復  更多評論   

2008-10-13 10:57 by re: HOJ 11107
謝謝大牛了,我搞了半天終于弄懂了什么原理哈

# re: HOJ 11107   回復  更多評論   

2008-10-13 14:14 by re: HOJ 11107
int get(int x) { // 獲得點的覆蓋次數
44 int idx = upperbound+x-1, sum = 0;
45 do {
46 sum += T[idx].c;
47 idx = (idx-1)>>1;
48 } while(idx != 0);
49 return sum;
50}

貌似這里有個錯誤,你的代碼對這組數據通不過:
5 3
C 1 5
Q 1
Q 5

應改為:

int get(int x) { // 獲得點的覆蓋次數
44 int idx = upperbound+x-1, sum = 0;
45 do {
46 sum += T[idx].c;
47 idx -= 1;
if(idx != -1) idx >>= 1;
48 } while(idx >= 0);
49 return sum;
50}

# re: HOJ 11107   回復  更多評論   

2008-10-16 02:30 by oyjpart
Thx!~

# re: HOJ 11107   回復  更多評論   

2009-03-23 20:41 by 成大才子
絕對大牛

# re: HOJ 11107   回復  更多評論   

2009-03-26 00:27 by alpc12
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产小视频国产精品| 久久综合亚洲社区| 午夜日韩av| 亚洲国产精品一区二区第四页av | 国内精品视频一区| 午夜激情综合网| 欧美一区国产一区| 国外成人免费视频| 久久精品在线视频| 亚洲成在人线av| av成人免费| 国产在线观看91精品一区| 欧美成黄导航| 亚洲欧美在线网| 99v久久综合狠狠综合久久| 久久综合综合久久综合| 欧美一区二区三区四区在线观看| 亚洲乱码国产乱码精品精天堂| 国产一区二区| 狠狠色狠色综合曰曰| 99精品国产在热久久下载| 性久久久久久久久久久久| 伊人久久大香线蕉综合热线| 欧美另类在线播放| 久久综合色8888| 午夜精品久久久久久久99水蜜桃| 亚洲欧洲视频在线| 欧美a级在线| 欧美一区二区视频在线观看| 免费不卡视频| 国产一区二区三区四区hd| 欧美成人免费小视频| 亚洲自拍都市欧美小说| 一区二区三区福利| 一区二区动漫| 亚洲精品在线看| 亚洲精选久久| 亚洲美女毛片| 在线视频精品一| 亚洲欧美变态国产另类| 亚洲一区二区黄色| 亚洲在线观看视频网站| 亚洲女性裸体视频| 久久蜜桃精品| 欧美激情a∨在线视频播放| 欧美激情视频一区二区三区在线播放 | 99在线热播精品免费| 99精品欧美一区二区蜜桃免费| 亚洲国产欧美在线人成| 日韩午夜在线| 欧美一区二区网站| 欧美福利精品| 一本大道av伊人久久综合| 午夜精品久久久久久久99樱桃 | 一区免费在线| 亚洲高清视频在线观看| 在线视频亚洲一区| 久久久久网站| 999亚洲国产精| 久热精品在线| 国产喷白浆一区二区三区| 伊人成人开心激情综合网| 亚洲精品欧洲| 久久免费99精品久久久久久| 亚洲高清在线观看一区| 欧美日韩ab片| 国产精品久久久一区二区| 欧美激情在线免费观看| 亚洲视屏在线播放| 欧美成人亚洲| 国产一级揄自揄精品视频| 在线亚洲电影| 欧美护士18xxxxhd| 欧美中文字幕在线视频| 国产欧美日韩免费| 亚洲午夜一二三区视频| 亚洲日韩成人| 欧美激情a∨在线视频播放| 91久久国产自产拍夜夜嗨| 久久精彩视频| 午夜精品av| 国产手机视频一区二区| 欧美一级理论性理论a| 亚洲一区在线观看免费观看电影高清| 欧美激情按摩在线| 日韩午夜在线| 一区二区成人精品| 国产精品一区二区久久精品| 午夜伦理片一区| 久久久999精品视频| 亚洲国产精品视频一区| 欧美激情在线免费观看| 男同欧美伦乱| 亚洲一区二区视频在线观看| 亚洲国产三级| 国产欧美一区二区色老头 | 亚洲图中文字幕| 亚洲手机视频| 最近中文字幕日韩精品| 日韩亚洲欧美一区二区三区| 欧美日韩喷水| 久久精品在线观看| 蜜桃久久av一区| 欧美一区二区视频在线| 欧美1区2区| 久久久久国产免费免费| 欧美精品福利在线| 欧美在线黄色| 日韩午夜三级在线| 欧美一区二区三区免费视频| 最新国产の精品合集bt伙计| 亚洲综合色激情五月| 一本色道久久综合亚洲91| 性欧美xxxx视频在线观看| 中国日韩欧美久久久久久久久| 欧美在线网址| 久久夜色精品国产欧美乱| 欧美日韩免费观看一区二区三区| 久久国产视频网| 欧美午夜不卡| 亚洲性感美女99在线| 亚洲裸体在线观看| 蜜桃伊人久久| 亚洲黄色有码视频| 亚洲人成在线观看网站高清| 久久不射中文字幕| 久久成人人人人精品欧| 欧美高清视频一区二区三区在线观看 | 亚洲福利视频一区| 精品成人一区| 久久av资源网站| 免播放器亚洲一区| 1024亚洲| 欧美日韩国产精品一区| 一区二区三欧美| 久久黄色级2电影| 有码中文亚洲精品| 欧美69视频| 亚洲图片欧美日产| 久久久99免费视频| 亚洲国产精品va在看黑人| 欧美国产日韩亚洲一区| 亚洲国产日韩欧美| 亚洲欧美日本在线| 国精品一区二区| 欧美成人网在线| 亚洲欧美日韩另类| 欧美电影免费观看高清| 亚洲一二三级电影| 亚洲电影免费在线观看| 欧美日韩精品三区| 久久久一区二区| 在线视频亚洲欧美| 嫩草成人www欧美| 亚洲婷婷综合色高清在线| 午夜久久99| 亚洲精品欧美激情| 国产日产亚洲精品| 欧美日韩另类综合| 欧美jizz19性欧美| 欧美亚洲视频| 亚洲欧美视频在线观看视频| 亚洲精品久久久久久久久久久 | 欧美中日韩免费视频| 亚洲特级片在线| 亚洲国产毛片完整版| 激情欧美一区二区| 国产亚洲一本大道中文在线| 欧美天堂亚洲电影院在线播放| 欧美国产另类| 欧美成人免费全部| 巨乳诱惑日韩免费av| 久久久久久久尹人综合网亚洲 | 久久精品国产免费观看| 亚洲视频碰碰| 亚洲自拍都市欧美小说| 正在播放欧美一区| 亚洲无亚洲人成网站77777| 亚洲小说春色综合另类电影| 亚洲欧洲视频| 亚洲性视频网站| 性欧美激情精品| 久久综合999| 免费视频一区| 亚洲精品一区二区三区四区高清| 一区二区日韩精品| 亚洲一级片在线看| 久久精品在线视频| 欧美激情久久久久久| 欧美亚州韩日在线看免费版国语版| 欧美午夜免费影院| 国产视频一区在线| 亚洲乱亚洲高清| 欧美在线不卡视频| 欧美韩国日本一区| 香港久久久电影| 欧美日韩18| 国产亚洲成年网址在线观看| 亚洲激情偷拍| 美日韩精品免费|