【HDOJ】1979 Fill the blanks
预处理+搜索剪枝。
4*4的边界上的数字必须是奇数。
- /* 1979 */
- #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
- typedef struct node_t {
- char s[];
- node_t() {}
- node_t(int a[][]) {
- int l = ;
- rep(i, , )
- rep(j, , )
- s[l++] = a[i][j]+'';
- s[l] = '\0';
- }
- friend bool operator< (const node_t& a, const node_t& b) {
- return strcmp(a.s, b.s)< ? true:false;
- }
- friend bool operator== (const node_t& a, const node_t& b) {
- return strcmp(a.s, b.s)==;
- }
- friend bool operator!= (const node_t& a, const node_t& b) {
- return strcmp(a.s, b.s)!=;
- }
- void print() {
- for (int i=; i<; i+=) {
- for (int j=; j<; ++j)
- putchar(s[i+j]);
- putchar('\n');
- }
- }
- } node_t;
- const int maxn = ;
- bool isPrime[maxn];
- bool valid[maxn];
- int a[maxn], an;
- int b[maxn], bn;
- int c[maxn], cn;
- bool M03[][];
- vector<node_t> ans;
- vi AV21[];
- vi AV30[];
- vi CV21[];
- vi CV30[];
- int M[][];
- void getV(int* a, int n, vi vc30[], vi vc21[]) {
- int d[];
- rep(i, , n) {
- int x = a[i];
- rep(j, , ) {
- d[j] = x % ;
- x /= ;
- }
- int v30 = d[]*+d[];
- int v21 = d[]*+d[];
- vc30[v30].pb(v21);
- vc21[v21].pb(v30);
- }
- vi::iterator iter;
- rep(i, , ) {
- sort(all(vc30[i]));
- iter = unique(all(vc30[i]));
- vc30[i].erase(iter, vc30[i].end());
- sort(all(vc21[i]));
- iter = unique(all(vc21[i]));
- vc21[i].erase(iter, vc21[i].end());
- }
- }
- void init() {
- int i, j, k;
- int x;
- int d[];
- an = bn = cn = ;
- memset(isPrime, true, sizeof(isPrime));
- memset(valid, false, sizeof(valid));
- isPrime[] = isPrime[] = false;
- for (i=; i<maxn; ++i) {
- if (isPrime[i]) {
- b[bn++] = i;
- for (j=i*i; j<maxn; j+=i)
- isPrime[j] = false;
- }
- }
- memset(M03, false, sizeof(M03));
- for (i=; i<bn; ++i) {
- x = b[i];
- if (valid[x])
- continue;
- for (j=; j<; ++j) {
- d[j] = x % ;
- x /= ;
- }
- if ((d[]&)== || (d[]&)==)
- continue;
- x = ;
- for (j=; j<; ++j) {
- x = x * + d[j];
- }
- if (isPrime[x]) {
- valid[x] = valid[b[i]] = true;
- a[an++] = x;
- a[an++] = b[i];
- M03[d[]][d[]] = M03[d[]][d[]] = true;
- bool flag = true;
- for (j=; j<; ++j) {
- if ((d[j] & )==) {
- flag = false;
- break;
- }
- }
- if (flag) {
- c[cn++] = x;
- c[cn++] = b[i];
- }
- }
- }
- sort(a, a+an);
- an = unique(a, a+an) - a;
- sort(c, c+cn);
- cn = unique(c, c+cn) - c;
- getV(a, an, AV30, AV21);
- getV(c, cn, CV30, CV21);
- }
- void solve_() {
- int v30 = *M[][]+M[][];
- int v30_ = *M[][]+M[][];
- int sz = SZ(AV30[v30]);
- int sz_ = SZ(AV30[v30_]);
- rep(i, , sz) {
- int v21 = AV30[v30][i];
- M[][] = v21/;
- M[][] = v21%;
- rep(j, , sz_) {
- int v21_ = AV30[v30_][j];
- M[][] = v21_/;
- M[][] = v21_%;
- int v1 = M[][]*+*M[][]+M[][]*+M[][];
- int v2 = M[][]*+*M[][]+M[][]*+M[][];
- int v3 = M[][]*+*M[][]+M[][]*+M[][];
- int v4 = M[][]*+*M[][]+M[][]*+M[][];
- if (valid[v1] && valid[v2] && valid[v3] && valid[v4]) {
- ans.pb(node_t(M));
- }
- }
- }
- }
- void solve() {
- int d1[];
- int d2[];
- int d3[];
- rep(i, , cn) {
- int x = c[i];
- rep(dd, , ) {
- d1[dd] = x % ;
- x /= ;
- }
- int f1 = d1[];
- int e1 = d1[];
- rep(j, , cn) {
- int x = c[j];
- rep(dd, , ) {
- d2[dd] = x % ;
- x /= ;
- }
- int f2 = d2[];
- int e2 = d2[];
- if (f1 != f2)
- continue;
- rep(k, , cn) {
- int x = c[k];
- rep(dd, , ) {
- d3[dd] = x % ;
- x /= ;
- }
- int f3 = d3[];
- int e3 = d3[];
- if (f3 != e1)
- continue;
- int v30 = e2* + e3;
- int sz_CV30 = SZ(CV30[v30]);
- rep(ii, , sz_CV30) {
- int v21 = CV30[v30][ii];
- int x3 = v21/;
- int y3 = v21%;
- M[][] = d1[];
- M[][] = d1[];
- M[][] = d1[];
- M[][] = d1[];
- M[][] = d2[];
- M[][] = d2[];
- M[][] = d2[];
- M[][] = d3[];
- M[][] = d3[];
- M[][] = d3[];
- M[][] = x3;
- M[][] = y3;
- solve_();
- }
- }
- }
- }
- }
- void print() {
- sort(all(ans));
- vector<node_t>::iterator iter = unique(all(ans));
- ans.erase(iter, ans.end());
- int sz = SZ(ans);
- ans[].print();
- rep(i, , sz) {
- putchar('\n');
- ans[i].print();
- }
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifndef ONLINE_JUDGE
- freopen("data.in", "r", stdin);
- freopen("data.out", "w", stdout);
- #endif
- init();
- solve();
- print();
- #ifndef ONLINE_JUDGE
- printf("time = %d.\n", (int)clock());
- #endif
- return ;
- }
【HDOJ】1979 Fill the blanks的更多相关文章
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【HDOJ】【3068】最长回文
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...
- 【HDOJ】【1512】Monkey King
数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...
随机推荐
- HTTP 错误 404.2 解决方案
HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误 404.2 - Not Found ...
- 前端工程模块化——以一个php项目为例
实现一个页面功能总是需要 JavaScript.CSS 和 Template 三种语言相互组织,所以我们真正需要的是一种可以将 JavaScript.CSS 和 Template 同时都考虑进去的模块 ...
- asp.net 点击按钮,页面没有任何变化,后台代码不触发
asp.net 点击按钮,页面没有任何变化,后台代码不触发 和可能是 asp.net button 缺少validationGroup 导致的,需要查看页面的validation并且让他们抛出错误信 ...
- Node.js之【正则表达式函数之match、test、exec、search、split、replace使用详解】
1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...
- mysql中的if条件语句用法
· IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; ...
- 解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)
从事WPF开发一年有余,对于图片显示模糊相信很多人都遇到过.网络上查找能得到一堆解决方法,但都是会带来其他负面影响得不到最佳效果.其实,有些图片会因为垂直分辨率/水平分辨率不同而造成在WPF界面上显示 ...
- EXTJS 4.2 资料 控件之textfield文本框加事件的用法
{ xtype: "textfield", width: 100, id: "txtGroupName", name: "txtGroupName&q ...
- MYSQL系列1_MySQL的安装,可视化工具的使用,以及建库建表等
大家都知道MYSQL是开源的数据库,现在MYSQL在企业中的使用也越来越多,本人之前用过SQL SERVER数据库,因业务需要和自己的兴趣想要学习MYSQL,对于MYSQL,本人还是新手,请大家多多指 ...
- bnu 4358 左手定则 (搜索)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4358 [题意]:给定起始位置和方向和目的地,按照左转.前进.右转.后退的优先级递减,也就是说能左转就 ...
- poj 1236 Network of Schools(又是强连通分量+缩点)
http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Su ...