abc346
给定
对于
因为只有一对相同的字符组(i,i+1)
维护
维护
再枚举i,有
def solve():
N=I()
S=list(map(int,input()))
C=LI()
dp_pre=[[0,0] for _ in range(N+1)]
dp_suf=[[0,0] for _ in range(N+1)]
for i in range(N):
for j in range(2):
dp_pre[i+1][j]=dp_pre[i][j^1]+(S[i]^j)*C[i]
for i in range(N-1,-1,-1):
for j in range(2):
dp_suf[i][j]=dp_suf[i+1][j^1]+(S[i]^j)*C[i]
ans=10**18
for i in range(1,N):
ans=min(ans,dp_pre[i][0]+dp_suf[i][0],dp_pre[i][1]+dp_suf[i][1])
print(ans)
可以发现如果顺着操作前面有些方块的颜色会被后面操作所覆盖掉
反之后面方块的颜色不会被前面的操作影响
也就是说倒着操作即可
void solve()
{
int H,W,M;
std::cin>>H>>W>>M;
using ti = std::tuple<int, int, int>;
std::vector<ti> qs(M);
for(auto&[o,a,x]:qs){
std::cin>>o>>a>>x;
}
std::reverse(qs.begin(),qs.end());
std::set<int>r,c;
const int N=2e5+1;
std::vector<i64>ans(N);
ans[0]=1LL*H*W;
auto op1=[&](int a,int x){
if(!r.insert(a).second){
return;
}
int res = W - int(c.size());
ans[x]+=res;
ans[0]-=res;
};
auto op2 = [&](int a, int x) {
if (!c.insert(a).second) {
return;
}
int res = H - int(r.size());
ans[x] += res;
ans[0] -= res;
};
for(const auto&[o,a,x]:qs){
if(o==1){
op1(a,x);
}
else{
op2(a,x);
}
}
int cnt=0;
for(int i=0;i<N;i++){
cnt+=(ans[i]!=0);
}
std::cout<<cnt<<'\n';
for(int i=0;i<N;i++){
if(not ans[i]){
continue;
}
std::cout<<i<<' '<<ans[i]<<'\n';
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】