csp20-12-5星际旅游--0分待拯救版

我不知道为什么这道题我一分也没有,我利用了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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值