列表

详情


NC247480. Karashi的数组 I

描述

给定一个数组,和一个正整数, 假设一段区间的区间和为S(l,r),即
Karashi每天会修改数组中的一个数字,修改完后,Karashi总是缠着你询问:
  • 定义区间
  • 询问有多少个正整数,满足

(对于区间),区间交,区间并



输入描述

第一行包括三个正整数
第二行包括个正整数,表示数组,第个数
接下去行,第行包括两个正整数,表示第天Karashi将的值改为

输出描述

输出行,第行包括一个正整数,代表第天满足条件的的数量。

示例1

输入:

5 5 1
0 3 2 4 0
3 0
4 0
3 2
2 0
1 5

输出:

2
3
3
3
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 2761ms, 内存消耗: 78312K, 提交时间: 2023-01-03 21:04:18

n,m,len=map(int,input().split())
li=list(map(int,input().split()))+[range(n+6)]
ans=0
for i in range(n-len-1):
    if li[i]==0 or li[i+len+1]==0:
        ans+=1
for i in range(m):
    a,b=map(int,input().split())
    a-=1
    if li[a]==b:
        pass
    if li[a]==0:
        if a>=len+1 and li[a-len-1]!=0:
            ans-=1
        if a+len+1<n and li[a+len+1]!=0:
            ans-=1
    if b!=0:
        pass
    else:
        if a>=len+1 and li[a-len-1]!=0:
            ans+=1
        if a+len+1<n and li[len+a+1]!=0:
            ans+=1
    li[a]=b
    print(ans)

C++(g++ 7.5.0) 解法, 执行用时: 276ms, 内存消耗: 7816K, 提交时间: 2022-12-31 09:39:43

#include<bits/stdc++.h>
#define N 500010
using namespace std;
int n,m,k,ans;
long long a[N];

void go(int p,int v){
	if (p-k-1>0 && a[p-k-1]*a[p]==0) ans--;
	if (p+k+1<=n && a[p+k+1]*a[p]==0) ans--;
	a[p]=v;
	if (p-k-1>0 && a[p-k-1]*a[p]==0) ans++;
	if (p+k+1<=n && a[p+k+1]*a[p]==0) ans++;

}

int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m>>k;
	memset(a,-1,sizeof a);
	for(int i=1;i<=n;i++) {
		int x;
		cin>>x;
		go(i, x);
	}
	while(m--){
		int p, v;
		cin>>p>>v;
		go(p, v);
		cout<<ans<<'\n';
	}
}


C++(clang++ 11.0.1) 解法, 执行用时: 1726ms, 内存消耗: 14972K, 提交时间: 2022-12-31 23:39:53

#include<bits/stdc++.h>
using namespace std;
int a[500500],b[500500];
int main()
{
	int n,m,len,sum=0;
	cin>>n>>m>>len;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=len+2;i<=n;i++)
	{
		if(a[i]==0||a[i-len-1]==0) sum++;
	}
	while(m--)
	{
		
		int x,y,k;
		cin>>x>>y;
		k=a[x];
		a[x]=y;
		if(k==0&&y!=0) 
		{
			if(x>=len+2&&a[x-len-1]!=0) sum--;
			if(x<=n-len-1&&a[x+len+1]!=0) sum--;
		}
		else if(k!=0&&y==0)
		{
			if(x>=len+2&&a[x-len-1]!=0) sum++;
			if(x<=n-len-1&&a[x+len+1]!=0) sum++;
		}
		cout<<sum<<endl;
	}
}

上一题