feat: 添加P1073和P5121题解代码

实现P1073题目的图论解法,计算最大利润
实现P5121题目的模拟解法,处理方块消除逻辑
This commit is contained in:
Zengtudor 2025-11-26 17:31:29 +08:00
parent 7c65708ab6
commit 569d2ff9bb
2 changed files with 183 additions and 0 deletions

67
src/11/24/P1073.cpp Normal file
View File

@ -0,0 +1,67 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <queue>
#include <vector>
using ll = int64_t;
#define sl static inline
const ll maxn = 100000+7, maxm=500000+7,inf=1e9+7;
ll n,m,p[maxn],maxp[maxn],minp[maxn],ans=-inf;
std::vector<std::vector<ll>> edg,redg;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
edg.resize(n+1);
redg=edg;
std::fill(maxp+1,maxp+1+n,-inf);
std::fill(minp+1,minp+1+n,inf);
for(ll i=1;i<=n;i++){
std::cin>>p[i];
}
for(ll i=1;i<=m;i++){
ll x,y,z;
std::cin>>x>>y>>z;
if(z==1){
edg[x].emplace_back(y);
redg[y].emplace_back(x);
}else{
edg[x].emplace_back(y);
edg[y].emplace_back(x);
redg[x].emplace_back(y);
redg[y].emplace_back(x);
}
}
std::queue<ll> q;
q.emplace(n);
maxp[n]=p[n];
while(q.size()){
ll u=q.front();
q.pop();
for(ll v:redg[u]){
if(maxp[u]<=maxp[v]){
continue;
}
maxp[v]=std::max(p[v],maxp[u]);
q.emplace(v);
}
}
minp[1]=p[1];
q.emplace(1);
while(q.size()){
ll u=q.front();
q.pop();
ans=std::max(maxp[u]-minp[u],ans);
for(ll v:edg[u]){
if(minp[u]>=minp[v]){
continue;
}
minp[v]=std::min(p[v],minp[u]);
q.emplace(v);
}
}
std::cout<<ans<<"\n";
}

116
src/11/24/P5121.cpp Normal file
View File

@ -0,0 +1,116 @@
#include <bitset>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <queue>
#include <utility>
#include <vector>
using ll = int64_t;
#define sl static inline
#define printf
const ll m=10;
ll n,k;
std::vector<std::vector<char>> v;
std::vector<std::bitset<m+1>> vis;
const ll dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
std::vector<std::pair<ll, ll>> mb;
sl bool find(ll i,ll j){
printf("--START i=%lld, j=%lld\n",i,j);
mb.clear();
ll num=1;
std::queue<std::pair<ll, ll>> q;
q.emplace(i,j);
vis[i][j]=true;
char c=v[i][j];
while(q.size()){
auto[x,y]=q.front();
q.pop();
for(ll k=0;k<4;k++){
ll nx=x+dir[k][0],ny=y+dir[k][1];
if(nx<1||nx>n||ny<1||ny>m||c!=v[nx][ny]||vis[nx][ny])continue;
vis[nx][ny]=true;
num++;
q.emplace(nx,ny);
}
if(num>=k){
v[x][y]='0';
printf("find x=%lld, y=%lld\n",x,y);
}else{
mb.emplace_back(x,y);
}
}
if(num>=k){
for(auto[x,y]:mb){
v[x][y]='0';
printf("find x=%lld, y=%lld\n",x,y);
}
mb.clear();
}
return num>=k;
}
sl void pm(){
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
printf("%c",v[i][j]);
}
printf("\n");
}
printf("---\n");
}
sl void move(){
for(ll j=1;j<=m;j++){
ll l=-1;
for(ll i=n;i>=1;i--){
if(v[i][j]=='0'&&l==-1)l=i;
else if(l!=-1&&v[i][j]!='0'){
v[l][j]=v[i][j];
v[i][j]='0';
l--;
}
}
}
}
sl bool check(){
vis.clear();
vis.resize(n+1);
bool ret=false;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(v[i][j]!='0'){
if(find(i,j)){
pm();
pm();
ret=true;
}
}
}
}
move();
return ret;
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>k;
v.resize(n+1,std::vector<char>(m+1));
vis.resize(n+1);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
std::cin>>v[i][j];
}
}
while (check());
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
std::cout<<v[i][j];
}
std::cout<<"\n";
}
}