社区讨论

分块样例全过20分球跳玄关

P6357[COCI 2007/2008 #3] REDOKS参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mj1ezfln
此快照首次捕获于
2025/12/11 20:28
2 个月前
此快照最后确认于
2025/12/13 19:40
2 个月前
查看原帖
rt,悬关
CPP
#include <bits/stdc++.h>
using namespace std;
struct fk {
	int l,r,add;
	int a[10];
	int m[505];
} k[505];
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
void write(int x) {
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
}
int x,y;
int B=500;
string a;
int m[250005];
int main() {
	x=read();
	y=read();
	cin>>a;
	for(int i=0; i<a.size(); i++) m[i+1]=a[i]-'0';
	for(int i=1; i<=B; i++) {
		k[i].l=((i-1)*B)+1;
		k[i].r=i*B;
		k[i].add=0;
		for(int j=1; j<=B; j++) {
			if(k[i].l+j-1<=x) {
				k[i].m[j]=m[k[i].l+j-1];
				k[i].a[k[i].m[j]]++;
			}
		}
	}
	for(int i=1;i<=y;i++){
		int l=read(),r=read();
		int ans=0;
		for(int j=1;j<=B;j++){
			if(k[j].r<l||k[j].l>r) continue;
			else if(l<=k[j].l&&r>=k[j].r){
				for(int h=0;h<=9;h++){
					ans+=k[j].a[h]*((h+k[j].add)%10);
				}
				k[j].add++;
			}
			else{
				for(int h=1;h<=B;h++){
					if(k[j].l+h-1<=x){
						k[j].m[h]+=k[j].add;
						k[j].m[h]%=10;
					}	
					if(k[j].l+h-1<=r&&k[j].l+h-1>=l) ans+=k[j].m[h];
				}
				for(int h=1;h<=B;h++){
					if(k[j].l+h-1<=r&&k[j].l+h-1>=l){
						k[j].m[h]++;
						k[j].m[h]%=10;
					}
				}
				for(int h=0;h<=9;h++) k[j].a[h]=0;			
				for(int h=1;h<=B;h++){
					if(k[j].l+h-1<=x){
						k[j].a[k[j].m[h]]++;
					}	
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...