新任市长Chihiro给Introl传真了当地行政规划图,其用长度为N字符串S表示,其中0和1分别表示空地和城区。
定义xi和xj的φ距离为∣xi−xj∣+1。
Introl规划在空地和城区分别建设风车和光伏发电板,对于一处空地其每天能获取的风能为Ewind2,对于一处城区其每天能获取的光能为Esolar3。
最大的Ewind满足到该空地的φ距离不超过最大的Ewind的地方在行政规划片区内且为空地。
最大的Esolar满足到该城区的φ距离不超过最大的Esolar的地方在行政规划片区内且为城区。
Chihiro将提出M次询问,对于片区[L,R]每天共能获取多少能源,答案对1e9+7取模。
第一行两个整数N和M,分别表示字符串S的长度和询问次数。
第二行仅一个字符串S。
接下来M行,每行给出L,R表示一组询问。
输出共有M行,每行一个整数,表示对应的询问的答案。
5 2
11100
1 3
4 5
10
2
当地所有片区能获得的能源分别为:1,8,1,1,1。
对于片区[1,3]能获得的能源为1+8+1=10。
对于片区[4,5]能获得的能源为1+1=2。
对于30%的数据,1≤N,M≤103。
对于另外20%的数据,S仅包含0。
对于100%的数据,1≤L≤R≤N,M≤106
我的解法:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000010];
char s[1000010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m>>s;
for(int i=1;i<=n;i++) a[i]=s[i-1]-'0';
a[n+1]=-1;
for(int i=1;i<=n;i++){
int L=i,R=i;
while(a[R]==a[i]) R++;
R--;
if(L==R){
a[L]=1;
continue;
} else if(R-L==1) {
a[L]=1;
a[R]=1;
continue;
}
for(int j=L;i<=(L+R)/2;j++){
a[j]=j-L+1;
}
for(int j=(L+R)/2+1;j<=R;j++){
a[j]=R-j+1;
}
i=R;
}
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
for(int i=1;i<=n;i++){
if(s[i]=='0') a[i]=(a[i]*a[i])%int(1e9+7);
else a[i]=(a[i]*a[i]*a[i])%int(1e9+7);
}
long long psum[1000010];
psum[1]=a[1];
for(int i=2;i<=n;i++) psum[i]=psum[i-1]+a[i];
for(int i=1;i<=m;i++){
int l,r;
cin>>l>>r;
cout<<psum[r]-psum[l -1];
}
return 0;
}