题目

一开始有一个双头队列,每次添加一个数(这是数是二的幂,所有数的和不大于\(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. Python 基础学习20151201

    L = [ ['Apple','Google','Microsoft'], ['Java','Python','Ruby','PHP'], ['Adam','Bart','Lisa'] ] #打印Ap ...

  2. Swift和OC 混编

    1.首先创建一个Swift工程 2.导入或者创建一个OC文件(.h和.m) 3.再创建一个桥连接文件 4.然后文件样子为 5.在桥接链接里面导入头文件 6.通过targets->->bui ...

  3. Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  4. 深夜,用canvas画一个时钟

    深夜,用canvas画一个时钟 查看demo 这几天准备阿里巴巴的笔试,可以说已经是心力交瘁,自从阿里和蘑菇街的内推被刷掉之后,开始越来越怀疑起自己的能力来,虽然这点打击应该是微不足道的.毕竟校招在刚 ...

  5. python成长之路10——socketserver源码分析

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET ipv4(默认) socket.AF_INE ...

  6. phpeclipse

    http://phpeclipse.sourceforge.net/update/stable/1.2.x/

  7. Python 連接 MySQL

    Python 連接 MySQL MySQL 是十分流行的開源資料庫系統,很多網站也是使用 MySQL 作為後台資料儲存,而 Python 要連接 MySQL 可以使用 MySQL 模組.MySQLdb ...

  8. iOS UISearchBar UISearchController

    搜索栏的重要性我们就不说了,狼厂就是靠搜索起家的,现在越来越像一匹没有节操的狼,UC浏览器搜索栏现在默认自家的神马搜索,现在不管是社 交,O2O还是在线教育等都会有一个搜索栏的实现,不过彼此实现效果是 ...

  9. BestCoder Round #57 (div.2)

    第一场BC...感觉还是多参加点比赛吧... 第一题水题各种乱搞就可以过 第二题依旧水题..记个前缀和就行了.. 虽说是2道水题..然而我T1提交时就过了20min, T2还RE了一发..第二次提交就 ...

  10. ZOJ 2968 Difference Game 【贪心 + 二分】

    题意: 有Ga.Gb两堆数字,初始时两堆数量相同.从一一堆中移一一个数字到另一一堆的花费定义为两堆之间数 量差的绝对值,初始时共有钱C.求移动后Ga的最小小值减Gb的最大大值可能的最大大值. 思路: ...