hdu 4046 2011北京赛区网络赛G 线段树 ***

还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来

若某位是1,则前两个为wb,这位就是w

  1 #include<cstdio>
  2 #include<cstring>
  3 #define lson l,m,rt<<1
  4 #define rson m+1,r,rt<<1|1
  5 using namespace std;
  6 const int maxn=50010;
  7 int n,m,sum[maxn<<2];
  8 char str[maxn];
  9 int num[maxn];
 10 void pushup(int rt)
 11 {
 12     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 13 }
 14 void build(int l,int r,int rt)
 15 {
 16     if(l==r)
 17     {
 18         sum[rt]=num[l];
 19         return;
 20     }
 21     int m=(l+r)>>1;
 22     build(lson);
 23     build(rson);
 24     pushup(rt);
 25 }
 26 int query(int L,int R,int l,int r,int rt)
 27 {
 28     if(L<=l&&r<=R)
 29     {
 30         return sum[rt];
 31     }
 32     int m=(l+r)>>1;
 33     int ans=0;
 34     if(L<=m) ans+=query(L,R,lson);
 35     if(R>m)  ans+=query(L,R,rson);
 36     return ans;
 37 }
 38 void update(int p,int val,int l,int r,int rt)
 39 {
 40     if(l==r)
 41     {
 42         sum[rt]=val;
 43         return;
 44     }
 45     int m=(l+r)>>1;
 46     if(p<=m) update(p,val,lson);
 47     else      update(p,val,rson);
 48     pushup(rt);
 49 }
 50 int main()
 51 {
 52     int t,T;
 53     scanf("%d",&T);
 54     for(int t=1;t<=T;t++)
 55     {
 56         printf("Case %d:\n",t);
 57         scanf("%d%d%s",&n,&m,str+1);
 58         memset(num,0,sizeof(num));
 59         for(int i=3;i<=n;i++)
 60             if(str[i-2]==‘w‘&&str[i-1]==‘b‘&&str[i]==‘w‘)  num[i]=1;
 61         build(1,n,1);
 62         int k,a,b;
 63         char ch[5];
 64         while (m--)
 65         {
 66             scanf("%d",&k);
 67             if(k==0)
 68             {
 69                 scanf("%d%d",&a,&b);
 70                 a++;b++;   //字符串从1开始,所以下标都加1
 71                 if(b-a<2)  printf("0\n");
 72                 else       printf("%d\n",query(a+2,b,1,n,1));
 73             }
 74             else
 75             {
 76                 scanf("%d%s",&a,ch);
 77                 a++;
 78                 if(ch[0]==str[a]) continue;//修改的和以前一样,这不用任何操作
 79                 if(a>=3)
 80                 {
 81                     if(str[a-2]==‘w‘&&str[a-1]==‘b‘&&str[a]==‘w‘)
 82                         update(a,0,1,n,1);
 83                     if(str[a-2]==‘w‘&&str[a-1]==‘b‘&&str[a]==‘b‘)
 84                         update(a,1,1,n,1);
 85                 }
 86                 if(a>=2&&a+1<=n)
 87                 {
 88                     if(str[a-1]==‘w‘&&str[a]==‘b‘&&str[a+1]==‘w‘)
 89                         update(a+1,0,1,n,1);
 90                     if(str[a-1]==‘w‘&&str[a]==‘w‘&&str[a+1]==‘w‘)
 91                         update(a+1,1,1,n,1);
 92                 }
 93                 if(a+2<=n)
 94                 {
 95                     if(str[a]==‘w‘&&str[a+1]==‘b‘&&str[a+2]==‘w‘)
 96                         update(a+2,0,1,n,1);
 97                     if(str[a]==‘b‘&&str[a+1]==‘b‘&&str[a+2]==‘w‘)
 98                         update(a+2,1,1,n,1);
 99                 }
100                 str[a]=ch[0];
101             }
102         }
103     }
104     return 0;
105 }

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #define lson l,mid,rt<<1
  8 #define rson mid+1,r,rt<<1|1
  9 #define root 1,n,1
 10 #define mid ((l+r)>>1)
 11 #define ll long long
 12 #define cl(a) memset(a,0,sizeof(a))
 13 #define ts printf("*****\n");
 14 using namespace std;
 15 const int MAXN=50010;
 16 int sum[MAXN<<2],lsum[MAXN<<2],rsum[MAXN<<2],lc[MAXN<<2],rc[MAXN<<2];
 17 int n,m,tt;
 18 char s[MAXN];
 19 void pushup(int l,int r,int rt)
 20 {
 21     //printf("%d %d %d %d\n",l,r,rt,mid);
 22     /*if(mid==3)
 23     {
 24         printf("%s\n",s+1);
 25         printf("%c %c %c\n",s[mid-1],s[mid],s[mid+1]);
 26     }*/
 27     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 28     if(/*(s[mid]==‘b‘&&s[mid-1]==‘w‘&&s[mid+1]==‘w‘)||*/(s[mid]==‘w‘&&s[mid+1]==‘b‘&&s[mid+2]==‘w‘)&&mid+1<=n)
 29     {
 30         sum[rt]+=1;
 31     }
 32 }
 33 void build(int l,int r,int rt)
 34 {
 35     if(l==r)
 36     {
 37         sum[rt]=0;
 38         return;
 39     }
 40     build(lson);
 41     build(rson);
 42     pushup(l,r,rt);
 43 }
 44 void update(int pos,int val,int l,int r,int rt)
 45 {
 46     if(l==r)
 47     {
 48         return;
 49     }
 50     update(pos,val,lson);
 51     update(pos,val,rson);
 52     pushup(l,r,rt);
 53 }
 54 int query(int L,int R,int l,int r,int rt)
 55 {
 56
 57     //printf("%d %d %d %d %d\n",L,R,l,r,rt);
 58     if(L<=l&&r<=R)
 59     {
 60         return sum[rt];
 61     }
 62     if(R<=mid) return query(L,R,lson);
 63     if(L>mid) return query(L,R,rson);
 64
 65     int ta,tb;
 66     ta=query(L,R,lson);
 67     tb=query(L,R,rson);
 68     int ans;
 69     ans=max(ta,tb);
 70     if(/*(s[mid]==‘b‘&&s[mid-1]==‘w‘&&s[mid+1]==‘w‘)||*/(s[mid]==‘w‘&&s[mid+1]==‘b‘&&s[mid+2]==‘w‘)&&mid+1<=n) //同上
 71     {
 72         ans+=1;
 73     }
 74     return ans;
 75 }
 76 int main()
 77 {
 78     int i,j,k;
 79     #ifndef ONLINE_JUDGE
 80     freopen("1.in","r",stdin);
 81     #endif
 82     scanf("%d",&tt);
 83     int ca=1;
 84     while(tt--)
 85     {
 86         printf("Case %d:\n",ca++);
 87         scanf("%d%d",&n,&m);
 88         scanf("%s",s+1);
 89         s[0]=‘k‘;
 90         build(root);
 91         while(m--)
 92         {
 93             int op;
 94             scanf("%d",&op);
 95             if(op==0)
 96             {
 97                 int l,r;
 98                 scanf("%d%d",&l,&r);
 99                 //printf("%d %d\n",l,r);
100                 l++,r++;
101                 int w=query(l,r,root);
102                 printf("%d\n",w);
103             }
104             else
105             {
106                 int x,val;
107                 char c[10];
108                 scanf("%d%s",&x,c);
109                 x++;
110                 if(c[0]!=s[x])  s[x]=c[0],update(x,val,root);
111
112             }
113         }
114     }
115 }

