「PMOI-5」奇怪的方程 题解

news/2025/2/11 19:40:57/文章来源:https://www.cnblogs.com/ddh321/p/18706457

哎哎,感觉是很典的题啊,但还是不会。

一些无脑的转化

首先转化成二维数组,原题中 \(2n\) 个方程相当于必须满足每一行和每一列的数之和是定值,已被选的数可以让这个位置的行与列的总和分别减去这个数,然后直接令它等于 \(0\),显然这是与原条件等价的。

另外我们可以发现有些位置的集合的填数是独立的。

如图,红色格子的填数与蓝色格子的填数无关,因此,我们可以将原问题变成若干的子问题。具体的,如果第 \(i\) 行的第 \(j\) 列可以填,那么我们可以从第 \(i\) 行向第 \(j\) 列连一条边,每个子问题构成一个连通块,显然存在一个子问题中 \(\sum{a_i} \neq \sum{b_i}\) 则必然无解。

然后呢,感觉有点无从下手了,我们可以发现:一个连通块的限制肯定比一颗树的限制严格宽泛,所以我们可以考虑一棵生成树怎么构造。我们可以发现如果一个点的度数为 \(1\) 那么它的实际含义就是原图中一行或一列中只有一个数可以填,那么它一定是唯一确定的,因此我们可以对这棵树拓扑排序,每次删除节点,然后新增度数为 \(1\) 的节点,我们可以发现,如果有解,那么一定可以用这种方法构造出来一组解。

AC code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define N 2005
int read(){int x=0,f=0;char ch=getchar();while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return f?-x:x;
}
int n,m,a[N],b[N],ans[N][N],fa[N<<1],tvis[N<<1],in[N<<1];
bool vis[N][N];
vector<pii>E[N<<1],G[N<<1];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]); 
}
void merge(int x,int y){int fx=find(x),fy=find(y);
}
vector<int>now;
void dfs(int p){ tvis[p]=1,now.push_back(p);for(auto &&i:E[p])if(!tvis[i.fi]){G[i.fi].push_back({p,i.se}); in[i.fi]++;G[p].push_back({i.fi,i.se}); in[p]++;dfs(i.fi);}
}
void bfs(){if(now.size()==1){now.pop_back();return;}queue<int>q;for(auto &&i:now)if(in[i]==1)q.push(i);while(q.size()){int u=q.front(); q.pop();tvis[u]=2;if(!in[u])continue;for(auto &&i:G[u]){int v=i.fi,x=i.se,tx=(x+n-1)/n,ty=(x%n)?x%n:n;if(tvis[v]==2)continue;ans[tx][ty]=(u<=n?a[u]:b[u-n]); a[tx]-=ans[tx][ty],b[ty]-=ans[tx][ty];if(--in[v]==1)q.push(v);}} now.clear();
}
void solve(){n=read(),m=read();for(int i=1;i<=n;i++)a[i]=read();for(int j=1;j<=n;j++)b[j]=read();for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)vis[i][j]=ans[i][j]=0;for(int i=1;i<=n<<1;i++)fa[i]=i,E[i].clear(),G[i].clear(),tvis[i]=in[i]=0;while(m--){int x=read(),tx=(x+n-1)/n,ty=(x%n)?x%n:n;vis[tx][ty]=1,ans[tx][ty]=read();}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(vis[i][j])a[i]-=ans[i][j],b[j]-=ans[i][j];else merge(i,j+n),E[i].push_back({j+n,(i-1)*n+j}),E[j+n].push_back({i,(i-1)*n+j});for(int i=1;i<=2*n;i++)if(find(i)==i)dfs(i),bfs();for(int i=1;i<=n;i++)if(a[i]||b[i]){puts("No Solution");return;}puts("OK");for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)printf("%lld ",ans[i][j]); puts("");
}
signed main(){int T=read();while(T--)solve();return 0;
}

一些无用的总结

做构造题时,如果条件过于宽泛,我们可以考虑自己额外添加一些条件,从特殊情况出发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P11216 【MX-J8-T4】2048 题解

这是本蒟蒻的第一篇正式题解。 本题重点在于找到无解序列的充要条件,首先记 \(a_i\) 为游戏结束时第 \(i\) 个数取 \(2\) 的对数,\(t_i\) 为第 \(i\) 个数出现时间离散化后的值,显然 \(a\) 相邻两项不同,\(t\) 是一个排列,如果一个位置比它相邻位置大且出现时间小,直接按…

