mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-12-16 20:23:00 +00:00
feat: 添加P1073和P5121题解代码
实现P1073题目的图论解法,计算最大利润 实现P5121题目的模拟解法,处理方块消除逻辑
This commit is contained in:
parent
7c65708ab6
commit
569d2ff9bb
67
src/11/24/P1073.cpp
Normal file
67
src/11/24/P1073.cpp
Normal 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
116
src/11/24/P5121.cpp
Normal 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";
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user