说不想改最后还是向T1屈服了。。然后就de了一下午Bug。。。

虽然昨天随口扯的有点道理,正解就是迭代加深A星搜索,但实际写起来就十分难受了。

说自己的做法,略鬼畜。

每个正方形的边界上的边、每条边在哪些正方形上,都可以用一个Long Long的二进制串表示。给每个矩形编号,预处理每个矩形对应边的串,每条边对应矩形的串,每个矩形对应矩形(它的所有边对应矩形的并集,之后估价会用)。

然后就直接迭代搜索,存一个串表示现在哪些正方形处理完了,每次找出第一个没处理的正方形,枚举每条边试图处理它。用一个估价函数判断现在有没有必要继续搜:找当前状态所有未处理的正方形,把它的所有边处理掉,遇到一个就res++,若res+cnt>limit 就return 0;

几个坑点,可能只有自己会被坑。。。

1.不用二进制优化会TLE,可能是我写得比较残,T2个点。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
using namespace std;
int T,n,totn,k,x,xx,tot,now,nowok,e[][],sq[][],ok[],tpok[],limit;
void clear() {
memset(e,,sizeof(e));
memset(sq,,sizeof(sq));
memset(ok,,sizeof(ok));
tot=; nowok=;
}
void link(int ed,int id) {
e[ed][++e[ed][]]=id;
sq[id][++sq[id][]]=ed;
}
void pre() {
totn=;
for(int i=;i<=n;i++) totn+=i*i;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i+k<=n&&j+k<=n)
{
tot++;
for(int l=;l<=k;l++) {
now=(i-)*(*n+)+j+l;
link(now,tot);
now=(i+k)*(*n+)+j+l;
link(now,tot);
}
now=n+(i-)*(*n+)+j;
link(now,tot);
link(now+k+,tot);
for(int l=;l<=k;l++) {
now+=(*n+);
link(now,tot);
link(now+k+,tot);
}
}
}
int check(int x,int c,int li) {
memset(tpok,,sizeof(tpok));
int res=;
for(int i=;i<=totn;i++)
if(!ok[i]&&!tpok[i]) {
res++;
for(int j=;j<=sq[i][];j++) {
int u=sq[i][j];
for(int l=;l<=e[u][];l++)
tpok[e[u][l]]=;
}
}
return res;
}
int dfs(int cnt,int no,int lim) {
if(cnt>lim) return ;
if(!no) return ;
int tp[],flag=;
memset(tp,,sizeof(tp));
for(int i=;i<=totn;i++) if(flag) break; else {
if(!ok[i]){
flag=;
for(int j=;j<=sq[i][];j++) {
xx=; tp[]=;
x=sq[i][j];
for(int l=;l<=e[x][];l++) {
if(!ok[e[x][l]]) {tp[++tp[]]=e[x][l]; xx++;}
ok[e[x][l]]=;
}
if(check(sq[i][j],cnt,lim)+cnt<=lim) {
if(dfs(cnt+,no-xx,lim)) return ;
}
for(int i=;i<=tp[];i++)
ok[tp[i]]=;
}
}
}
return ;
}
int main()
{
freopen("mag.in","r",stdin);
freopen("mag.out","w",stdout);
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&k);
clear();
pre();
for(int i=;i<=k;i++) {
scanf("%d",&x);
for(int j=;j<=e[x][];j++) {
if(!ok[e[x][j]]) nowok++;
ok[e[x][j]]=;
}
}
for(limit=;limit<=;limit++) {
if(dfs(,totn-nowok,limit)) {
printf("%d\n",limit);
break;
}
}
}
return ;
}

2.搜索的时候只需要搜当前状态第一个不满足的正方形,因为其他在之后的状态中是可以搜到的,不然会T8个点。。。

3.正方形的编号,因为搜索是按编号搜的,要先编小正方形再编大的。。自行体会。。会T两个点,速度是0.2秒和10.2秒的差距。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
using namespace std;
int T,n,totn,k,x,xx,now,tot,nowok,sqq[][];
LL e[],sq[],val[],st,limit,N;
void clear() {
memset(e,,sizeof(e));
memset(sq,,sizeof(sq));
memset(sqq,,sizeof(sqq));
memset(val,,sizeof(val));
tot=; st=;
}
void link(int ed,int id) {
e[ed]|=1LL<<(id-);
sq[id]|=1LL<<(ed-);
sqq[id][++sqq[id][]]=ed;
}
void pre() {
totn=;
for(int i=;i<=n;i++) totn+=i*i;
N=(1LL<<totn)-;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i+k<=n&&j+k<=n)
{
tot++;
for(int l=;l<=k;l++) {
now=(i-)*(*n+)+j+l;
link(now,tot);
now=(i+k)*(*n+)+j+l;
link(now,tot);
}
now=n+(i-)*(*n+)+j;
link(now,tot);
link(now+k+,tot);
for(int l=;l<=k;l++) {
now+=(*n+);
link(now,tot);
link(now+k+,tot);
}
}
for(int i=;i<=totn;i++) {
for(int j=;j<=sqq[i][];j++) {
val[i]|=e[sqq[i][j]];
}
}
}
int check(LL now,int c,int li) {
int res=;
for(int i=;i<=totn-;i++) {
if(!(now&(1LL<<i-))) {
res++;
if(res+c>li) return ;
now|=val[i];
}
}
return res+c<=li;
}
int dfs(int cnt,LL now,int lim) {
if(cnt>lim) return ;
if(now==N) return ;
LL tmp;
if(!check(now,cnt,lim)) return ;
int flag=;
for(int i=;i<=totn;i++) if(flag) break; else{
if(!(now&(1LL<<i-))){
flag=; for(int j=;j<=sqq[i][];j++) {
tmp=now|e[sqq[i][j]];
//if(check(tmp,cnt,lim)) {
if(dfs(cnt+,tmp,lim)) return ;
//}
}
}
}
return ;
}
int main()
{
freopen("mag.in","r",stdin);
freopen("mag.out","w",stdout);
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&k);
clear();
pre();
for(int i=;i<=k;i++) {
scanf("%d",&x);
st|=e[x];
}
for(limit=;limit<=;limit++) {
if(dfs(,st,limit)) {
printf("%d\n",limit);
break;
}
}
}
return ;
}

