CODE FESTIVAL 2016 qualA Grid and Integers
划年代久远的水
题意
有一个R*C的棋盘,要求在每个格子上填一个非负数,使得对任意一个2*2的正方形区域,左上角和右下角的数字之和等于左下角和右上角的数字之和.有一些格子已经被填上了数字,问现在能否满足要求,输出Yes或No.
R,C<=1e5,已经被填上数字的格子数<=1e5
分析
记i行j列的数字为num[i][j]
假设一个2*2的正方形区域中,左上角,右上角,左下角,右下角依次为a,b,c,d,那么a+d=b+c,也就是说,a-b=c-d,a-c=b-d.
由此我们可以推出这样的结论:
对于任意不同的两行a和b,它们第i列和第j列的数字之差是相同的.即num[a][i]-num[a][j]=num[b][i]-num[b][j]
对于任意不同的两列a和b,它们第i行和第j行的数字之差是相同的.即num[i][a]-num[j][a]=num[i][b]-num[j][b]
于是我们可以用两个带权并查集,分别维护列之间数字之差和行之间数字之差.如果数字之差出现矛盾则无解.同时推出由已知的条件能确定的数值最小的数字,如果这个数字是负数则无解.否则有解.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define GG return puts("No"),0;
const int maxn=100005;
typedef long long ll;
int ufs1[maxn];ll w1[maxn];
int ufs2[maxn];ll w2[maxn];
struct node{
int x,y,val;
void read(){
scanf("%d%d%d",&x,&y,&val);
}
}P[maxn];
bool cmpx(const node &A,const node &B){
return A.x<B.x;
}
bool cmpy(const node &A,const node &B){
return A.y<B.y;
}
int find1(int x){
if(x==ufs1[x])return x;
int rt=find1(ufs1[x]);
w1[x]+=w1[ufs1[x]];
return ufs1[x]=rt;
}
int find2(int x){
if(x==ufs2[x])return x;
int rt=find2(ufs2[x]);
w2[x]+=w2[ufs2[x]];
return ufs2[x]=rt;
}
bool link1(int a,int b,ll w){
if(find1(a)!=find1(b)){
int ra=find1(a),rb=find1(b);
ufs1[ra]=ufs1[rb];
w1[ra]=w+w1[b]-w1[a];
return true;
}else{
return w1[a]==w+w1[b];
}
}
bool link2(int a,int b,ll w){
if(find2(a)!=find2(b)){
int ra=find2(a),rb=find2(b);
ufs2[ra]=ufs2[rb];
w2[ra]=w+w2[b]-w2[a];
return true;
}else{
return w2[a]==w+w2[b];
}
}
ll Min1[maxn],Min2[maxn];
int main(){
int R,C;scanf("%d%d",&R,&C);
for(int i=1;i<=R;++i){
ufs1[i]=i;w1[i]=0;
}
for(int i=1;i<=C;++i){
ufs2[i]=i;w2[i]=0;
}
int n;scanf("%d",&n);
for(int i=1;i<=n;++i)P[i].read();
sort(P+1,P+n+1,cmpx);
for(int i=1;i<n;++i){
if(P[i].x==P[i+1].x){
if(!link2(P[i].y,P[i+1].y,P[i+1].val-P[i].val))GG;
}
}
sort(P+1,P+n+1,cmpy);
for(int i=1;i<n;++i){
if(P[i].y==P[i+1].y){
if(!link1(P[i].x,P[i+1].x,P[i+1].val-P[i].val))GG;
}
}
memset(Min1,0x3f,sizeof(Min1));
memset(Min2,0x3f,sizeof(Min2));
for(int i=1;i<=n;++i){
int rt=find1(P[i].x);
Min1[rt]=min(Min1[rt],P[i].val+w1[P[i].x]);
}
for(int i=1;i<=R;++i){
int rt=find1(i);
Min2[rt]=min(Min2[rt],-w1[i]);
}
for(int i=1;i<=R;++i){
if(ufs1[i]==i&&Min1[i]+Min2[i]<0){
GG;
}
}
memset(Min1,0x3f,sizeof(Min1));
memset(Min2,0x3f,sizeof(Min2));
for(int i=1;i<=n;++i){
int rt=find2(P[i].y);
Min1[rt]=min(Min1[rt],P[i].val+w2[P[i].y]);
}
for(int i=1;i<=C;++i){
int rt=find2(i);
Min2[rt]=min(Min2[rt],-w2[i]);
}
for(int i=1;i<=C;++i){
if(ufs2[i]==i&&Min1[i]+Min2[i]<0)GG;
}
printf("Yes\n");
return 0;
}
CODE FESTIVAL 2016 qualA Grid and Integers的更多相关文章
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- 【AtCoder】CODE FESTIVAL 2016 qual B
CODE FESTIVAL 2016 qual B A - Signboard -- #include <bits/stdc++.h> #define fi first #define s ...
- 【AtCoder】CODE FESTIVAL 2016 qual C
CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...
- Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution
Atcoder CODE FESTIVAL 2016 Grand Final E - Water Distribution 题目链接:https://atcoder.jp/contests/cf16- ...
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...
- [CODE FESTIVAL 2016]Problem on Tree
题意:给一棵树,对于一个满足以下要求的序列$v_{1\cdots m}$,求最大的$m$ 对$\forall1\leq i\lt m$,路径$(v_i,v_{i+1})$不包含$v$中除了$v_i,v ...
- [CODE FESTIVAL 2016]Encyclopedia of Permutations
题意:给定一个排列,其中有可能有一些未确定的数,求出所有可能的排列的排名之和 首先我们要知道怎么算一个给定排列的排名,设它为$p_{1\cdots n}$ 排名即为比它小的排列数$+1$,对于每一个比 ...
- [CODE FESTIVAL 2016]Distance Pairs
题意:有一个未知的边权为$1$的图,给定所有点到$1$的最短路$a_i$和到$2$的最短路$b_i$,问是否存在这样的图,如果存在,问图中最少有多少条边 先考虑$a_i$,有$a_1=0,a_i\ne ...
- CODE FESTIVAL 2016 Grand Final 题解
传送门 越学觉得自己越蠢--这场除了\(A\)之外一道都不会-- \(A\) 贪心从左往右扫,能匹配就匹配就好了 //quming #include<bits/stdc++.h> #def ...
随机推荐
- 20155330 2016-2017-2 《Java程序设计》第九周学习总结
20155330 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 学习目标 了解JDBC架构 掌握JDBC架构 掌握反射与ClassLoader 了解自定义泛 ...
- Android开发——你真的了解Dialog、Toast和Snackbar吗
0. 前言 今天给大家带来一篇简单易懂的关于Android提醒小功能的文章.Dialog和Toast我们都不陌生,而Snackbar是Design Support库中提供的新控件,有些朋友可能还不了解 ...
- RHCSA-考前准备
1.考前准备 RHCSA classroom虚拟机和server虚拟机 将两台虚拟机切换到初始化快照 打开虚拟机电源,当出现提示时选择我已移动该虚拟机 系统密码: classroom: root As ...
- MySQL主从失败报错误: Got fatal error 1236
一.问题原因及报错误信息 由于MySQL主库意外重启,导致从库无法同步报错如下: 登录从库查看主从同步的错误信息 [root@--- mysql]# vim mysqld-error.log -- : ...
- HBase第二章 基本API
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- jenkens其实是代码上传工具
Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...
- Bin Packing 装箱问题——NPH问题的暴力枚举 状压DP
题目: 给定n(1≤n≤24)个物品,重量分别为wi,装进一些容量为S(S<1e8)的背包,最少需要多少个背包?
- Pearson Distance
Pearson Distance: where: 1. is the covariance 2. is the standard deviation of 3. is the standard ...
- Hyperledger中的共识机制
Hyperledger Consensus 共识过程 Hyperlydger中建立共识的过程由以下两个独立的过程构成: Ordering of transactions (交易排序) Validati ...
- 面对30页左右的运放数据手册datasheet,你需要知道如何看懂
1.输入失调电压(Input Offset Voltage) VOS 若将运放的两个输入端接地,理想运放输出为零,但实际运放输出不为零.此时,用输出电压除以增益得到的等效输入电压称为输入失调电压 ...