详解可看csdn
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2010;
int n,m;
char g[N][N];
int l[N],r[N],q[N];
int U[N],D[N],L[N],R[N];
int s[N][N];
int cacl(int a[],int n)//单调栈计算最大值
{
int tt = 0;
a[0] = a[n + 1] = -1;
q[0] = 0;
for(int i = 1; i <= n; i ++ )
{
while(a[q[tt]] >= a[i])
tt -- ;
l[i] = q[tt];
q[ ++ tt] = i;
}
tt = 0;
q[0] = n + 1;
for(int i = n; i >= 1; i -- )
{
while(a[q[tt]] >= a[i])
tt --;
r[i] = q[tt];
q[ ++ tt] = i;
}
int res = 0;
for(int i = 1; i <= n; i ++ )
res = max(res,a[i] * (r[i] - l[i] - 1));
return res;
}
void init()
{
for(int i = 1; i <= n; i ++ )
{
for(int j = 1; j <= m; j ++ )
if(g[i][j] == '1')
s[i][j] = s[i -1][j] + 1;
else
s[i][j] = 0;
U[i] = max(U[i - 1],cacl(s[i],m));//上
}
memset(s,0,sizeof(s));//记得重置
for(int i = n; i >= 0; i -- )//下矩形,行倒着枚举
{
for(int j = 1; j <= m; j ++ )
if(g[i][j] == '1')
s[i][j] = s[i + 1][j] + 1;
else
s[i][j] = 0;
D[i] = max(D[i + 1],cacl(s[i],m));//下
}
memset(s,0,sizeof(s));
for(int i = 1; i <= m; i ++ )//相当于把整个矩形旋转九十度
{
for(int j = 1; j <= n; j ++ )
if(g[j][i] == '1')
s[i][j] = s[i - 1][j] + 1;
else
s[i][j] = 0;
L[i] = max(L[i - 1],cacl(s[i],n));//左
}
memset(s,0,sizeof(s));
for(int i = m; i >= 0; i -- )//倒着枚举
{
for(int j = 1; j <= n; j ++ )
if(g[j][i] == '1')
s[i][j] = s[i + 1][j] + 1;
else
s[i][j] = 0;
R[i] = max(R[i + 1],cacl(s[i],n));//右
}
}
int main()
{
cin>>n>>m;
for(int i = 1; i <= n; i ++ )
cin>>g[i] + 1;
init();
int q;
cin>>q;
while(q -- )
{
int x,y;
cin>>x>>y;
x ++,y ++;
cout<<max(max(U[x - 1],D[x + 1]),max(L[y - 1],R[y + 1]))<<endl;//四个矩形最大值取max
}
return 0;
}
水题,代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[210];
unordered_map<int,int>mp;
int main()
{
cin>>n>>m;
for(int i = 1; i <= n; i ++ )
{
cin>>a[i];
mp[a[i]] ++ ;
}
for(int i = 1; i <= n; i ++ )
{
if(mp[a[i]] == 1)
cout<<"BeiJu"<<endl;
else
cout<<mp[a[i]] - 1<<endl;
}
return 0;
}
水题,调了挺久,看了别人的题解感觉简洁很多,还是贴个自己的记录一下。
代码:
#include<bits/stdc++.h>
using namespace std;
void fun(int x)
{
if(x == 0)
{
cout<<0;
return ;
}
bool flag = false;
bitset<20>p(x);
for(int i = 20; i >= 0; i -- )
{
if(p[i] == 1)
{
if(i != 1)
{
if(!flag)
{
cout<<"2(";
fun(i);
cout<<")";
flag = true;
}
else
{
cout<<"+2(";
fun(i);
cout<<")";
}
}
else
{
if(!flag)
{
cout<<2;
flag = true;
}
else
cout<<"+2";
}
}
}
}
int main()
{
int n;
while(cin>>n)
{
fun(n);
cout<<endl;
}
return 0;
}
还是水题,代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int t,n,k;
char s[N];
int main()
{
cin>>t;
for(int x = 1; x <= t; x ++ )
{
cin>>n>>k;
cin>>s + 1;
int i = 1, j = n,num = 0;
while(i < j)
{
if(s[i] != s[j])
num ++;
i ++, j -- ;
}
cout<<"Case #"<<x<<": "<<abs(num - k)<<endl;
}
return 0;
}