[关闭]
@994495jj 2017-08-21T02:45:26.000000Z 字数 2046 阅读 793

hdu6155

201708 (ACM)数据结构----线段树 (ACM)动态规划


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. #define lson l,m,rt<<1
  11. #define rson m+1,r,rt<<1|1
  12. typedef long long ll;
  13. typedef pair<int, int> pii;
  14. typedef vector<int> vi;
  15. //--------
  16. const int N=100005;
  17. const ll mod=1e9+7;
  18. int n,q;
  19. int tag[N<<2];
  20. char s[N];
  21. ll a[N<<2],b[N<<2],c[N<<2],d[N<<2],e[N<<2],f[N<<2];
  22. void up(int rt) {
  23. int l=(rt<<1);
  24. int r=(rt<<1|1);
  25. a[rt]=(a[r]*a[l]%mod+b[r]*d[l]%mod)%mod;
  26. b[rt]=(a[r]*b[l]%mod+b[r]*e[l]%mod)%mod;
  27. c[rt]=(a[r]*c[l]%mod+b[r]*f[l]%mod+c[r])%mod;
  28. d[rt]=(d[r]*a[l]%mod+e[r]*d[l]%mod)%mod;
  29. e[rt]=(d[r]*b[l]%mod+e[r]*e[l]%mod)%mod;
  30. f[rt]=(d[r]*c[l]%mod+e[r]*f[l]%mod+f[r])%mod;
  31. }
  32. void gao(int x) {
  33. swap(a[x],b[x]);
  34. swap(d[x],e[x]);
  35. swap(a[x],d[x]);
  36. swap(b[x],e[x]);
  37. swap(c[x],f[x]);
  38. }
  39. void down(int rt) {
  40. if(!tag[rt]) return ;
  41. gao(rt<<1);
  42. gao(rt<<1|1);
  43. tag[rt<<1]^=1;
  44. tag[rt<<1|1]^=1;
  45. tag[rt]=0;
  46. }
  47. void build(int l,int r,int rt) {
  48. if(l==r) {
  49. if(s[l-1]=='0') {
  50. a[rt]=b[rt]=c[rt]=e[rt]=1;
  51. } else {
  52. a[rt]=d[rt]=e[rt]=f[rt]=1;
  53. }
  54. return ;
  55. }
  56. int m=(l+r)>>1;
  57. build(lson);build(rson);
  58. up(rt);
  59. }
  60. void upd(int L,int R,int l,int r,int rt) {
  61. if(R<l||r<L) return ;
  62. if(L<=l&&r<=R) {
  63. tag[rt]^=1;
  64. gao(rt);
  65. return ;
  66. }
  67. int m=(l+r)>>1;
  68. down(rt);
  69. upd(L,R,lson);
  70. upd(L,R,rson);
  71. up(rt);
  72. }
  73. pair<ll,ll> calc(int t,ll x,ll y) {
  74. ll o=a[t]*x%mod+b[t]*y%mod+c[t];
  75. ll _=d[t]*x%mod+e[t]*y%mod+f[t];
  76. return mp(o%mod,_%mod);
  77. }
  78. pair<ll,ll> qry(int L,int R,ll x,ll y,int l,int r,int rt) {
  79. if(L<=l&&r<=R) return calc(rt,x,y);
  80. int m=(l+r)>>1;
  81. down(rt);
  82. if(m>=L) {
  83. pair<ll,ll> t=qry(L,R,x,y,lson);
  84. x=t.fi;y=t.se;
  85. }
  86. if(m+1<=R) {
  87. pair<ll,ll> t=qry(L,R,x,y,rson);
  88. x=t.fi;y=t.se;
  89. }
  90. return mp(x,y);
  91. }
  92. int main() {
  93. int T;scanf("%d",&T);
  94. while(T--) {
  95. ///
  96. scanf("%d%d%s",&n,&q,s);
  97. ///init
  98. memset(tag,0,sizeof(tag));
  99. memset(a,0,sizeof(a));
  100. memset(b,0,sizeof(b));
  101. memset(c,0,sizeof(c));
  102. memset(d,0,sizeof(d));
  103. memset(e,0,sizeof(e));
  104. memset(f,0,sizeof(f));
  105. ///solve
  106. build(1,n,1);
  107. while(q--) {
  108. int x,y,z;scanf("%d%d%d",&x,&y,&z);
  109. if(x==1) {
  110. upd(y,z,1,n,1);
  111. } else {
  112. pair<ll,ll> t=qry(y,z,0,0,1,n,1);
  113. ll ans=(t.fi+t.se)%mod;
  114. printf("%lld\n",ans);
  115. }
  116. }
  117. }
  118. return 0;
  119. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注