码迷,mamicode.com
首页 > 其他好文 > 详细

圣章-精灵使的魔法语——线段树的运用

时间:2020-07-24 16:21:35      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:hang   %s   node   scan   pac   vegeta   sig   线段树   uil   

可能是要咕咕咕的题目,先上下代码。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 using namespace std;
 8 #define debug printf("zjyvegetable\n")
 9 #define int long long
10 #define mid ((l+r)>>1)
11 #define lp (p<<1)
12 #define rp (p<<1|1)
13 inline int read(){
14     int a=0,b=1;char c=getchar();
15     while(!isdigit(c)){if(c==-)b=-1;c=getchar();}
16     while(isdigit(c)){a=a*10+c-0;c=getchar();}
17     return a*b;
18 }
19 const int N=2e5+50,M=2e6+50;
20 struct node{
21     int left,right;
22 }t[M],rem;
23 int n,m,q[N];
24 char s[N];
25 node update(node t1,node t2){
26     node tt;
27     tt.left=(t1.left-t2.right>0?t1.left-t2.right:0)+t2.left;
28     tt.right=(t2.right-t1.left>0?t2.right-t1.left:0)+t1.right;
29     return tt;
30 }
31 void build(int p,int l,int r){
32     if(l==r){
33         if(!q[l])t[p].left++;
34         else t[p].right++;
35         return;
36     }
37     build(lp,l,mid);
38     build(rp,mid+1,r);
39     t[p]=update(t[lp],t[rp]);
40 }
41 void change(int p,int l,int r,int k){
42     if(l==r){
43         q[l]^=1;
44         if(!q[l])t[p].right--,t[p].left++;
45         else t[p].right++,t[p].left--;
46         return;
47     }
48     if(k<=mid)change(lp,l,mid,k);
49     else change(rp,mid+1,r,k);
50     t[p]=update(t[lp],t[rp]);
51 }
52 node query(int p,int l,int r,int L,int R){
53     if(l==L&&r==R){
54         return t[p];
55     }
56     if(R<=mid)return query(lp,l,mid,L,R);
57     if(L>mid)return query(rp,mid+1,r,L,R);
58     return update(query(lp,l,mid,L,mid),query(rp,mid+1,r,mid+1,R));
59 }
60 signed main(){
61     //freopen("elf.in","r",stdin);
62     //freopen("elf.out","w",stdout);
63     char que[10];int x,y;
64     n=read();m=read();
65     scanf("%s",s+1);
66     for(int i=1;i<=n;i++)
67     if(s[i]==()q[i]=0;else q[i]=1;
68     build(1,1,n);
69     for(int i=1;i<=m;i++){
70         scanf("%s",que);
71         if(que[0]==Q){
72             x=read();y=read();
73             rem=query(1,1,n,x,y);
74             printf("%lld %lld\n",rem.right,rem.left);
75         }
76         else{
77             x=read();
78             change(1,1,n,x);
79         }
80     }
81     return 0;
82 }

 

圣章-精灵使的魔法语——线段树的运用

标签:hang   %s   node   scan   pac   vegeta   sig   线段树   uil   

原文地址:https://www.cnblogs.com/zjy1412/p/13371710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!