mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-12-17 12:43:06 +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