TLE代码

时间: 2024-10-13 00:58:00

hdu 4046 2011北京赛区网络赛G 线段树 ***的相关文章

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 4050 2011北京赛区网络赛K 概率dp ***

题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到达这个格子 1:表示左脚跳进这个格子 2:表示右脚跳进这个格子 3:随意哪个脚跳进这个格子,而且下一步随意用哪个脚 dp[i][j] :表示走到第 i 个格子在 j 状态的期望. 当j=1时,你可以走到dp[i+k][2],dp[i+k][3], 当j=2时,你可以走到dp[i+k][1],dp[i

hdu 4049 2011北京赛区网络赛J 状压dp ***

cl少用在for循环里 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x

hdu 4041 2011北京赛区网络赛B 搜索 ***

直接在字符串上搜索,注意逗号的处理 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 #define pb

hdu 4044 2011北京赛区网络赛E 树形dp ****

专题训练 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1010; 7 const int INF=0x3fffffff; 8 struct Node 9 { 10 int to; 11 int next; 12 }edge[MAXN*2]; 13 int t

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4036 2011成都赛区网络赛F 模拟 **

为了确保能到达终点,我们需要满足下面两个条件 1.能够到达所有山顶 2.能够在遇到苦土豆时速度大于他 二者的速度可以用能量守恒定律做,苦土豆的坐标可通过三角形相似性来做 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using na

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000