第一题(U69096 前缀和的逆):
AC:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n+5]={0};
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cout<<a[i]-a[i-1]<<" ";
return 0;
}
第二题(P3397 地毯):
AC:
#include<bits/stdc++.h>
using namespace std;
int a[1001][1001],m,n;
int main(){
cin>>n>>m;
int b,c,d,e;
for(int i=1;i<=m;i++){
cin>>b>>c>>d>>e;
for(int j=b;j<=d;j++){
for(int k=c;k<=e;k++){
a[j][k]++;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
第三题(P2367 语文成绩)
AC:
#include<bits/stdc++.h>
using namespace std;
int d[5000001];
int a[5000001];
int main(){
int n,p,x,y,z,min=1e9;
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
d[i]=a[i]-a[i-1];
}
for(int i=0;i<p;i++){
cin>>x>>y>>z;
d[x]+=z;
d[y+1]-=z;
}
for(int i=1;i<=n;i++){
a[i]=a[i-1]+d[i];
if(min>a[i]){
min=a[i];
}
}
cout<<min;
return 0;
}
第四题(P1387 最大正方形)
AC:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[101][101],f[101][101]={0},ans=0;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0)continue;
f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f[i][j]>ans){
ans=f[i][j];
}
}
}
cout<<ans<<endl;
return 0;
}
第五题(P2280 [HNOI2003] 激光炸弹)
AC:
#include<bits/stdc++.h>
using namespace std;
int n,m,s[5010][5010];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int x,y,v;
cin>>x>>y>>v;
s[x+1][y+1]+=v;
}
int b=5001;
for(int i=1;i<=b;i++){
for(int j=1;j<=b;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];
}
}
int ans=0;
for(int i=m;i<=b;i++){
for(int j=m;j<=b;j++){
int num=s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m];
ans=max(ans,num);
}
}cout<<ans<<endl;
return 0;
}
第六题(P2697 宝石串)
AC:
#include<bits/stdc++.h>
using namespace std;
char a[1000001];
int red[1000001],ans;
int main(){
scanf("%s",&a);
for(int i=0;i<strlen(a);i++){
red[i+1]=red[i];
if(a[i]=='R'){
red[i+1]++;
}
}
int len;
for(int i=1;i<=strlen(a);i++){
for(int j=i+1;j<=strlen(a);j+=2){
len=j-i+1;
if(red[j]-red[i-1]==(len/2)){
ans=max(ans,len);
}
}
}
printf("%d\n",ans);
return 0;
}
好了,到这里就结束了。