题目大意:给你一个长度为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. 在Pythonanywhere上部署Django

    1 在github上创建一个仓库blog 2 克隆到本地,添加Django项目,再推送到github 3 克隆到pythonanywhere,以后每次更新用git pull即可 4 在pythonan ...

  2. linux安装gcc-c++

    首先查看系统是否安装: gcc -v    g++ -v    c++ -v 没有安装则执行一键安装命令:#yum install gcc-c++ 如果直接执行:#yum install c++是安装 ...

  3. Arduino使用注意问题及编程相关

    1.Arduino的概念 arduino是一款便捷灵活方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE), 是一个基于开放原始码的软硬件平台,构建于开放 ...

  4. UITableView控制头部View

    首先我们先集成一个UIView做一个自己的View #import <UIKit/UIKit.h> @interface MyView : UIView @property (nonato ...

  5. hdu_4283_You Are the One(区间DP)

    题目链接:hdu_4283_You Are the One 题意: 有n个人,每个人有个屌丝值,如果果他是第K个上场,不开心指数就为(K-1)*D,然后有个小黑屋,可以调整他们的出场顺序,现在让你调整 ...

  6. C程序浅议

    文件FILE是程序设计中的一个重要概念.所谓“文件”一般是指存储在外部介质上的数据的集合.操作系统是以文件为单位对数据进行管理的,而文件是以文件名为标识的.操作系统对文件实行“按名存取”. C语言把文 ...

  7. Cmake常用指令

    1. cmake_minimum_required(VERSION 2.8)           检查cmake的版本,至少为2.8 2. project(helloworld)           ...

  8. 二维小波包分解wpdec2

    load woman; %小波包2尺度(层)分解 t=wpdec2(X,2,'haar'); plot(t);%绘制小波包树 %提取(1,2)处结点.也可以点击上图结点,观察 c12=wpcoef(t ...

  9. [ An Ac a Day ^_^ ] CodeForces 339A Helpful Maths

    熄灯了才想起来没写博客 赶紧水一道题碎觉…… #include<stdio.h> #include<iostream> #include<algorithm> #i ...

  10. CodeForces 605A Sorting Railway Cars 思维

    早起一水…… 题意看着和蓝桥杯B组的大题第二道貌似一个意思…… 不过还是有亮瞎双眼的超短代码…… 总的意思呢…… 就是最长增长子序列且增长差距为1的的…… 然后n-最大长度…… 这都怎么想的…… 希望 ...