我不知道为什么这道题我一分也没有,我利用了set来存储区间信息,当对区间进行处理的时候,快速找到对应的区间范围,然后根据l,r来具体的分割新的区间,更新对应信息。我认为这个方法至少能有几十分吧,但是就是不对,我看了很多别人的题解,有直接遍历每个装置得80分的。这道题需要注意的数据类型范围和取余,我觉得我也注意到了,但是为什么就是0分啊啊,有没有大佬一阵见血的指出我的问题\></,先记录一下自己的失败0分版吧。
//2012-5星际旅行---错误0分版
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long ll;
struct P {
int l;
int r;
ll x, y, z;
P() {}
P(ll l_, ll r_):l(l_), r(r_){}
P(ll l_, ll r_, ll xx, ll yy, ll zz):l(l_), r(r_), x(xx), y(yy), z(zz){
}
bool operator<(const P b) const {
return l<b.l;
}
};
set<P> pp;
ll a, b, c, k;
ll sx, sy, sz;
// 动力增加
void fun1(int l, int r) {
auto itl = pp.upper_bound(P(l,0));
auto itr = pp.upper_bound(P(r,0));
itl--;
vector<set<P>::iterator> wer; // 待删除的区间--只有两边
for(auto it=itl; it!=itr; it++) {
wer.push_back(it);
}
vector<P> win; // 待添加的区间
for(int i=0; i<wer.size(); i++) {
P tt = *wer[i];
pp.erase(tt);
// 判断区间情况
if(tt.l>=l&&tt.r<=r) {
win.push_back(P(tt.l, tt.r, (tt.x+a)%mod, (tt.y+b)%mod, (tt.z+c)%mod));
}
else if(tt.l<l&&tt.r<=r) {
win.push_back(P(tt.l, l-1, tt.x, tt.y, tt.z));
win.push_back(P(l, r, (tt.x+a)%mod, (tt.y+b)%mod, (tt.z+c)%mod));
}
else if(tt.r>r&&tt.l>=l) {
win.push_back(P(r+1, tt.r, tt.x, tt.y, tt.z));
win.push_back(P(tt.l, r, (tt.x+a)%mod, (tt.y+b)%mod, (tt.z+c)%mod));
}
else if(tt.l<l&&tt.r>r){
win.push_back(P(tt.l, l-1, tt.x, tt.y, tt.z));
win.push_back(P(r+1, tt.r, tt.x, tt.y, tt.z));
win.push_back(P(l, r, (tt.x+a)%mod, (tt.y+b)%mod, (tt.z+c)%mod));
}
}
// 填入
for(auto it:win) {
pp.insert(it);
}
}
// 动力强化
void fun2(int l, int r) {
auto itl = pp.upper_bound(P(l,0));
auto itr = pp.upper_bound(P(r,0));
itl--;
vector<set<P>::iterator> wer; // 待删除的区间--只有两边
for(auto it=itl; it!=itr; it++) {
wer.push_back(it);
}
vector<P> win; // 待添加的区间
for(int i=0; i<wer.size(); i++) {
P tt = *wer[i];
pp.erase(tt);
ll x_ = (tt.x*k)%mod, y_ = (tt.y*k)%mod, z_ = (tt.z*k)%mod;
// 判断区间情况
if(tt.l>=l&&tt.r<=r) {
win.push_back(P(tt.l, tt.r, x_, y_, z_));
}
else if(tt.l<l&&tt.r<=r) {
win.push_back(P(tt.l, l-1, tt.x, tt.y, tt.z));
win.push_back(P(l, r, x_, y_, z_));
}
else if(tt.r>r&&tt.l>=l) {
win.push_back(P(r+1, tt.r, tt.x, tt.y, tt.z));
win.push_back(P(tt.l, r, x_, y_, z_));
}
else if(tt.l<l&&tt.r>r){
win.push_back(P(tt.l, l-1, tt.x, tt.y, tt.z));
win.push_back(P(r+1, tt.r, tt.x, tt.y, tt.z));
win.push_back(P(l, r, x_, y_, z_));
}
}
// 填入
for(auto it:win) {
pp.insert(it);
}
}
// 动力转向
void fun3(int l, int r) {
auto itl = pp.upper_bound(P(l,0));
auto itr = pp.upper_bound(P(r,0));
itl--;
vector<set<P>::iterator> wer;
for(auto it=itl; it!=itr; it++) {
wer.push_back(it);
}
vector<P> win; // 待添加的区间
for(int i=0; i<wer.size(); i++) {
P tt = *wer[i];
pp.erase(tt);
ll x_ = tt.y, y_ = tt.z, z_ = tt.x;
// 判断区间情况
if(tt.l>=l&&tt.r<=r) {
win.push_back(P(tt.l, tt.r, x_, y_, z_));
}
else if(tt.l<l&&tt.r<=r) {
win.push_back(P(tt.l, l-1, tt.x, tt.y, tt.z));
win.push_back(P(l, r, x_, y_, z_));
}
else if(tt.r>r&&tt.l>=l) {
win.push_back(P(r+1, tt.r, tt.x, tt.y, tt.z));
win.push_back(P(tt.l, r, x_, y_, z_));
}
else if(tt.l<l&&tt.r>r){
win.push_back(P(tt.l, l-1, tt.x, tt.y, tt.z));
win.push_back(P(r+1, tt.r, tt.x, tt.y, tt.z));
win.push_back(P(l, r, x_, y_, z_));
}
}
// 填入
for(auto it:win) {
pp.insert(it);
}
}
// 动力查询
void fun4(ll l, ll r) {
sx = 0, sy = 0, sz = 0;
auto itl = pp.upper_bound(P(l,0));
auto itr = pp.upper_bound(P(r,0));
itl--;
vector<set<P>::iterator> wer; // 待查询的区间--只有两边
for(auto it=itl; it!=itr; it++) {
wer.push_back(it);
}
for(int i=0; i<wer.size(); i++) {
P tt = *wer[i];
// 判断区间情况
if(tt.l>=l&&tt.r<=r) {
sx += tt.x*(tt.r-tt.l+1)%mod;
sy += tt.y*(tt.r-tt.l+1)%mod;
sz += tt.z*(tt.r-tt.l+1)%mod;
}
else if(tt.l<l&&tt.r<=r) {
sx += tt.x*(tt.r-l+1)%mod;
sy += tt.y*(tt.r-l+1)%mod;
sz += tt.z*(tt.r-l+1)%mod;
}
else if(tt.r>r&&tt.l>=l) {
sx += tt.x*(r-tt.l+1)%mod;
sy += tt.y*(r-tt.l+1)%mod;
sz += tt.z*(r-tt.l+1)%mod;
}
else if(tt.l<l&&tt.r>r){
sx += tt.x*(r-l+1)%mod;
sy += tt.y*(r-l+1)%mod;
sz += tt.z*(r-l+1)%mod;
}
}
ll ans = (((sx%mod)*(sx%mod))%mod + ((sy%mod)*(sy%mod)%mod) + ((sz%mod)*(sz%mod))) %mod;
cout << ans << endl;
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
// 初始化
pp.insert(P(1, n, 0, 0, 0));
int l, r, op;
for(int i=0; i<m; i++) {
cin >> op >> l >> r;
if(op==1) {
cin >> a >> b >> c;
fun1(l, r);
}
else if(op==2) {
cin >> k;
fun2(l, r);
}
else if(op==3) {
fun3(l, r);
}
else {
fun4(l, r);
}
}
return 0;
}