题目大意:给你一个长度为n的数组a,然后数值大的可以合并数值小的,且合并了以后该数组的长度-1.给你一个长度为k目标数组b,问,是否可以从a数组变到b数组,是就yes并且输出步骤。否就输出no

思路:因为合并的时候要删除某一个数字,很容易想到用树状数组来维护。然后分析一下就可以得到b中第i个数,一定是由a的某一段区间得到的。我们只要找到这一段区间就行啦。

 #include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = + ;
int n, k;
int a[maxn], b[maxn];
int tree[maxn];
vector<pair<int, int> > v; void update(int x, int val = ){
for (int i = x; i <= maxn - ; i += i & -i)
tree[i] += val;
} int sum(int pos){
int ans = ;
for (int i = pos - ; i > ; i -= i & -i){
ans += tree[i];
}
return ans;
} vector<pair<int, char> > ans; void eat(int pos, int lb, int rb){
if (pos == rb || a[pos] > a[pos - ]){
for (int i = pos - ; i >= lb; i--){
int reduce = sum(pos);
ans.push_back(mk(pos - reduce, 'L'));
update(i);
}
for (int i = pos + ; i <= rb; i++){
int reduce = sum(pos);
ans.push_back(mk(pos - reduce, 'R'));
update(i);
}
}
else {
for (int i = pos + ; i <= rb; i++){
int reduce = sum(pos);
ans.push_back(mk(pos - reduce, 'R'));
update(i);
}
for (int i = pos - ; i >= lb; i--){
int reduce = sum(pos);
ans.push_back(mk(pos - reduce, 'L'));
update(i);
}
}
} bool solve(){
a[n + ] = 0x3f3f3f3f;
int lb = ;
for (int i = ; i <= k; i++){
int val = b[i];
for (int j = lb; j <= n; j++){
if (val == a[j]){
v.push_back(mk(lb, j));
lb = j + ;
break;
}
else if (val > a[j]) val -= a[j];
else return false;
}
if (lb > n) break;
}
if (v.size() != k) return false;
for (int i = ; i < v.size(); i++){
int lb = v[i].fi, rb = v[i].se;
int val = a[lb];
bool flag = (rb == lb ? true : false);
for (int j = lb + ; j <= rb; j++){
if (val != a[j]) {
flag = true;
break;
}
}
if (!flag) return false;
}
for (int i = ; i < v.size(); i++){
int lb = v[i].fi, rb = v[i].se;
if (lb == rb) continue;
int maxval = a[lb], pos = lb;
for (int j = lb + ; j <= rb; j++){
if (maxval < a[j]) {maxval = a[j]; pos = j;}
else if (maxval == a[j] && a[j - ] < a[j]) pos = j;
else if (maxval == a[j] && a[j + ] < a[j] && j < rb) pos = j;
}
eat(pos, lb, rb);
}
return true;
} int main(){
scanf("%d", &n);
int sum = ;
for (int i = ; i <= n; i++) scanf("%d", a + i), sum += a[i];
scanf("%d", &k);
for (int i = ; i <= k; i++) scanf("%d", b + i), sum -= b[i];
if (sum != ) printf("NO\n");
else {
bool flag = solve();
if (!flag) printf("NO\n");
else {
printf("YES\n");
for (int i = ; i < ans.size(); i++){
pair<int, char> p = ans[i];
printf("%d %c\n", p.fi, p.se);
}
}
}
return ;
}

暴力+树状数组维护 Codeforces Round #378 (Div. 2) C的更多相关文章

  1. 【树状数组】Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) C. DNA Evolution

    题意跟某道我出的等差子序列求最值非常像…… 反正询问的长度只有10种,你就建立10批树状数组,每组的公差是确定的,首项不同. 然后询问的时候只需要枚举询问串的每一位,找找这一位对应哪棵树状数组即可. ...

  2. 【树状数组】Codeforces Round #755 D. PolandBall and Polygon

    http://codeforces.com/problemset/problem/755/D 每次新画一条对角线的时候,考虑其跨越了几条原有的对角线. 可以用树状数组区间修改点查询来维护多边形的顶点. ...

  3. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 【树状数组维护区间最大值】

    题目传送门:http://codeforces.com/contest/799/problem/C C. Fountains time limit per test 2 seconds memory ...

  4. Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)

    题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...

  5. [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)

    树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...

  6. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  7. POJ 3321 Apple Tree(后根遍历将树转化成序列,用树状数组维护)

    题意:一棵树,有很多分叉,每个分叉上最多有1个苹果. 给出n,接下来n-1行,每行u,v,表示分叉u,v之间有树枝相连.这里数据中u相当于树中的父节点,v相当于子节点. 给出两个操作: 1.C x  ...

  8. 第十二届湖南省赛G - Parenthesis (树状数组维护)

    Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...

  9. LOJ107. 维护全序集【树状数组维护全序集】

    题目描述 这是一道模板题,其数据比「普通平衡树」更强. 如未特别说明,以下所有数据均为整数. 维护一个多重集 S ,初始为空,有以下几种操作: 把 x 加入 S 删除 S 中的一个 x,保证删除的 x ...

随机推荐

  1. SSM

    今天内容安排 1:复习mybatis 2:复习springMVC 3:springMVC+spring+mybatis组合起来,搭建一个web应用开发的框架 4:用户管理系统,针对用户的CRUD操作, ...

  2. js-轮播图

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" charset ...

  3. JMS理解2

    使用JMS 的应用程序被称为JMS 客户端,处理消息路由与传递的消息系统被称为JMS Provider,而JMS 应用则是由多个JMS 客户端和一个JMS Provider 构成的业务系统.发送消息的 ...

  4. Windows10 Apache2.4 PHP7 MySQL 5.7安装教程

    最近细细的折腾了win10下PHP环境的安装过程,每次安装总是有小问题,现在总结一下.安装之前需要注意,下载的安装包(除MySQL)外必须统一是64位或者统一时32位. 一. MySQL5.7的安装 ...

  5. hdu_5878_I Count Two Three(预处理)

    题目链接:hdu_5878_I Count Two Three 题意: 给你一个n,让你找满足那个式子的不比n小的最小数 题解: 先上个预处理,然后二分查找就行 #include<bits/st ...

  6. 1、Web应用程序中的安全向量 -- XSS跨站脚本攻击

    XSS攻击(跨站脚本攻击)的概念: 用户通过网站页面的输入框植入自己的脚本代码,来获取额外的信息. XSS的实现方式: (1)通过用户将恶意的脚本命令输入到网站中,而这些网站又能够接收"不干 ...

  7. Django的使用

    Django使用介绍 1.MTV Django中的MTV分别表示models.templates和views. models文件主要定义数据库的连接. templates文件可以放一些html的模版. ...

  8. [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造

    题意是让你用1到n的数构造24 看完题解感觉被样例骗了…… 很明显 n<4肯定不行 然后构造出来4 5的组成24的式子 把大于4(偶数)或者5(奇数)的数构造成i-(i-1)=1 之后就是无尽的 ...

  9. Erlang的Unicode支持

    在R13A中, Erlang加入了对Unicode的支持.本文涉及到的数据类型包括:list, binary, 涉及到的模块包括stdlib/unicode, stdlib/io, kernel/fi ...

  10. mariaDB安装完成后设置root密码等初始化操作

    修改root密码1.以root身份在终端登陆(必须)2.输入 mysqladmin -u root -p password ex后面的 ex 是要设置的密码3.回车后出现 Enter password ...