题目链接  Magic Matrix

考虑第三个条件,如果不符合的话说明$a[i][k] < a[i][j]$ 或 $a[j][k] < a[i][j]$

于是我们把所有的$(a[i][j], i, j)$升序排序,然后检查当前的三元组$(a[i][j], i, j)$的时候,

先确保第一维值小于他的所有三元组$(x, y, z)$中$f[y][z]$已经设置成$1$

然后看$f[i]$和$f[j]$是否有交集,如果有则说明不符合题意。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef pair <int, pair <int, int> > PII; const int N = 2510; int a[N][N];
int cnt, now;
int n; PII c[N * N];
bitset <N> f[N], tmp; int main(){ scanf("%d", &n);
rep(i, 1, n) rep(j, 1, n) scanf("%d", a[i] + j); rep(i, 1, n - 1) rep(j, i + 1, n) if (a[i][j] ^ a[j][i]) return 0 * puts("NOT MAGIC");
rep(i, 1, n) if (a[i][i]) return 0 * puts("NOT MAGIC"); rep(i, 1, n) rep(j, 1, n) c[++cnt] = MP(a[i][j], MP(i, j));
sort(c + 1, c + cnt + 1); now = 1;
rep(i, 1, cnt){
for (; now < i && c[now].fi < c[i].fi; ){
f[c[now].se.fi][c[now].se.se] = 1;
f[c[now].se.se][c[now].se.fi] = 1;
++now;
} tmp = f[c[i].se.fi] & f[c[i].se.se];
if (tmp.any()) return 0 * puts("NOT MAGIC");
} return 0 * puts("MAGIC");
}

 

最新文章

  1. 谈一谈前端多容器(多webview平台)处理方案
  2. CSS3实现加载中效果
  3. An interesting experiment on China&rsquo;s censorship
  4. AngularJS的学习--TodoMVC的分析
  5. 利用代码生成工具Database2Sharp设计数据编辑界面
  6. Sed 直接修改文件
  7. bootstrap部分---网格系统;(几天没写博客了,为了潜心研究一下bootstrap)
  8. hdu 5510 Bazinga
  9. C#生成缩略图代码
  10. xml学习_上篇
  11. Redis数据类型之字符串String
  12. Redis中的数据对象
  13. 【ASP.NET MVC 学习笔记】- 08 URL Routing
  14. from nltk.book import * 出错的解决方法
  15. OC语言(六)
  16. 配置notepad++支持golang开发
  17. j2ee课程设计—基于activiti的请休假系统
  18. multiset和set
  19. 浏览器修改或添加Cookie--chrome插件【edit this cookie】、【postman】
  20. hive 元数据库表描述

热门文章

  1. Python虚拟机类机制之descriptor(三)
  2. 【01】《html5权威指南》(扫描版)(全)
  3. ffmpeg转换参数和对几种视频格式的转换分析
  4. 2018安恒杯11月月赛 MISC
  5. Leetcode 593.有效正方形
  6. 【homework #1】第一次作业被虐感受
  7. js日期处理
  8. hdu6134[莫比乌斯反演] 2017多校8
  9. BZOJ 2015:[Noi2010]能量采集(数论+容斥原理)
  10. P1463 [HAOI2007]反素数