首页 > 其他分享 >差分约束

差分约束

时间:2024-02-21 18:45:29浏览次数:21  
标签:le return int 矩阵 差分 约束 -- dis

解决形如 $a_i \le x_i - y_i \le b_i$ 的不等式组,其中 $a_i,b_i$ 是给定的常数。

我们尝试连接边通过 $\operatorname{spfa}$ 解决。
连接以下两条边,跑最短路。
$$\Large{x_i \overset{-a_i}{\to} y_i}$$
$$\Large{y_i \overset{b_i}{\to} x_i}$$

例题:
[P7515](https://www.luogu.com.cn/problem/P7515)

Alice 有一个 $n \times m$ 的矩阵 $a_{i, j}$($1 \le i \le n$,$1 \le j \le m$),其每个元素为大小不超过 ${10}^6$ 的非负整数。

Bob 根据该矩阵生成了一个 $(n - 1) \times (m - 1)$ 的矩阵 $b_{i, j}$($1 \le i \le n - 1$,$1 \le j \le m - 1$),每个元素的生成公式为

$$ b_{i, j} = a_{i, j} + a_{i, j + 1} + a_{i + 1, j} + a_{i + 1, j + 1} $$

现在 Alice 忘记了矩阵 $a_{i, j}$,请你根据 Bob 给出的矩阵 $b_{i, j}$ 还原出 $a_{i, j}$。



数据:$1 \le T \le 10$,$2 \le n, m \le 300$,$0 \le b_{i, j} \le 4 \times {10}^6$。

如果没有数据范围的限制,我们直接令 $a_{1\sim n,m},a_{n,{1 \sim m}}$ 都为 $0$,直接反解。

考虑调整 $a$ 直到合法或者输出无解。

因为 $ b_{i, j} = a_{i, j} + a_{i, j + 1} + a_{i + 1, j} + a_{i + 1, j + 1} $,所以只要贴着的四个和不变就可以。

考虑加减构造,每行 $+r_i,-r_i,+r_i,-r_i \ \cdots$,
每列 $+c_i,-c_i,+c_i,-c_i \ \cdots$  

然后会出现形如 $x+y,x-y$ 的限制。

我们再根据奇偶性调整符号符合 $x-y$,套上差分约束就行了。

  1 #include<bits/stdc++.h>
  2 
  3 const int N=3e2+20;
  4 const int inf=1e6;
  5 using namespace std;
  6 
  7 struct edge{
  8   int next,to,w;
  9 }e[N*N<<1];
 10 int head[N<<1],cnt;
 11 void add(int f,int t,int w){
 12   e[++cnt]=edge{head[f],t,w},head[f]=cnt;
 13 }
 14 
 15 int T,n,m;
 16 int a[N][N],b[N][N];
 17 int dis[N<<1],s,len,d[N<<1],vis[N<<1];
 18 
 19 bool spfa(int s){
 20   memset(dis,0x3f,sizeof dis);
 21   memset(vis,0,sizeof vis);
 22   memset(d,0,sizeof d);
 23   queue<int>Q;
 24   dis[s]=0;
 25   Q.push(s);
 26   while(Q.size()){
 27     int u=Q.front();
 28     Q.pop();
 29     vis[u]=0;
 30     for(int i=head[u];i;i=e[i].next){
 31       int v=e[i].to;
 32       if(dis[v]>dis[u]+e[i].w){
 33         dis[v]=dis[u]+e[i].w;
 34         if(++d[v]>n+m)return 0;
 35         if(!vis[v]) Q.push(v);
 36         vis[v] = 1;
 37       }
 38     }
 39   }
 40   return 1;
 41 }
 42 
 43 void solve(){
 44   cin >> n >> m;
 45   len = n + m; cnt = 0;
 46   for(int i=1;i<=n+m+2;++i)head[i]=0;
 47   for(int i=1;i<n;++i){
 48     for(int j=1;j<m;++j){
 49       cin>>b[i][j];
 50     }
 51   }
 52   memset(a,0,sizeof a);
 53   for(int i=n-1;i>=1;--i)
 54   for(int j=m-1;j>=1;--j){
 55     a[i][j]=b[i][j]-a[i+1][j]-a[i][j+1]-a[i+1][j+1];
 56   }
 57   for(int i=1;i<=n;++i){
 58     for(int j=1;j<=m;++j){
 59       if(!((i + j) & 1)) {
 60         add(i,n+j,a[i][j]);
 61         add(n+j,i,inf-a[i][j]);
 62       }  else {
 63         add(n+j,i,a[i][j]);
 64         add(i,n+j,inf-a[i][j]);
 65       }
 66     }
 67   }
 68   int tag = spfa(1);
 69   if(!tag) {
 70     cout << "NO\n";
 71     return;
 72   }
 73   for(int i=1;i<=n;++i){
 74     for(int j=1;j<=m;++j){
 75       if(!((i + j) & 1)) {
 76         a[i][j] += dis[i] - dis[n+j];
 77         if(a[i][j] < 0 || a[i][j] > inf) {cout << "NO\n"; return;}
 78       } else {
 79         a[i][j] += - dis[i] + dis[n+j];
 80         if(a[i][j] < 0 || a[i][j] > inf) {cout << "NO\n"; return;}
 81       }
 82     }
 83   }
 84   cout << "YES\n";
 85   for(int i=1;i<=n;++i){
 86     for(int j=1;j<=m;++j)
 87         cout << a[i][j] << " ";
 88     cout << endl;
 89   }
 90 }
 91 
 92 
 93 int main(){
 94 
 95   cin >> T;
 96   while(T--){
 97     solve();
 98   }
 99   return 0;
100 }
View Code

 



标签:le,return,int,矩阵,差分,约束,--,dis
From: https://www.cnblogs.com/Saka-Noa/p/18025987

相关文章

  • keep_hierarchy约束在三模冗余中的应用
    节选自《FPGA之道》keep_hierarchy是一个综合和实现方面的约束。Xilinx的综合工具XST更倾向于平化HDL代码的层级结构,即将一级级的模块调用机制转换为一个没有子模块的超大模块,这样做的好处是能够进行更好地设计优化工作,因为平化操作去除了原有实体或模块之间的边界限制。不过有些......
  • 基于MCU的差分增量FOTA升级可用方案记录
    差分FOTA优点:占用空间小,非常适合用于lora,nbiot等慢速低数据量的升级用,相比全量升级的传输大小空间基本都有量级的节省。缺点:生产差分文件时需要基于上一版本,前后版本差异太大有的差分fota算法并不能很好的差分。难点:mcu一般flash空间和ram空间都很小,开源的大部分早期基本都是......
  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)
    目录题面链接题意题解代码总结题面链接C.LittleGirlandMaximumSum题意给q个[l,r]将所有这些区间里面的数相加和最大。可以进行的操作是任意排列数组题解对出现的每个区间内的位置加上1,代表权值操作完之后求一遍前缀和,得到每个位置的权值然后贪心的考虑,权值越大,应......
  • 负环与差分约束
    1.负环负环是指一个环的边权值之和为负数。有负环的图没有最短路。要判断一个图是否有负环,一般使用Bellman-Ford算法或SPFA算法。Bellman-Ford如果一个图没有负环的话,最短路径最多会经过\(N-1\)条边。如果有,那么在进行\(N\)次更新后还能继续更新。于是用Bellman-F......
  • 差分约束算法
    一、题目描述P5960【模板】差分约束二、题目简析差分约束问题的典型特征是一组不等式。只要画出约束图,这类问题都可以准换为最短路径问题。注意:约束图是有向图。2.1约束图的顶点约束图的顶点(\(V\))=一个未知数对应一个顶点(\(v_1,v_2,...,v_n\))+一个额外的顶点(\(v_0\)......
  • R语言用随机森林模型的酒店收入和产量预测误差分析
    全文链接:https://tecdat.cn/?p=35162在这篇文章中,我们将探讨基于随机森林模型的酒店收入和产量预测分析。我们将使用4月9日至4月15日的数据作为测试集,评估预测的准确度。我们将分别对单个酒店在三个预订渠道的总收入和总产量进行分析,并使用随机森林模型进行预测。通过对比每家酒......
  • SQL数据库入门03:数据库表的完整性约束、索引与视图的操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表完整性约束、索引与视图的创建、编辑与删除等操作的方法。(数据库基础(三):完整性约束、索引、视图)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用......
  • 基础算法(十一)二维差分---以题为例
    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1)和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上 c。请你将进行完所有操作后的矩阵输出。输入格式第一行包含整......
  • 基础算法(十)差分模板---以题为例
    输入一个长度为 n的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数序列。接下来 m 行,每行包含三个整数 l,r......
  • 基于资源的约束委派(RBCD)
    概念微软在WindowsServer2012中新引入基于资源的约束性委派(ResourceBasedConstrainedDelegation,RBCD),RBCD不需要通过具备SeEnableDelegationPrivilege权限的域管理员进行修改,而是将设置属性的权限给了服务资源本身。配置了RBCD的账户属性有如下变化:msDS-AllowedToActOn......