首页 > 代码库 > 【线段树】bzoj3038 上帝造题的七分钟2 / bzoj3211 花神游历各国
【线段树】bzoj3038 上帝造题的七分钟2 / bzoj3211 花神游历各国
暴力修改,记录一段是否全部为1或0,若全是了,则不再修改。
注意3211一定要判是否为0,否则会T得惨无人道。
#include<cstdio>#include<cmath>using namespace std;#define lson rt<<1,l,m#define rson rt<<1|1,m+1,rint f,c;typedef long long ll;inline void R(int &x){ c=0;f=1; for(;c<‘0‘||c>‘9‘;c=getchar())if(c==‘-‘)f=-1; for(x=0;c>=‘0‘&&c<=‘9‘;c=getchar())(x*=10)+=(c-‘0‘); x*=f;}void P(ll x){ if(x<10)putchar(x+‘0‘); else{P(x/10);putchar(x%10+‘0‘);}}ll sumv[400001];bool All[400001];int op;int x,y,n,m;void buildtree(int rt,int l,int r){ if(l==r) { int t; R(t); sumv[rt]=(ll)t; if(sumv[rt]==1||sumv[rt]==0) All[rt]=1; return; } int m=(l+r)>>1; buildtree(lson); buildtree(rson); sumv[rt]=sumv[rt<<1]+sumv[rt<<1|1]; All[rt]=(All[rt<<1]&All[rt<<1|1]);}void update(int ql,int qr,int rt,int l,int r){ if(All[rt]) return; if(l==r) { sumv[rt]=sqrt(sumv[rt]); if(sumv[rt]==1) All[rt]=1; return; } int m=l+r>>1; if(ql<=m) update(ql,qr,lson); if(m<qr) update(ql,qr,rson); sumv[rt]=sumv[rt<<1]+sumv[rt<<1|1]; All[rt]=(All[rt<<1]&All[rt<<1|1]);}ll query(int ql,int qr,int rt,int l,int r){ if(ql<=l&&r<=qr) return sumv[rt]; int m=l+r>>1; ll res=0; if(ql<=m) res+=query(ql,qr,lson); if(m<qr) res+=query(ql,qr,rson); return res;}int main(){ R(n); buildtree(1,1,n); R(m); for(int i=1;i<=m;++i) { R(op); R(x); R(y); if(op==2) update(x,y,1,1,n); else P(query(x,y,1,1,n)),puts(""); } return 0;}
【线段树】bzoj3038 上帝造题的七分钟2 / bzoj3211 花神游历各国
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。