建议升蓝

P2216 [HAOI2007] 理想的正方形

@[hnxxwpf](/user/700122) RMQ:你好
by 菜のcrzOvO @ 2024-04-06 19:39:06


单调队列可能是绿蓝,但RMQ绝对是黄或水绿
by 菜のcrzOvO @ 2024-04-06 19:39:44


顶天绿这种,甚至还没有qwq
by Genius_Star @ 2024-04-06 19:39:59


A+B 大部分写法思维难度较大,且难度巨大,并且需注意许多细节,建议升黑。
by _Ad_Astra_ @ 2024-04-06 19:40:53


我独立做不出这个题,支持楼主捏 qwq
by sqrtDataStructure @ 2024-04-06 19:41:22


@[hnxxwpf](/user/700122) 这思维大?码量大?感觉挺一眼的
by xiaoxiaoyyds @ 2024-04-06 19:43:11


@[xiaoxiaoyyds](/user/793036) 你好强%%%%%
by sqrtDataStructure @ 2024-04-06 19:44:00


@[xiaoxiaoyyds](/user/793036) ``` #include<iostream> #include<list> using namespace std; int a,b,k,g[1001][1001],ax1[1001][1001],ax2[1001][1001],in1[1001][1001],in2[1001][1001],ans = 0x3f3f3f3f; list<int> xax,xin,yax,yin; int main(){ scanf("%d%d%d",&a,&b,&k); for(int i = 1;i <= a;++i){ for(int j = 1;j <= b;++j){ scanf("%d",&g[i][j]); if(!xax.empty() && xax.front()<j-k+1) xax.pop_front(); while(!xax.empty() && g[i][xax.back()]<=g[i][j]) xax.pop_back(); xax.push_back(j); if(!xin.empty() && xin.front()<j-k+1) xin.pop_front(); while(!xin.empty() && g[i][xin.back()]>=g[i][j]) xin.pop_back(); xin.push_back(j); if(j >= k){ ax1[i][j-k+1] = g[i][xax.front()]; in1[i][j-k+1] = g[i][xin.front()]; } } xax.clear(); xin.clear(); } for(int i = 1;i <= b-k+1;++i){ for(int j = 1;j <= a;++j){ if(!yax.empty() && yax.front()<j-k+1) yax.pop_front(); while(!yax.empty() && ax1[j][i]>=ax1[yax.back()][i]) yax.pop_back(); yax.push_back(j); if(!yin.empty() && yin.front()<j-k+1) yin.pop_front(); while(!yin.empty() && in1[j][i]<=in1[yin.back()][i]) yin.pop_back(); yin.push_back(j); if(j >= k){ ax2[j-k+1][i] = ax1[yax.front()][i]; in2[j-k+1][i] = in1[yin.front()][i]; } } yax.clear(); yin.clear(); } for(int i = 1;i <= a-k+1;++i) for(int j = 1;j <= b-k+1;++j) ans = min(ans,ax2[i][j] - in2[i][j]); printf("%d",ans); return 0; } ``` 你管这叫码量小
by hnxxwpf @ 2024-04-06 19:45:57


@[xiaoxiaoyyds](/user/793036) ``` #include<iostream> #include<list> using namespace std; int a,b,k,g[1001][1001],ax1[1001][1001],ax2[1001][1001],in1[1001][1001],in2[1001][1001],ans = 0x3f3f3f3f; list<int> xax,xin,yax,yin; int main(){ scanf("%d%d%d",&a,&b,&k); for(int i = 1;i <= a;++i){ for(int j = 1;j <= b;++j){ scanf("%d",&g[i][j]); if(!xax.empty() && xax.front()<j-k+1) xax.pop_front(); while(!xax.empty() && g[i][xax.back()]<=g[i][j]) xax.pop_back(); xax.push_back(j); if(!xin.empty() && xin.front()<j-k+1) xin.pop_front(); while(!xin.empty() && g[i][xin.back()]>=g[i][j]) xin.pop_back(); xin.push_back(j); if(j >= k){ ax1[i][j-k+1] = g[i][xax.front()]; in1[i][j-k+1] = g[i][xin.front()]; } } xax.clear(); xin.clear(); } for(int i = 1;i <= b-k+1;++i){ for(int j = 1;j <= a;++j){ if(!yax.empty() && yax.front()<j-k+1) yax.pop_front(); while(!yax.empty() && ax1[j][i]>=ax1[yax.back()][i]) yax.pop_back(); yax.push_back(j); if(!yin.empty() && yin.front()<j-k+1) yin.pop_front(); while(!yin.empty() && in1[j][i]<=in1[yin.back()][i]) yin.pop_back(); yin.push_back(j); if(j >= k){ ax2[j-k+1][i] = ax1[yax.front()][i]; in2[j-k+1][i] = in1[yin.front()][i]; } } yax.clear(); yin.clear(); } for(int i = 1;i <= a-k+1;++i) for(int j = 1;j <= b-k+1;++j) ans = min(ans,ax2[i][j] - in2[i][j]); printf("%d",ans); return 0; } ``` 你管这叫码量小?!
by hnxxwpf @ 2024-04-06 19:46:40


我是用二维 ST 表做的,感觉还是有点难度的 qwq ```cpp #include <bits/stdc++.h> #define _rep(i_,a_,b_) for(int i_ = a_;i_ <= b_;++i_) int in(void) { int x; scanf("%d",&x); return x; } typedef long long ll; using namespace std; const int kN = 1005; int st[11][kN][kN],lg[kN],ans[kN][kN],A[kN][kN]; int a=in(),b=in(),n=in(); typedef int func_t(int,int); int query(int x,int y,func_t fuc) { int _ = lg[n],endx = x + n - 1,endy = y + n - 1; return fuc(fuc(st[_][x][y],st[_][endx - (1 << _) + 1][y]),fuc(st[_][x][endy - (1 << _) + 1],st[_][endx - (1 << _) + 1][endy - (1 << _) + 1])); } void init_st(func_t fuc) { _rep(i,1,a) _rep(j,1,b) st[0][i][j] = A[i][j]; _rep(sz,1,10) for(int i = 1;i + (1 << sz) - 1 <= a; ++i) for(int j = 1;j + (1 << sz) - 1 <= b;++j) { #define L (1 << (sz - 1)) st[sz][i][j] = fuc(st[sz-1][i][j],st[sz-1][i + L][j]); st[sz][i][j] = fuc(st[sz][i][j],fuc(st[sz-1][i][j + L],st[sz-1][i + L][j + L])); } } int Min(int a,int b) { return min(a,b); } int Max(int a,int b) { return max(a,b); } int main() { _rep(i,1,a) _rep(j,1,b) A[i][j] = in(); _rep(i,2,kN - 1) lg[i] = lg[i >> 1] + 1; init_st(Min); for(int i = 1;i + n - 1 <= a;++i) for(int j = 1;j + n - 1 <= b;++j) ans[i][j] = query(i,j,Min); init_st(Max); int anss = 0x7fffffff; for(int i = 1;i + n - 1 <= a;++i) for(int j = 1;j + n - 1 <= b;++j) anss = min(anss,query(i,j,Max) - ans[i][j]); printf("%d\n",anss); return 0; } ```
by sqrtDataStructure @ 2024-04-06 19:48:16


| 下一页