问一下,利用在线 DeepSeek 等 API 服务实现一个答题 APP

这是一个利用 Android 无障碍功能 + 悬浮窗 + 大模型的搜题应用原理就是利用无障碍读取屏幕内容,然后通过悬浮窗来显示答案简介 这是一个利用 Android 无障碍功能 + 悬浮窗 + 大模型的搜题应用 原理就是利用无障碍读取屏幕内容,然后通过悬浮窗来显示答案 众所周知我是一个学渣…

Window逆向之x86 ShellCode入门

免责声明: 由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!前言 不少人对于ShellCode的认知是很浅的,只知道它是一…

【字符串、栈】string转double

stod函数 将string转为double string t = s.substr(i, j - i); double num = stod(t);例题:货币单位换算样例1 输入 2 20CNY53fen 53HKD87cents输出 6432说明: 20元53分+53港元87港分,换算成人民币分后汇总,为6432 样例2 输入 1 100CNY输出 10000说明: 100CNY转换后是1000…

ceph 16.2.15(Pacific)编译

目录获取ceph源码编译拉取submodule网络问题安装依赖do_cmake.sh编译vstart启动问题编译dashboard安装nodejs方法一 下载编译好的源码包方法二 nvm安装node(推荐)编译nodeenv其他boost下载慢总结以下流程在ubuntu22.04 和 openEuler20.03 都实际操作过获取ceph源码 从https:/…

【第四期书生大模型实战营】第2关 L0G2000 Python 基础知识

任务 任务概览任务类型 任务内容 预计耗时闯关任务 Leetcode 383(笔记中提交代码与leetcode提交通过截图) 20mins闯关任务 Vscode连接InternStudio debug笔记 10mins可选任务 pip安装到指定目录 10mins作业总共分为三个任务,两个闯关任务均完成视作闯关成功。 请将作业发布到知…

Redis 持久化策略及其优缺点

原文:Redis 有哪 2 种持久化方式?分别的优缺点是什么?,补充了 Redis 默认的持久化配置Redis 的读写操作都是在内存中,所以 Redis 性能才会高,但是当 Redis 重启后,内存中的数据就会丢失,那为了保证内存中的数据不会丢失,Redis 实现了数据持久化的机制,这个机制会把数…

Innotop:一款MySQL监控工具

在现代数据库管理中,MySQL作为广泛应用的开源关系数据库,已成为各类企业、开发者和数据库管理员(DBA)日常工作中不可或缺的工具。然而,随着数据库规模的增大和查询量的增加,MySQL服务器的性能监控变得尤为重要。为了确保数据库的高效运行和及时排除潜在问题,DBA们需要依…

Windows本地部署deepseek(小白向)

下载Ollama官网下载:ollama.com 点击Download选中Windows版本,点击Download for Windows下载是需要跳转github的,如果无法访问,需要尝试使用github加速器 推荐使用加速器FastGithub(免费,开源) 这里提供国内清华镜像下载 https://cloud.tsinghua.edu.cn/d/df482a15afb64…

SSE、EventSource了解

EventSource接口是web内容和服务器发送事件通信的接口 一个EventSource实例会对HTTP服务器开启一个持久化的连接,以text/event-stream格式发送事件 该连接会一直保持开启直到调用EventSource.close()关闭EventSource是一种Web API,用于建立和服务器之间的【单向持久化】连接 …

基于GD32的简易示波器

基于GD32的简易示波器项目学习 根据立创训练营项目:[简易数字示波器设计(入门版) - 立创开源硬件平台(https://oshwhub.com/course-examples/yi-qi-yi-biao-jian-yi-shu-zi-shi-bo-qi-she-ji-cha-jian-ban) 技术点:原理图绘制,PCB设计,打板,焊接。外部中断,定时器中断,…

DeepSeek本地化部署(Windows)

DeepSeek本地化部署(Windows) 安装 Ollama https://ollama.com/download/windowsCMD部署deepseek模型 https://ollama.com/ 网址中,在网页上方搜索框中输入 Deepseek-r1 1.5b: 需要1.1GB显存 7b: 需要4.7GB显存 8b: 需要4.9GB显存 14b: 需要9.0GB显存 32b: 需要20GB显存 70b…