救命!全RE!
  • 板块灌水区
  • 楼主wsy_I
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/18 20:19
  • 上次更新2024/7/18 21:16:29
查看原帖
救命!全RE!
1152799
wsy_I楼主2024/7/18 20:19

C.能源 energy.cpp

题目描述

新任市长ChihiroChihiro给IntrolIntrol传真了当地行政规划图,其用长度为NN字符串SS表示,其中00和11分别表示空地和城区。

定义xix_i和xjx_j的φφ距离为∣xi−xj∣+1\lvert x_i-x_j \rvert+1。

IntrolIntrol规划在空地和城区分别建设风车和光伏发电板,对于一处空地其每天能获取的风能为Ewind2E_{wind}^2,对于一处城区其每天能获取的光能为Esolar3E_{solar}^3。

最大的EwindE_{wind}满足到该空地的φφ距离不超过最大的EwindE_ {wind}的地方在行政规划片区内且为空地。

最大的EsolarE_ {solar}满足到该城区的φφ距离不超过最大的EsolarE_ {solar}的地方在行政规划片区内且为城区。

ChihiroChihiro将提出MM次询问,对于片区[L,R][L,R]每天共能获取多少能源,答案对1e9+71e9+7取模。

输入格式

第一行两个整数NN和MM,分别表示字符串SS的长度和询问次数。

第二行仅一个字符串SS。

接下来MM行,每行给出L,RL,R表示一组询问。

输出格式

输出共有MM行,每行一个整数,表示对应的询问的答案。

样例 #1

样例输入 #1

5 2
11100
1 3
4 5

样例输出 #1

10
2

提示

样例1解释

当地所有片区能获得的能源分别为:1,8,1,1,11,8,1,1,1​。

对于片区[1,3][1,3]能获得的能源为1+8+1=101+8+1=10​。

对于片区[4,5][4,5]能获得的能源为1+1=21+1=2。

数据范围

对于3030%的数据,1≤N,M≤1031 \leq N,M \leq 10^3。

对于另外2020%的数据,SS仅包含00。

对于100100%的数据,1≤L≤R≤N,M≤1061 \leq L \leq R \leq N,M \leq10^6

我的解法:

#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;
}
2024/7/18 20:19
加载中...