作业介绍

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5,Mod=1e9+7;
int n;
string s;
int f[N][3];
signed main(){
	cin>>n;
	cin>>s;
	int power = 1;
	for(int i=1;i<=s.size();i++){
		if(s[i-1]=='?'){
			f[i][0] = (3*f[i-1][0]%Mod+power)%Mod;
			f[i][1] = (3*f[i-1][1]%Mod+f[i-1][0])%Mod;
			f[i][2] = (3*f[i-1][2]%Mod+f[i-1][1])%Mod;
			power=power*3%Mod;
		}
		else{
			f[i][0] = f[i-1][0];
			f[i][1] = f[i-1][1];
			f[i][2] = f[i-1][2];
			if(s[i-1]=='a')f[i][0]+=power,f[i][0]%=Mod;
			if(s[i-1]=='b')f[i][1]+=f[i-1][0],f[i][1]%=Mod;
			if(s[i-1]=='c')f[i][2]+=f[i-1][1],f[i][2]%=Mod;
		}
	}
	cout<<f[s.size()][2]<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5,Mod=998244353;
int n,k,f[2][N],g[N],sum[N];
signed main(){
	cin>>n>>k;
	int pos = 0;
	for(int i=k;i<=n;i+=k){
		f[pos][i] = 1;
		g[i] = f[pos][i];
	}
	for(int j=2;j<=700;j++){
		if(j>n)break;
		for(int i=0;i<=n;i++){
			if(i>=(k+j-1))sum[i]=sum[i-k-j+1]+f[pos][i];
			else sum[i] = f[pos][i];
			sum[i]%=Mod;
		}
		pos^=1;
		for(int i=0;i<=n;i++){
			if(i>=k+j-1){
				f[pos][i]+=sum[i-k-j+1];
			}
			g[i]+=f[pos][i];g[i]%=Mod;
		}
		memset(sum,0,sizeof(sum));
		memset(f[pos^1],0,sizeof(f[pos^1]));
	}
	for(int i=1;i<=n;i++){
		cout<<g[i]%Mod<<" ";
	}
	return 0;
}
//f[x][i]第i轮干掉x,他的子树一共造成的伤害
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5+5;
int T,n,a[N],f[N][21];
vector<int>e[N];
void dfs(int x,int fa){
	for(int i=1;i<=20;i++)f[x][i] = a[x]*i;
	for(auto v:e[x]){
		if(v==fa)continue;
		dfs(v,x);
		for(int i=1;i<=20;i++){
			int res =1e18;
			for(int j=1;j<=20;j++){
				if(j==i)continue;
				res = min(res,f[v][j]);
			}
			f[x][i]+=res;
		}
	}
}
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++){
			e[i].clear();
			cin>>a[i];
		}
		for(int i=1;i<n;i++){
			int x,y;
			cin>>x>>y;
			e[x].push_back(y);
			e[y].push_back(x);
		}
		dfs(1,0);
		int res = 1e18;
		for(int i=1;i<=20;i++){
			res = min(res,f[1][i]);
		}
		cout<<res<<endl;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e7+5;
int n,x,y;
int f[N],q[N],tail=-1,head=0;
signed main(){
	cin>>n>>x>>y;
	f[1] = x;
	//f[i] = min(f[j]+2*j*x)+y-i*x     i/2<=j<i
	for(int i=2;i<=n;i++){
		while(tail>=head && f[i-1]+2*(i-1)*x<=f[q[tail]]+2*q[tail]*x)tail--;
		q[++tail] = i-1;
		while(tail>=head && q[head]<i/2.0)head++;
		int j = q[head];
		f[i] = min(f[j]+2*j*x+y-i*x,f[i-1]+x);
	}
	cout<<f[n]<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
//f[60][x][y] a/2^x b/2^y的最小代价
int f[61][61][61],s[61];
int T,x,y;
signed main(){
	s[0] = 1;
	for(int i=1;i<=60;i++){
		s[i] = s[i-1]*2;
	}
	memset(f,0x3f,sizeof(f));
	for(int i=0;i<=60;i++)f[i][0][0] = 0;
	for(int i=1;i<=60;i++){
		for(int j=0;j<=60;j++){
			for(int k=0;k<=60;k++){
				f[i][j][k] = f[i-1][j][k];
				if(j>=i)f[i][j][k] = min(f[i][j][k],f[i-1][j-i][k]+s[i]);
				if(k>=i)f[i][j][k] = min(f[i][j][k],f[i-1][j][k-i]+s[i]);
			}
		}
	}
	cin>>T;
	while(T--){
		cin>>x>>y;
		int res = 1e18;
		for(int i=1;i<=60;i++){
			for(int j=1;j<=60;j++){
				if((x>>i)==(y>>j)){
					res = min(res,f[60][i][j]);
				}
			}
		}
		cout<<res<<endl;
	}
	return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
12
开始时间
2026-4-7 0:00
截止时间
2026-4-15 23:59
可延期
24 小时