[NKU]sweet @ Google && TopCoder && CodeForces

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks
          思路是維護每個字母開頭,長度為3的串是不是wbw……
          這樣相當于將長度為N的字符串變成長度為N-2的序列,然后一系列修改就是將序列中1變0,0變1,查詢就是求一段的和
          BIT,大家都懂的……
           1 #include <cstdio>
           2 #include <cstring>
           3 
           4 int n,m;
           5 char str[50010];
           6 int arr[50010];
           7 
           8 inline int lowbit(int x) {return x & -x;}
           9 
          10 void update(int x,int delta) {
          11     for (int i = x; i <= n; i += lowbit(i)) {
          12         arr[i] += delta;
          13     }
          14 }
          15 
          16 int sum(int x) {
          17     int ret = 0;
          18     while (x) {ret += arr[x]; x -= lowbit(x);}
          19     return ret;
          20 }
          21 
          22 int sum(int l,int r) {
          23     if (l > r) return 0;
          24     if (l == 0return sum(r);
          25     return sum(r) - sum(l - 1);
          26 }
          27 
          28 int main() {
          29     int nn; scanf("%d",&nn);
          30     for (int ii = 1; ii <= nn; ii++) {
          31         scanf("%d%d",&n,&m);                
          32         memset(str,0,sizeof(str));
          33         memset(arr,0,sizeof(arr));
          34         scanf("%s",str + 1);
          35         for (int i = 1; i + 2 <= n; i++) {
          36             if (str[i] == 'w' && str[i + 1== 'b' && str[i + 2== 'w') {
          37                 update(i,1);
          38             }
          39         }
          40         printf("Case %d:\n",ii);
          41         while (m--) {
          42             int ctrl; scanf("%d",&ctrl);
          43             if (ctrl == 0) {
          44                 int l,r; scanf("%d%d",&l,&r); printf("%d\n",sum(l + 1,r - 1));
          45             } else {
          46                 int pos; char buf[10]; scanf("%d",&pos); scanf("%s",buf); pos ++;
          47                 for (int i = pos - 2; i <= pos && i + 2 <= n; i++) {
          48                     if (str[i] == 'w' && str[i + 1== 'b' && str[i + 2== 'w') {
          49                         update(i,-1);
          50                     }
          51                 }
          52                 str[pos] = buf[0];
          53                 for (int i = pos - 2; i <= pos && i + 2 <= n; i++) {
          54                     if (str[i] == 'w' && str[i + 1== 'b' && str[i + 2== 'w') {
          55                         update(i,1);
          56                     }
          57                 }
          58             }
          59         }
          60     }
          61     return 0;
          62 }
          posted on 2011-09-18 20:44 sweetsc 閱讀(756) 評論(3)  編輯  收藏

          Feedback

          # re: 2011ACM北京網絡預選賽G Panda (BUPT 217) 2011-09-19 10:44 forget~
          這個是屬于線段樹里的嗎?  回復  更多評論
            

          # re: 2011ACM北京網絡預選賽G Panda (BUPT 217) 2011-09-19 12:51 [NKU]sweet
          @forget~
          樹狀數組……  回復  更多評論
            

          # re: 2011ACM北京網絡預選賽G Panda (BUPT 217) 2011-09-21 15:17 游客
          query的時候。
          為什么要 if( r - l < 2 ) cout << "0" << endl;
          else cout << sum(r-1) - sum(l) << endl;
          我知道r-l 如果小于2的話肯定是0 ,但是else里面sum()可以正確求出這樣的答案啊。。。。
          我不加if 就WA,加了才對。
          能不能舉出例子為什么必須加if啊  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 农安县| 宜兰市| 葫芦岛市| 固阳县| 保康县| 桐梓县| 民权县| 神木县| 兴安盟| 武冈市| 咸宁市| 公安县| 诸暨市| 鄢陵县| 峡江县| 平定县| 和林格尔县| 平谷区| 银川市| 安化县| 康保县| 碌曲县| 雅安市| 岢岚县| 醴陵市| 武义县| 波密县| 二连浩特市| 虹口区| 阳山县| 军事| 常熟市| 惠州市| 油尖旺区| 伽师县| 巴林右旗| 定远县| 桦川县| 托克托县| 永春县| 舟山市|