AC

ssoj 2279 磁力阵的更多相关文章

  1. 输出 n=6 的三角数字阵(JAVA基础回顾)

    package itcast.feng; import java.util.Scanner; //需求:输出 n=6 的三角数字阵 //1 //2 3 //4 5 6 //7 8 9 10 //11 ...

  2. [教程]怎么用百度云观看和下载"磁力链接"无需下载直接观看.

    1, 打开网址 http://okbt.net/  输入你想要看的电影名字, 点搜索,鼠标右键点击拷贝磁力链接.或者 电脑装了迅雷的话.可以直接点击.用迅雷下载. 磁力链接都是这种格式的.例: mag ...

  3. 开源磁力搜索爬虫dhtspider原理解析

    开源地址:https://github.com/callmelanmao/dhtspider. 开源的dht爬虫已经有很多了,有php版本的,python版本的和nodejs版本.经过一些测试,发现还 ...

  4. (算是dp吧) 小茗的魔法阵 (fzu 2225)

    http://acm.fzu.edu.cn/problem.php?pid=2225   Problem Description 在打败了易基•普罗布朗.诺姆•普罗布朗之后,小茗同学开始挑战哈德•普罗 ...

  5. ACdream 1214---矩阵连乘

    ACdream 1214---矩阵连乘 Problem Description You might have noticed that there is the new fashion among r ...

  6. 合工大 OJ 1332 蛇形阵

    Description 蛇形针回字阵: 如3*3: 回字阵: 7 6 5 8 1 4 9 2 3 Input 多组数据: 每一行一个正整数n(n为奇数,<26),代表n*n矩阵. Output ...

  7. zstu.4022.旋转数阵(模拟)

    旋转数阵 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1477  Solved: 102 Description 把1到n2的正整数从左上角开始由外层 ...

  8. 【NOIP模拟赛】正方形大阵

    正方形大阵 [问题描述]   [输入格式]   第一行一个正整数n代表询问次数. 接下来n行每行一个不超过八位的小数k代表一组询问. [输出格式]   输出共n行,代表每次询问的答案:如果有无数个交点 ...

  9. 用ubuntu下载电影:磁力链接,torrent,迅雷链接

    用ubuntu下载电影:磁力链接,torrent,迅雷链接 操作系统:Ubuntu 14.04 64位 需要软件:Ktorent, Amule 安装软件: sudo apt-get install k ...

随机推荐

  1. 『BASH』——Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"

    /*为节省时间,本文以汉文撰写*/ -前言- 深入学习正则表达式,可以很好的提高思维逻辑的缜密性:又因正则应用于几乎所有高级编程语言,其重要性不言而喻,是江湖人士必备的内功心法. 正则表达式概要(ob ...

  2. Opencv稍微高级点的鼠标事件-OpenCV步步精深

    今天我们要来点稍微高级的东西.在我们按下鼠标时可以画矩形,而我们按下键盘m键时,切换到画圆的模式,再按下m键,回到画矩形模式. 一起来写下代码,首先当然还是调用库 import cv2 import ...

  3. 「LibreOJ NOI Round #2」签到游戏

    题目 瞎猜一下我们只要\(n\)次询问就能确定出\(\{A_i\}\)来 感受一下大概是询问的区间越长代价就越小,比如询问\([l,n]\)或\([1,r]\)的代价肯定不会超过\([l,r]\) 所 ...

  4. 2018今日头条湖北省赛【H】

    [题目链接]https://www.nowcoder.com/acm/contest/104/G 现场赛的H题,emmm...C++选手表示很伤心.高精度压四位板子WA四发. 题意很简单就是给你n个数 ...

  5. C++之控制内存分配

    一.内存分配方式 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释 ...

  6. css----7渐变

    linear-gradient(90deg,red 10%,yellow 20%,green 30%) <!DOCTYPE html> <html> <head> ...

  7. bzoj1568 Blue Mary

    题意:P:加入一条一次函数.Q:询问x位置的最大函数值. 标程: #include<bits/stdc++.h> using namespace std; ; int q,x,n; dou ...

  8. [JZOJ4331] 【清华集训模拟】树

    题目 题目大意 给你一棵带点权的树,求将树变成一堆不相交的链,而且这些链的权值和非负的方案数. 正解 显然这道题是个\(DP\). 首先求个前缀和\(sum\). 为了后面讲述方便,我这样设:\(f_ ...

  9. jupyter|魔法函数问题| UsageError: Line magic function `%` not found

    问题: jupyter notebook 使用魔法函数% matplotlib inline,报错:UsageError: Line magic function `%` not found 解决: ...

  10. CSS3——2D变形和3D变形

    2D变形(CSS3) transform transform是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.倾斜.缩放,甚至支持矩阵方式,配合过渡和即将学习的动画知识,可以取代大量之前只能 ...