zoukankan      html  css  js  c++  java
  • Codeforces 632F Magic Matrix(bitset)

    题目链接  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");
    }
    

     

  • 相关阅读:
    10.25T2 二维线段树
    10.25T1 模拟+栈
    10.24T3 解方程 取模意义下运算+秦九韶算法
    10.24T2 树链剖分
    10.24T1 树形DP
    10.23T3 杨辉三角上做莫队
    10.23T2 二分+二分图(滑稽)
    10.23T1 杨辉三角
    10.22T6 水题
    10.22T4 模拟DP
  • 原文地址:https://www.cnblogs.com/cxhscst2/p/8040156.html
Copyright © 2011-2022 走看看