zoukankan      html  css  js  c++  java
  • CF1552D Array Differentiation

    感觉很妙的题。

    首先对于题目中 (a_i=b_j-b_k) 这个条件,可以理解为 (j)(k) 连一条有向边来表示 (a_i),同样的可以用 (k)(j) 连一条有向边来表示 (-a_i)

    那么可以建出一个 (n) 个点 (n) 条边的有向图,图中一定至少存在一个环,如果没有环一定不能满足。

    那么顺着环不难得到我们要求是否存在一个边的集合 (A),使得 (displaystyle sum_{i in A} s_i a_i),其中 (s_i in {1,-1})

    那么枚举每一个 (a_i) 选正,负,不选,dfs 一遍即可。

    #include <bits/stdc++.h>
    #define reg register
    #define fi first
    #define se second
    #define mp std::make_pair
    #define pb push_back
    typedef long long ll;
    typedef unsigned long long ull;
    int rd()
    {
        reg int x=0,f=0;
        reg char ch=getchar();
        while(!isdigit(ch)) (ch=='-')&&(f=1),ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        return f?-x:x;
    }
    const int MAXN=25;
    int n,a[MAXN];
    bool dfs(reg int x,reg int sta,reg int sum)
    {
    	if(sta&&!sum) return 1;
    	if(x>n) return 0;
    	if(dfs(x+1,sta,sum)) return 1;
    	if(dfs(x+1,sta+1,sum+a[x])) return 1;
    	if(dfs(x+1,sta+1,sum-a[x])) return 1;
    	return 0;
    }
    void work()
    {
    	n=rd();
    	for(reg int i=1;i<=n;++i) a[i]=rd();
    	puts(dfs(1,0,0)?"YES":"NO");
    }
    int main()
    {
        int _=1;
        _=rd();
        while(_--) work();
        return 0;
    }
    
  • 相关阅读:
    一些内容
    ios开发 xcode6以上安装Alcatraz管理插件
    java锁的深度化-重入锁,读写锁,乐观锁,悲观锁
    并发队列
    并发工具类
    并发编程
    HashMap底层源码剖析
    双列集合map面试题
    单列集合List
    类加载
  • 原文地址:https://www.cnblogs.com/Lonely-233/p/15100236.html
Copyright © 2011-2022 走看看