SPOJ MULTQ3 7299 Multiples of 3 (区间更新)
生活随笔
收集整理的這篇文章主要介紹了
SPOJ MULTQ3 7299 Multiples of 3 (区间更新)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?題目連接:http://www.spoj.com/problems/MULTQ3/
#include <iostream> #include <stdio.h> #include <string.h> #define lson rt<<1,L,mid #define rson rt<<1|1,mid+1,R /* 題意:給出n個數,初試為0,給出兩個操作;0 A B :將[A,B]區間中的每個數+11 A B :詢問[A,B]區間中有多少個能被3整除的數。 思路:每個節點存儲三個值:num0:整除3的個數,num1:除以3余1的個數,num2:除以3余2的個數更新的時候,只要將這三個值互換即可 */ using namespace std; const int maxn=100005; int n,m;struct Node{//num0:整除3的個數,num1:除以3余1的個數,num2:除以3余2的個數int num0,num1,num2;int lazy; //標記該區間+1的次數,如果三次+1相當于不變 }tree[maxn<<2];void build(int rt,int L,int R){tree[rt].num0=(R-L+1);tree[rt].num1=tree[rt].num2=0;tree[rt].lazy=0;if(L==R)return;int mid=(R+L)>>1;build(lson);build(rson); } void pushUp(int rt){tree[rt].num0=tree[rt<<1].num0+tree[rt<<1|1].num0;tree[rt].num1=tree[rt<<1].num1+tree[rt<<1|1].num1;tree[rt].num2=tree[rt<<1].num2+tree[rt<<1|1].num2; } void pushDown(Node &rt,Node &ls,Node &rs){if(rt.lazy==1){/*+1一次:num0->num1num1->num2num2->num0*/int tmp;tmp=ls.num0;ls.num0=ls.num2;ls.num2=ls.num1;ls.num1=tmp;ls.lazy=(ls.lazy+rt.lazy)%3;tmp=rs.num0;rs.num0=rs.num2;rs.num2=rs.num1;rs.num1=tmp;rs.lazy=(rs.lazy+rt.lazy)%3;rt.lazy=0;}else if(rt.lazy==2){/*+1二次:num0->num2num2->num1num1->num0*/int tmp;tmp=ls.num0;ls.num0=ls.num1;ls.num1=ls.num2;ls.num2=tmp;ls.lazy=(ls.lazy+rt.lazy)%3;tmp=rs.num0;rs.num0=rs.num1;rs.num1=rs.num2;rs.num2=tmp;rs.lazy=(rs.lazy+rt.lazy)%3;rt.lazy=0;} } void update(int rt,int L,int R,int l,int r){if(l<=L&&R<=r){int tmp;tmp=tree[rt].num0;tree[rt].num0=tree[rt].num2;tree[rt].num2=tree[rt].num1;tree[rt].num1=tmp;tree[rt].lazy=(tree[rt].lazy+1)%3;return;}pushDown(tree[rt],tree[rt<<1],tree[rt<<1|1]);int mid=(L+R)>>1;if(l<=mid)update(lson,l,r);if(r>mid)update(rson,l,r);pushUp(rt); } int query(int rt,int L,int R,int l,int r){if(l<=L&&R<=r){return tree[rt].num0;}pushDown(tree[rt],tree[rt<<1],tree[rt<<1|1]);int ret=0;int mid=(L+R)>>1;if(l<=mid)ret+=query(lson,l,r);if(r>mid)ret+=query(rson,l,r);return ret; } int main() {int t,a,b;scanf("%d%d",&n,&m);build(1,1,n);for(int i=1;i<=m;i++){scanf("%d%d%d",&t,&a,&b);a++;b++;if(t==0){update(1,1,n,a,b);}else{int ans=query(1,1,n,a,b);printf("%d\n",ans);}}return 0; }?
轉載于:https://www.cnblogs.com/chenxiwenruo/p/3418459.html
總結
以上是生活随笔為你收集整理的SPOJ MULTQ3 7299 Multiples of 3 (区间更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3525/UVA 1396 Mo
- 下一篇: Winform 打开下载的文件