总之就是很寄,很寄。
T1:想出来前缀和了 ,但是没想出来怎么优化,于是心态没了,于是就gg了,后面也没想暴力,我很菜。
T1 可以 dfs mn dp过 nm 二分过 但是我一个没想出来 我很废物
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+7;
int dp[N][N];
int dp1[N][N],dp2[N][N];
int a[N][N];
int sum[N][N];
int qqjh(int y1,int x1,int y2,int x2){
return sum[x2][y2]+sum[x1-1][y1-1]-sum[x1-1][y2]-sum[x2][y1-1];
}
int ans=-1;
int n,m;
//算本身
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
dp1[i][j]=a[i][j]*(dp1[i-1][j]+1);
dp2[i][j]=a[i][j]*(dp2[i][j-1]+1);
}
}
// printf("最多向上延伸:%d 最多向左延伸:%d\n",dp1[4][6],dp2[4][6]);
// printf("最多向上延伸:%d 最多向左延伸:%d\n",dp1[4][6]);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
}
//printf("%d",qqjh(3,2,6,4));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int k = i - dp1[i][j] + 1 , l = j - dp2[i][j] + 1;
int len1=dp1[i][j];
int len2=dp2[i][j];
// int sum1=qqjh(j-len1+1,i-len2+1,j,i);
// int sum2=qqjh(j-len1,i-len2,j+1,i+1);
int sum1=qqjh(l,k,j,i);
int sum2=qqjh(l-1,k-1,j+1,i+1);
if(sum1==sum2&&sum1==(i-k+1)*(j-l+1)) ans=max(ans,len1*len2);
//printf("当前点位置:i:%d j:%d len1:%d len2:%d sum1:%d sum2:%d \n",i,j,len1,len2,sum1,sum2);
}
}
printf("%d",ans);
return 0;
}
后面基本就没咋想了捏,考试的时候切记要打暴力然后想不出来换换脑子,我就是指向了T1然后钻进去了 后面没想出来 疯狂摆 无语了
T2:ST表模板
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int b[N];
int read(){
int tmp;scanf("%d",&tmp);return tmp;
}
int max_[N][21];
int work(int l,int r){
int k=log2(r-l+1);
return min(max_[l][k],max_[r-(1<<k)+1][k]);
}
void dfs(int st,int end){
if(st>end) return;
int ans=work(st,end);
int mid=b[ans];
printf("%d ",mid);
dfs(st,mid-1);
dfs(mid+1,end);
}
int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
int n=read();
for(int i=1;i<=n;i++){
b[i]=read();
max_[b[i]][0]=i;
}
//for(int i=1;i<=n;i++) printf("%d ",max_[i][0]);
for(int j=1;j<=21;j++){
for(int i=1;i+(1<<j)-1<=N;i++){
max_[i][j]=min(max_[i][j-1],max_[i+(1<<(j-1))][j-1]);
}
}
dfs(1,n);
return 0;
}
T3:dp 但我大概想明白了 还差一点 代填坑 思路有了 代码还差点
T4:子序列 其实是可以50pts的 优化可以a[i] 作为下标 开1e6;
T5:不会
T6:删除代码
赋值语句性质:只要后面有赋值,就无效性,因而从后往前枚举 赋值语句
然后 正权值不删除 负权值与堆顶比较同时考虑 是否超出k的限制
最后记得一定要ans赋初值!!!!!否则就会很惨
还要记得代码顺序和逻辑 否则你会只能得一半分
这题要维护一个长度为k-m(就是删除后面赋值语句的次数)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1000010;
struct node{int opt,y;}a[N];
priority_queue<long long> q;
int n,k;
int ans=0,x=-1e15;
signed main(){
scanf("%lld%lld",&n,&k);
a[0].opt=1;
for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].opt,&a[i].y);
for(int i=n;i>=0;i--){
if(a[i].opt==1){
x=max(x,ans+a[i].y);
if(k<=0) break;
k--;
while(q.size()>k){
ans+=q.top();
q.pop();
}
//break;
}
else{
ans+=a[i].y;
if(a[i].y<0){
if(q.size()<k){
q.push(a[i].y);
ans-=a[i].y;
}
else if(k&&q.top()>a[i].y){
ans+=q.top();
q.pop();
ans-=a[i].y;
q.push(a[i].y);
}
}
}
}
printf("%lld",x);
return 0;
}
标签:总结,return,20230308,max,sum,mid,int,ans
From: https://www.cnblogs.com/Zimo233/p/17196659.html