今天,厚颜无耻的说勉强是自己一个人写出的题吧,其实要是没有左学长的提醒,我估计会在线段树上转一上午。
先上题面:https://ac.nowcoder.com/acm/contest/946/D
大意:给你n个数的数组和m个操作,数组的初始值全部为0,操作的种类只有2种,一种是将数组[l,r]中的数全部加上1,另一种是将操作编号为[l,r]的操作再全部进行一遍。求m次操作后的数组的模样。
首先,看到区间修改,立马联想到线段树,然后又看到对操作进行区间修改,顺着思路就想:线段树套线段树????尼玛,这怕不是要搞死我,我立马和左学长讨论了一下,左学长淡然的说:用差分数组,我愣了下神——卧槽,差分数组,我咋就没想到哩!
然后我就用两个差分数组,一个记录每一个编号的操作次数的差分数组,另一个记录要求数组的值
写完blog才发现,是被标题误导了。。。。。
结果做到最后一步,发现自己没有取模,想了半天才发现的,死菜鸡一枚,确定了
上代码:
#include <bits/stdc++.h>
const int mod=1e9+7;
const int maxn=1e5+7;
using namespace std;
typedef long long ll;
struct opera{
int cnt,l,r;
}opt[maxn];
int n,m;
int tpach[maxn],apach[maxn];
int main()
{
memset(tpach,0,sizeof(tpach));
memset(apach,0,sizeof(apach));
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d %d",&opt[i].cnt,&opt[i].l,&opt[i].r);
}
int t=0;
tpach[m+1]=1,tpach[1]=-1;
for(int i=m;i>=1;i--){
t=(t+tpach[i+1])%mod;//t就是每一次操作进行的次数
if(opt[i].cnt==2){
tpach[opt[i].l]=(tpach[opt[i].l]-t+mod)%mod;
tpach[opt[i].r+1]=(tpach[opt[i].r+1]+t)%mod;
//tpach是记录操作次数的差分数组
}
else{
apach[opt[i].l-1]=(apach[opt[i].l-1]+t)%mod;
apach[opt[i].r]=(apach[opt[i].r]-t+mod)%mod;
//apach是记录数组的差分数组
}
}
int s=0;
for(int i=1;i<=n;i++){
s=(s+apach[i-1])%mod;
printf("%d%c",s,i==n?'\n':' ');
}
return 0;
}
//千万不要忘记取模呀!