1. 题目描述
给定几个三角形拼成一个百慕大三角形。

2. 基本思路
基本思路肯定是搜索,关键点是剪枝。
(1) 若存在长度为$l$的边,则一定可以拼成长度为$k \cdot l$的三角形,则可拼成长度为$k \cdot l$的百慕大三角形;
(2) 长度超过百慕大三角形的边长的三角形没有任何价值;
(3) 百慕大三角形中每个正三角形可以作为正多边形的顶点,倒三角形可以作为倒正三角形的顶点。
因此,可以将每个三角形映射到二维坐标,高度为$y$,倒三角形的$x$坐标为偶数,正三角形的$x$坐标为奇数。
对于每个有效的坐标,枚举可以使用的三角形。暴力深搜可解。
然后,观察可发现每个百慕大是由6个正三角形或3个平行四边形组成。因此,假设可以拼成三角形或平行四边形,那么一定可以拼成百慕大。
对于不同的形状,不需要重写dfs函数,只需要限定好边界即可。

3. 代码

 /* 1362 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <bitset>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxn = ;
const int maxm = ;
int c[maxn], s[maxn];
int a[maxn], R[maxm];
bool visit[maxm][maxm];
int n, m, bound;
bool flag; void init() {
rep(i, , maxn)
c[i] = c[i-] + i*-;
rep(i, , maxn)
s[i] = * c[i];
} inline bool judge(int x, int y) {
return y<= || y>bound || x<= || x>R[y];
} bool check(int x, int y, int n) {
if (x & ) {
// straight triangle
int yy = y;
rep(i, , n+) {
int xx = x, l = i*-;
rep(j, , l) {
if (judge(xx, yy) || visit[yy][xx]) return false;
++xx;
}
++yy;
}
} else {
// reverse triangle
int yy = y;
int c = ;
per(i, , n+) {
int xx = x + c * , l = i*-;
rep(j, , l) {
if (judge(xx, yy) || visit[yy][xx]) return false;
++xx;
}
++c;
++yy;
}
}
return true;
} void update(int x, int y, int n, bool delta) {
if (x & ) {
// straight triangle
int yy = y;
rep(i, , n+) {
int xx = x, l = i*-;
rep(j, , l) {
visit[yy][xx] = delta;
++xx;
}
++yy;
}
} else {
// reverse triangle
int yy = y;
int c = ;
per(i, , n+) {
int xx = x + c * , l = i*-;
rep(j, , l) {
visit[yy][xx] = delta;
++xx;
}
++c;
++yy;
}
}
} void dfs(int r, int dep) {
if (dep > bound) {
flag = true;
return ;
} int rr = r + , depp = dep;
if (r == R[dep]) {
rr = ;
++depp;
} if (visit[dep][r]) {
dfs(rr, depp);
} else {
rep(i, , m) {
int l = a[i];
if (check(r, dep, l)) {
update(r, dep, l, true);
dfs(rr, depp);
update(r, dep, l, false);
if (flag) return;
} else {
break;
}
}
}
} bool judge1() {
flag = false;
bound = n;
memset(visit, false, sizeof(visit));
rep(i, , n+)
R[i] = *i-;
dfs(, );
return flag;
} bool judge2() {
flag = false;
bound = n;
memset(visit, false, sizeof(visit));
rep(i, , n+)
R[i] = *i-;
dfs(, );
return flag;
} bool judge3() {
flag = false;
bound = n*;
memset(visit, false, sizeof(visit));
rep(i, , n+) {
R[i] = n* + *i-;
}
rep(i, n+, n*+) {
rep(j, , *(i-n))
visit[i][j] = true;
R[i] = (n + n)*;
}
dfs(, );
return flag;
} void solve() {
sort(a, a+m);
rep(i, , m) {
if (n%a[i] == ) {
puts("YES");
return ;
}
}
if (a[] > n) {
puts("NO");
return ;
} { // filter unnecessary
int j = ; rep(i, , m) {
if (a[i] > n)
break;
bool flag = true;
rep(k, , j) {
if (a[i]%a[k] == ) {
flag = false;
}
}
if (flag)
a[j++] = a[i];
}
m = j;
} if (judge1()) {
puts("YES");
return ;
} if (judge2()) {
puts("YES");
return ;
} if (judge3()) {
puts("YES");
return ;
} puts("NO");
} int main() {
cin.tie();
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t; scanf("%d", &t);
while (t--) {
scanf("%d%d", &n,&m);
rep(i, , m)
scanf("%d", a+i);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %ldms.\n", clock());
#endif return ;
}

【HDOJ】1362 The Bermuda Triangle的更多相关文章

  1. 【Leetcode】Pascal&#39;s Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...

  2. 【BZOJ】1914: [Usaco2010 OPen]Triangle Counting 数三角形

    [题意]给定坐标系上n个点,求能构成的包含原点的三角形个数,n<=10^5. [算法]极角排序 [题解]补集思想,三角形个数为C(n,3)-不含原点三角形. 将所有点极角排序. 对于一个点和原点 ...

  3. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  4. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  5. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  6. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  7. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  8. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

  9. 【HDOJ】【3530】Subsequence

    DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...

随机推荐

  1. JS 学习笔记--7---正则表达式

    正则表达式中的内容很多,也很深,下面只是一些基本的知识点,练习中使用的浏览器是IE10,若有不当处请各位朋友指正,我会在第一时间修改错误之处. 匹配的概念:是包含的意思,不是相等的意思 1.正则表达式 ...

  2. 【BZOJ】【1912】【APIO2010】patrol巡逻

    树形DP 说是树形DP,其实就是求树的最长链嘛…… K=1的时候明显是将树的最长链的两端连起来最优. 但是K=2的时候怎么搞? 考虑第一次找完树的最长链以后的影响:第一次找过的边如果第二次再走,对答案 ...

  3. 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复

    由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...

  4. .net深入体验与实战精要--ASP.NET开发大杂烩(转)

    转自:http://www.cnblogs.com/sunhan/p/3371337.html 正巧今天遇到一个获取动态生成table中的一个动态生成的TextBox的值的时候总是findcontro ...

  5. IE如何兼容placeholder属性

    在前端开发中,经常需要为input设置placeholder属性,但是placeholder是HTML5新属性,在IE10以下不兼容,那么如何完美兼容呢? 网上搜索了一下,其实也挺简单的,可以采用以下 ...

  6. 偶然发现的一个地图网站mapbox

    https://www.mapbox.com/ 可以自定义地图,并放到dropbox中.时间有限,更多功能有待发现 可以用他的切片 http://a.tiles.mapbox.com/v3/jambo ...

  7. C# 对动态编辑的一些学习笔记

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...

  8. 容器字段FieldContainer

    //Ext.form.FieldContainer扩展自Ext.container.Container.当需要把多个字段或组件作为一个表单项展示的时候就需要此组件          Ext.Quick ...

  9. NodeJS介绍

    1.概述: Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的.可扩展的网络应用.Node.j ...

  10. POJ 2013

    #include <iostream> #include <string> #define MAXN 20 using namespace std; string _m[MAX ...