I-时空的交织
原题链接:I-时空的交织_2024牛客寒假算法基础集训营6 (nowcoder.com)
知识点:贪心
题意:
思路:
假设子矩阵从r1~r10,c1~c10,那么这个区间的和为(r1+……+r10)*(c1+……+c10);
又因为存在负数,所以可能负负得正,所有要分别求出行和列最大和最小的连续子区间和。
再将四个数两两相乘取最大值。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n,m;
cin>>n>>m;
int a[n+1],b[m+1];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
cin>>b[i];
int minr=INT_MAX,maxr=INT_MIN;
int minc=INT_MAX,maxc=INT_MIN;
int sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
if(sum1+a[i]>=0)
{
sum1+=a[i];
maxr=max(sum1,maxr);
}
else
{
sum1=0;
maxr=max(maxr,a[i]);
}
if(sum2+a[i]<=0)
{
sum2+=a[i];
minr=min(sum2,minr);
}
else
{
sum2=0;
minr=min(minr,a[i]);
}
}
int num1=0,num2=0;
for(int i=1;i<=m;i++)
{
if(num1+b[i]>=0)
{
num1+=b[i];
maxc=max(num1,maxc);
}
else
{
num1=0;
maxc=max(maxc,b[i]);
}
if(num2+b[i]<=0)
{
num2+=b[i];
minc=min(num2,minc);
}
else
{
num2=0;
minc=min(minc,b[i]);
}
}
int x=INT_MIN;
x=max(maxr*maxc,x);
x=max(minr*minc,x);
x=max(maxr*minc,x);
x=max(minr*maxc,x);
cout<<x<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
t=1;
while(t--){
solve();
}
return 0;
}
j - 绝妙的平衡
原题链接:J-绝妙的平衡_2024牛客寒假算法基础集训营6 (nowcoder.com)
题意:
思路:
首先按照父亲节点构建好树,首先判断是否存在子树全为染色节点,若全子树都被染色,因为节点权值只能是1 or 2,所以总会有非的倍数的子树存在,所以先深搜遍历全树,如果存在子树的根节点为红色,且子树全为红的子树,则输出-1;若不存在则继续下一步。
其次再次深搜遍历树,给所有的节点初始值设为1,深搜计算子树的权值和sum,如果sum%3==2,则把子树的红色根节点改为2;如果sum%3==1,则将子树红色根节点改为2,再遍历其叶子节点,找到一个未染色节点并改为2即可,然后将sum改为3的倍数,以免对深搜造成影响。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e6+10;
vector<int> g[N];
int a[N];
string s;
int n,flag;
void dfs1(int num)
{
int ans=0;
for(auto x : g[num])
{
if(s[x] == 'W')
ans++;
dfs1(x);
}
if(ans==0 && s[num]=='R')
flag=1;
}
int dfs2(int now)
{
a[now]=1;
int sum=a[now];
for(auto x : g[now])
{
sum+=dfs2(x);
}
if(s[now] == 'R')
{
if(sum%3==2)
a[now]=2;
else if(sum%3==1)
{
a[now]=2;
for(auto x : g[now])
{
if(s[x]=='W')
{
a[x]=2;
break;
}
}
}
sum=3;
}
return sum;
}
void solve() {
cin>>n;
cin>>s;
s=" "+s;
for(int i=2;i<=n;i++)
{
int u;
cin>>u;
g[u].push_back(i);
}
dfs1(1);
if(flag)
{
cout<<-1<<endl;
return ;
}
dfs2(1);
for(int i=1;i<=n;i++)
{
cout<<a[i];
}
cout<<endl;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
t=1;
while (t--) {
solve();
}
return 0;
}