标签:pr HDU ll tr mid add 4578 Transformation mod
简单线段树操作
咕咕咕
Transformation HDU - 4578 vj
talk is cheap, chow the code.
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const ll N = 2e5+99;
const ll mod = 10007;
struct segment_tree {
#define pl (p << 1)
#define pr (p << 1 | 1)
struct tree {
ll data, data2 ,data3;
ll add;
ll c;
ll mul;
}tr[N << 2];
inline void pushup(ll p) {
(tr[p].data = tr[pl].data + tr[pr].data)%=mod;
(tr[p].data2 = tr[pl].data2 + tr[pr].data2) %= mod;
(tr[p].data3 = tr[pl].data3 + tr[pr].data3) %= mod;
}
inline void pushdown(ll s, ll t, ll p) {
ll mid = (s + t) >> 1;
if (tr[p].c != -1) {
(tr[pl].data = tr[p].c * (mid -s + 1))%=mod;
(tr[pl].data2 = tr[p].c*tr[p].c%mod * (mid - s + 1)) %= mod;
(tr[pl].data3 = tr[p].c *tr[p].c%mod*tr[p].c % mod * (mid - s + 1)) %= mod;
(tr[pr].data = tr[p].c * (t - mid)) %= mod;
(tr[pr].data2 = tr[p].c * tr[p].c % mod * (t - mid)) %= mod;
(tr[pr].data3 = tr[p].c *tr[p].c%mod*tr[p].c % mod * (t - mid)) %= mod;
tr[pl].c = tr[p].c;
tr[pr].c = tr[p].c;
if (tr[p].c != -1) {
tr[pl].add = tr[pr].add = 0;
tr[pl].mul = tr[pr].mul = 1;
}
}
(tr[pl].data *= tr[p].mul)%=mod;
(tr[pl].data2 *= tr[p].mul*tr[p].mul%mod) %= mod;
(tr[pl].data3 *= tr[p].mul*tr[p].mul%mod * tr[p].mul%mod) %= mod;
(tr[pr].data *= tr[p].mul) %= mod;
(tr[pr].data2 *= tr[p].mul * tr[p].mul % mod) %= mod;
(tr[pr].data3 *= tr[p].mul * tr[p].mul % mod * tr[p].mul % mod) %= mod;
(tr[pr].mul *= tr[p].mul)%=mod;
(tr[pl].mul *= tr[p].mul)%=mod;
(tr[pl].data3 += 3*tr[p].add * tr[pl].data2%mod+3*tr[p].add*tr[p].add%mod*tr[pl].data%mod + tr[p].add*tr[p].add%mod*tr[p].add%mod*(mid - s+1)%mod)%=mod;
(tr[pl].data2 += 2 * tr[p].add*(tr[pl].data)%mod+tr[p].add*tr[p].add%mod*(mid - s+1))%=mod;
(tr[pl].data += tr[p].add * (mid - s+1))%=mod;
(tr[pr].data3 += 3*tr[p].add * tr[pr].data2%mod+3*tr[p].add*tr[p].add%mod*tr[pr].data%mod + tr[p].add*tr[p].add%mod*tr[p].add%mod*(t - mid)%mod)%=mod;
(tr[pr].data2 += 2 * tr[p].add*(tr[pr].data)%mod+tr[p].add*tr[p].add%mod*(t - mid))%=mod;
(tr[pr].data += tr[p].add * (t - mid))%=mod;
(tr[pl].add *= tr[p].mul)%=mod;
(tr[pr].add *= tr[p].mul)%=mod;
(tr[pl].add += tr[p].add)%=mod;
(tr[pr].add += tr[p].add)%=mod;
tr[p].mul = 1;
tr[p].add = 0;
tr[p].c = -1;
}
inline void add(ll s, ll t, ll l, ll r, ll p, ll c) {
if (s >= l &&t <= r) {
(tr[p].add+=c)%=mod;
(tr[p].data3 += 3*c*tr[p].data2%mod+3*tr[p].data*c%mod*c%mod+c*c%mod*c%mod* ( t - s + 1)%mod) %= mod;
(tr[p].data2 += 2*c%mod * tr[p].data % mod + c * c % mod * (t - s + 1)%mod) %= mod;
(tr[p].data += c * ( t - s + 1)) %= mod;
return;
}
pushdown(s, t, p);
ll mid = (s + t) >> 1;
if (l <= mid)add(s, mid, l, r, pl, c);
if (r >= mid + 1)add(mid + 1, t, l, r, pr, c);
pushup(p);
}
inline void mul(ll s, ll t, ll l, ll r, ll p, ll c) {
if (s >= l && t <= r) {
(tr[p].mul *= c)%=mod;
(tr[p].add *= c)%=mod;
(tr[p].data *= c)%=mod;
(tr[p].data2 *= c*c%mod)%=mod;
(tr[p].data3 *= c*c%mod*c%mod)%=mod;
return;
}
pushdown(s, t, p);
ll mid = (s + t) >> 1;
if (l <= mid)mul(s, mid, l, r, pl, c);
if (r >= mid + 1)mul(mid + 1, t, l, r,pr, c );
pushup(p);
}
inline void change(ll s, ll t, ll l, ll r, ll p, ll c) {
if (s >= l && t <= r) {
tr[p].c = c;
tr[p].add = 0;
tr[p].mul = 1;
(tr[p].data = c*(t-s+1))%=mod;
(tr[p].data2 = c*c%mod*(t-s+1))%=mod;
(tr[p].data3 = c*c%mod*c%mod*(t-s+1)%mod)%=mod;
return;
}
pushdown(s, t, p);
ll mid = (s + t ) >> 1;
if (l <= mid)change(s, mid, l ,r, pl, c);
if (r > mid)change(mid + 1, t, l, r, pr, c);
pushup(p);
}
inline ll query(ll s, ll t, ll l, ll r, ll p, ll c) {
ll mid = (s + t >> 1);
pushdown(s, t, p);
if (s >= l && t <= r) {
if (c == 1)
return tr[p].data;
if(c == 2)return tr[p].data2;
if (c == 3)return tr[p].data3;
}
ll ret = 0;
if (l <= mid) (ret += query(s, mid, l, r, pl, c))%=mod;
if (r > mid) (ret += query(mid + 1, t, l, r, pr, c))%=mod;
return ret;
}
inline void build(ll s, ll t, ll p) {
tr[p].add = tr[p].data = tr[p].data2 = tr[p].data3 = 0;
tr[p].c = -1;
tr[p].mul = 1;
if (s == t) {
tr[p].data = 0;
return;
}
ll mid = s+ t>>1;
build(s, mid, pl);
build(mid + 1, t, pr);
pushup(p);
return;
}
}T;
int main() {
ll n, m;
ios::sync_with_stdio(0);
while (cin >> n >> m) {
if (n == 0 && m == 0)break;
memset(T.tr, 0, sizeof T.tr);
T.build(1, n, 1);
while (m--) {
ll opt;cin >> opt;
ll x, y, c;
cin >> x >> y >> c;
if (opt == 1)
T.add(1, n, x, y, 1, c%mod);
if (opt == 2)
T.mul(1, n, x, y, 1, c%mod);
if (opt == 3)
T.change(1, n, x, y, 1, c%mod);
if (opt == 4)
cout << T.query(1, n, x, y, 1, c) <<'\n';
}
}
return 0;
}
标签:pr,HDU,ll,tr,mid,add,4578,Transformation,mod 来源: https://www.cnblogs.com/Xiao-yan/p/14157025.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。