题目

一开始有一个双头队列,每次添加一个数(这是数是二的幂,所有数的和不大于\(2^13\)),由你来决定添加到队头还是队尾。如果队列里面相邻的两个数相同,设它们都是\(x\),那么这两个数会合并为\(2x\)。问所有数添加完后队列里能否只剩下一个数。

算法

搜索题,但是需要巧妙地记录状态!这种题不可多。

一个显然的是,队列里不会存在相邻的三个数\(a,b,c\),满足\(a>b,c>b\)。这样的话,队列肯定是一个倒V字。

记状态\((i,j)\)为添加完前\(i\)个数,\(j\)是倒V左半边的上升序列状态,\(j\)最大是\(2^{13}\)。通过这两个,我们可以算出倒V右半边的序列状态!

这样的话,时间复杂度就是\(O(n 2^{13})\)。

代码

官方的标程有点点小错误。UVALive上的数据也错了。但当时比赛的数据是正确的!

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
#include <assert.h>
using namespace std; template <class T>
void tension(T &a, const T &b) {
if (b < a) a = b;
} template <class T>
void relax(T &a, const T &b) {
if (b > a) a = b;
} typedef long long i64; #ifndef ONLINE_JUDGE
#define ep(...) fprintf(stderr, __VA_ARGS__)
#else
#define ep(...) assert(true)
#endif int n;
int sum[1003], A[1003];
bool vis[1003][(1 << 13) + 1];
char ans[1003];
int highBit[1 << 14]; int place(int a, int b, int x) {
if (highBit[a] > highBit[b]) {
int tmp = highBit[a];
a -= tmp;
b += tmp;
}
if (a && (a & -a) < x) return -1;
a += x;
while (highBit[a] == highBit[b]) {
int tmp = highBit[a];
a += tmp;
b -= tmp;
}
return a;
} bool dfs(int k, int s1) {
int s2 = (k ? sum[k - 1] : 0) - s1; if (k == n) {
if (highBit[s1] > highBit[s2]) {
int tmp = highBit[s1];
s1 -= tmp;
s2 += tmp;
}
if (highBit[s2] > highBit[s1]) {
int tmp = highBit[s2];
s2 -= tmp;
s1 += tmp;
}
if (s1 == (s1 & -s1) && s2 == 0) return true;
if (s2 == (s2 & -s2) && s1 == 0) return true;
return false;
} if (vis[k][s1]) return false;
vis[k][s1] = true; int x = A[k];
int tmp = place(s1, s2, x);
if (tmp != -1 && dfs(k + 1, tmp)) {
//ep("l (%d, %d) %d ->\n", s1, s2, x);
ans[k] = 'l';
return true;
}
tmp = place(s2, s1, x);
if (tmp != -1 && dfs(k + 1, sum[k] - tmp)) {
//ep("r (%d, %d) %d ->\n", s1, s2, x);
ans[k] = 'r';
return true;
}
return false;
} int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("all.in", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
for (int i = 1; i < 1 << 14; i ++)
if ((i & -i) == i) highBit[i] = i;
else highBit[i] = highBit[i - 1]; scanf("%*d");
for (int cases = 1; scanf("%d", &n) == 1; cases ++) {
//ep("Case %d: ", cases);
for (int i = 0; i < n; i ++) {
scanf("%d", A + i);
sum[i] = A[i];
if (i) sum[i] += sum[i - 1];
} //memset(vis, 0, sizeof vis);
for (int i = 0; i < n; i ++)
memset(vis[i], 0, sizeof vis[i]);
if (dfs(0, 0)) {
ans[n] = '\0';
printf("%s\n", ans);
}
else printf("no\n");
} return 0;
}

UVALive 6931 Can't stop playing (Regionals 2014 >> Europe - Central)的更多相关文章

  1. UVALive 6584 Escape (Regionals 2013 >> Europe - Central)

    题目 给出一棵树,每个节点有一个怪物或血药,遇到怪物必须打,打完后扣掉一定的血量. 一开始英雄的血量为\(0\),当血量小于\(0\)时就挂了. 给出英雄的起点和终点,问能否成功到达终点. 算法 这题 ...

  2. Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  3. UVALive 5545 Glass Beads

    Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origin ...

  4. UVALive 2664 One-way traffic

    One-way traffic Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Or ...

  5. UVALive 2957 Bring Them There

    Bring Them There Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. O ...

  6. UVALive 3989 Ladies' Choice

    Ladies' Choice Time Limit: 6000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...

  7. UVALive 5583 Dividing coins

    Dividing coins Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...

  8. UVALive 5292 Critical Links

    Critical Links Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...

  9. BNU 33693——Problemsetting——————【枚举+最大流】

    Problemsetting Time Limit: 5000ms Memory Limit: 131072KB 64-bit integer IO format: %lld      Java cl ...

随机推荐

  1. JavaSE学习总结第11天_开发工具 & API常用对象1

      11.01 常见开发工具介绍 1:操作系统自带的记事本软件 2:高级记事本软件例:Editplus,Notepad++,UltraEdit 3:集成开发环境 IDE(Integrated Deve ...

  2. 解决phpmyadmin配置文件的权限问题

    如果部署的phpmyadmin权限为所有人可写,即权限为777,就会报”Wrong permissions on configuration file, should not be world wri ...

  3. 块元素block,内联元素inline; inline-block;

    block:块元素的特征 div ol li 等: 1.只有高度不设置宽度的时候默认撑满一行: 2.默认块元素不在一行: 3.支持所以CSS命令: inline:内联元素的特征 span i stro ...

  4. hibernate 单元测试 5.2

     单元测试 测试 dao service action package com.kaishengit.test; import org.hibernate.Session; import com.ka ...

  5. Maven 版 JPA 最佳实践

    项目结构图 数据库环境 数据库:MySQL 版本:5.x 数据库名:jpa-demo 用户名密码:root/1234 代码清单 1:数据库脚本: /* Navicat MySQL Data Trans ...

  6. 本地机apache配置基于域名的虚拟主机详解

    1.打开apache的httpd.conf文件,找到# Virtual hosts#Include conf/extra/httpd-vhosts.conf这一段把Include conf/extra ...

  7. 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论

    背景 背景是设计一个实时数据接入的模块,负责接收client的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(兴许提供HBase上的查询),或先持久化到Kafka里.方便兴许进行一些 ...

  8. Android:自己定义输入法(输入password时防止第三方窃取)

    对于Android用户而言.一般都会使用第三方的输入法. 但是,在输入password时(尤其是支付相关的password),使用第三方输入法有极大的安全隐患. 眼下非常多网银类的APP和支付宝等软件 ...

  9. dpkg卸载和安装deb

    今天在linux mint上安装个东西,没有安装完全,但是启动的时候能够启动,为了防止以后出现异常,想把它卸载了,在软件上点卸载,没有反应, 如下图: 没有指定卸载的包源,无奈使用sudo apt-g ...

  10. java读取远程url图片,得到宽高

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100nrb6.html import java.io.IOException;import java.awt ...