I love max and multiply
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1000010;
const int mod=998244353;
int T,n;
LL a[N],b[N];
LL mxA[N],mxB[N];
LL mnA[N],mnB[N];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lld",&a[i]);
for(int i=0;i<n;i++) scanf("%lld",&b[i]);
LL res=0;
LL maxn=-2e18;
for(int i=n-1;i>=0;i--){
mxA[i]=mnA[i]=a[i];
mxB[i]=mnB[i]=b[i];
for(int j=0;j<=18;j++){
if(((i>>j)&1)==0){
int x=i+(1<<j);
if(x<n){
mxA[i]=max(mxA[i],mxA[x]);
mnA[i]=min(mnA[i],mnA[x]);
mxB[i]=max(mxB[i],mxB[x]);
mnB[i]=min(mnB[i],mnB[x]);
}
}
}
maxn=max(maxn,max(mxA[i]*mxB[i],mxA[i]*mnB[i]));
maxn=max(maxn,mnA[i]*mxB[i]);
maxn=max(maxn,mnA[i]*mnB[i]);
res=(res+maxn)%mod;
}
res=(res+mod)%mod;
printf("%lld\n",res);
}
}I love exam
#include<iostream>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
const int N=510;
struct node{
int x,y;
};
int T;
int n,m,t,p;
int f[N];
int dp[N][5],tmp[N][5];
map<string,int> mp;
vector<node> a[55];
int main(){
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
cin>>n;
string s;
mp.clear();
for(int i=1;i<=n;i++){
cin>>s;
mp[s]=i;
a[i].clear();
}
cin>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>s>>x>>y;
int id=mp[s];
a[id].push_back({x,y});
}
cin>>t>>p;
p=min(n,p);
memset(dp,-1,sizeof dp);
dp[0][0]=0;
for(int i=1;i<=n;i++){
memset(f,0,sizeof f);
for(auto q:a[i])
for(int j=t;j>=q.y;j--)
f[j]=max(f[j],min(100,f[j-q.y]+q.x));
memset(tmp,-1,sizeof tmp);
for(int j=0;j<=t;j++)
for(int k=0;k<=p;k++){
if(dp[j][k]==-1) continue;
for(int d=0;d<=t;d++){
int s=k;
if(f[d]<60) s+=1;
if(j+d<=t&&s<=p)
tmp[j+d][s]=max(tmp[j+d][s],dp[j][k]+f[d]);
}
}
for(int j=0;j<=t;j++)
for(int k=0;k<=p;k++)
dp[j][k]=tmp[j][k];
}
int ans=-1;
for(int i=0;i<=t;i++)
for(int j=0;j<=p;j++)
ans=max(ans,dp[i][j]);
printf("%d\n",ans);
}
}
京公网安备 11010502036488号