codeforces 390c Inna and Candy Boxes

题目链接

题意:

一串由n个0或1组成的数,w次访问,每次访问输入l,r

经过一些操作,使得在第l个到第r个之间,只有在l+k-1,l+2k-1,l+3k-1……的位置是1,其他位置是0

每次操作,只能把1变0或把0变1

求每次访问需要的操作次数


解题思路:

最直接的方法就是先求前缀和,再判断特殊位置有几个1,几个0,然后再加加减减,可是这样会超时

k最大是10,那我们就先预处理一下

这些特殊位置有一个共同的特点,他们对k取余的值是一样的

那就可以再开一个数组b[ i%k ][ i ]预处理前缀和

通过b数组可以很直接的知道0和1的个数


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
#define inf 100005
char s[inf];
int a[inf],b[20][inf];
int main()
{
	int n,k,w;
	scanf("%d%d%d",&n,&k,&w);
	scanf("%s",s+1);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++)
	{
		a[i] = a[i-1]+(s[i]-'0');
		b[i%k][i] = s[i]-'0';
	}
	for(int i=0;i<k;i++)
	{
		for(int j=1;j<=n;j++)
		{
			b[i][j]+=b[i][j-1];
		}
	}
	for(int i=0;i<w;i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		int res = (l-1)%k;
		int ans = a[r]-a[l-1];//l到r之间1的总个数 
		int all = b[res][r]-b[res][l-1];//特殊位置1的个数 
		int sum = (r-l+1)/k-all+ans-all;
		printf("%d\n",sum);
	}	
	return 0;
}



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YHYYXT/article/details/46779275
个人分类: CodeForces
上一篇codeforces 394C Dominoes
下一篇codeforces 390d Inna and Sweet Matrix
想对作者说点什么? 我来说一句

动态规划题解

2013年12月22日 1KB 下载

candy检测(基于opencv)

2013年12月05日 5KB 下载

Codeforces 题库 101-200

2013年04月11日 4.52MB 下载

opencv candy边缘检测 缩放

2014年03月10日 23.1MB 下载

eye candy 4000 Demo

2011年05月21日 962KB 下载

集训队作业

2013年01月14日 214KB 下载

eye candy 4000 settings

2013年05月20日 157KB 下载

没有更多推荐了,返回首页

关闭
关闭