前缀与差分

作业介绍

/*
sum[i][j]从1,1到i,j组成的矩形的和
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]+a[i][j]

r*c 的区域
ans[i][j]以ij点结尾的r*c的区域的和
ans[i][j] = sum[i][j]-sum[i-r][j]-sum[i][j-c]+sum[i-r][j-c]

*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,c,a[1005][1005];
int sum[1005][1005],res=-1e18;
signed main(){
	cin>>n>>m>>c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
		}
	}
	int idx,idy;
	for(int i=c;i<=n;i++){
		for(int j=c;j<=m;j++){
			int T = sum[i][j]-sum[i-c][j]-sum[i][j-c]+sum[i-c][j-c];
			if(T>res){
				idx=i-c+1;
				idy=j-c+1;
				res = T;
			}
		}
	}
	cout<<idx<<" "<<idy<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5005;
int a[N][N];
int n,m,sum[N][N];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x,y,z;
		cin>>x>>y>>z;
		x++;y++;
		a[x][y] += z;
	}
	for(int i=1;i<=5001;i++){
		for(int j=1;j<=5001;j++){
			sum[i][j] = a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
		}
	}
	int res = 0;
	for(int i=m;i<=5001;i++){
		for(int j=m;j<=5001;j++){
			res = max(res,sum[i][j]-sum[i-m][j]-sum[i][j-m]+sum[i-m][j-m]);
		}
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6+5;
int n,p,a[N],b[N];
int main(){
	cin>>n>>p;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i] = a[i] - a[i-1];
	}
	for(int i=1;i<=p;i++){
		int x,y,z;
		cin>>x>>y>>z;
		b[x]+=z;
		b[y+1]-=z;
	}
	int res = 1e9;
	for(int i=1;i<=n;i++){
		b[i]+=b[i-1];
		res = min(res,b[i]);
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
#define int long long
int n,m,p[N],a[N];
int A[N],B[N],C[N];
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>p[i];
	}
	for(int i=2;i<=n;i++){
		cin>>A[i]>>B[i]>>C[i];
	}
	for(int i=2;i<=m;i++){
		//从p[i-1]到p[i]
		int x = p[i-1],y=p[i];
		if(x>y)swap(x,y);
		a[x+1]++;
		a[y+1]--;
	}
	int cost = 0;
	for(int i=2;i<=n;i++){
		a[i]+=a[i-1];
		if(a[i]*A[i]>C[i]+a[i]*B[i]){
			cost+=C[i]+a[i]*B[i];
		}
		else cost+=a[i]*A[i];
	}
	cout<<cost<<endl;
	return 0;
}
/*
k个任务无法完成,k+1个任务无法完成 
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
#define int long long
int n,a[N],m,b[N];
struct node{
	int d,s,t;
}p[N];
int check(int x)
{
	//只想尝试前x个任务
	memset(b,0,sizeof(b));
	for(int i=1;i<=x;i++){
		b[p[i].s]+=p[i].d;
		b[p[i].t+1]-=p[i].d;
	}
	for(int i=1;i<=n;i++){
		b[i]+=b[i-1];
		if(b[i]>a[i]){
			return 0;
		}
	}
	return 1;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>p[i].d>>p[i].s>>p[i].t;
	}
	int l=0,r=m;
	int res = -1;
	while(l<=r){
		int mid = (l+r)>>1;
		if(check(mid)){
			res = mid;
			l = mid+1;
		}
		else r = mid-1;
	}
	if(res==m)cout<<0<<endl;
	else{
		cout<<-1<<endl;
		cout<<res+1<<endl;
	}
	//cout<<res<<endl;
	return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
11
开始时间
2026-4-12 0:00
截止时间
2026-4-20 23:59
可延期
24 小时