大佬教程收集整理的这篇文章主要介绍了c – 具有延迟传播时间限制问题的段树,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <iostream> #include <iostream> #include <cstdio> #include <cString> #define MAX 100000 using namespace std; int M[2*MAX+1]; int flag[2*MAX+1]; int count; void refresh(int begin,int end,int n) { M[n] = end-begin+1 - M[n]; flag[n]=0; flag[n*2] =!flag[n*2]; flag[n*2+1] =!flag[n*2+1]; } void update(int begin,int i,int j,int n=1) { if(flag[n]) { refresh(begin,end,n); } if(begin>=i && end<=j) { if(!flag[n]) { refresh(begin,n); } flag[n] = 0; return; } else if(begin>=end) { return; } else { int mid = (begin+end)>>1; if(i<=mid) { update(begin,mid,i,j,n*2); } if(j>mid) { update(mid+1,n*2+1); } if(flag[2*n]) { refresh(begin,2*n); } if(flag[2*n+1]) { refresh(mid+1,2*n+1); } M[n] = M[n*2]+ M[n*2+1]; } } int query(int begin,n); } if(begin>=i && end<=j) { return M[n]; } if(begin>=end) { return 0; } int mid = (begin+end)>>1; int l=0,r=0; if(i<=mid) { l = query(begin,n*2); } if(j>mid) { r = query(mid+1,n*2+1); } if(flag[2*n]) { refresh(begin,2*n); } if(flag[2*n+1]) { refresh(mid+1,2*n+1); } M[n] = M[n*2]+ M[n*2+1]; return l+r; } int main() { memset(M,sizeof M); int n,m,a,b,c; scanf("%d%d",&n,&m); for(int i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&c); if(a==0) { update(1,n,c); } else { printf("%d\n",query(1,C)); } } return 0; }
以上是大佬教程为你收集整理的c – 具有延迟传播时间限制问题的段树全部内容,希望文章能够帮你解决c – 具有延迟传播时间限制问题的段树所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。