暴力+树状数组维护 Codeforces Round #378 (Div. 2) C
题目大意:给你一个长度为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的更多相关文章
- 【树状数组】Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) C. DNA Evolution
题意跟某道我出的等差子序列求最值非常像…… 反正询问的长度只有10种,你就建立10批树状数组,每组的公差是确定的,首项不同. 然后询问的时候只需要枚举询问串的每一位,找找这一位对应哪棵树状数组即可. ...
- 【树状数组】Codeforces Round #755 D. PolandBall and Polygon
http://codeforces.com/problemset/problem/755/D 每次新画一条对角线的时候,考虑其跨越了几条原有的对角线. 可以用树状数组区间修改点查询来维护多边形的顶点. ...
- 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 ...
- Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)
题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...
- [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)
树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- POJ 3321 Apple Tree(后根遍历将树转化成序列,用树状数组维护)
题意:一棵树,有很多分叉,每个分叉上最多有1个苹果. 给出n,接下来n-1行,每行u,v,表示分叉u,v之间有树枝相连.这里数据中u相当于树中的父节点,v相当于子节点. 给出两个操作: 1.C x ...
- 第十二届湖南省赛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 ...
- LOJ107. 维护全序集【树状数组维护全序集】
题目描述 这是一道模板题,其数据比「普通平衡树」更强. 如未特别说明,以下所有数据均为整数. 维护一个多重集 S ,初始为空,有以下几种操作: 把 x 加入 S 删除 S 中的一个 x,保证删除的 x ...
随机推荐
- linux中找不到/etc/sysconfig/iptables
解决办法初始化iptables. #iptables -F #service iptables save #service iptables restart
- Dubbo.xml配置源-Dubbo.xsd分析
我们使用Dubbo时,一般都会使用xml配置基本信息,如项目名称(application).注册中心(register).协议(protocal).服务(service),如下所示: 1 2 3 ...
- android 图片加载优化,避免oom问题产生
1,及时回收bitmap,在activity的onstop()和onDestory()里面调用如下代码进行bitmap的回收: // 先判断是否已经回收 if(bitmap != null & ...
- BUAA 2014级数据结构第五次上机 二叉树之数组转换广义表
按题意建立好二叉树,再按照先序遍历输出结果. #include<cstdio> #include<vector> #include<queue> #include& ...
- Effective JavaScript :第三章
1.函数调用.方法调用以及构造函数调用只是单个构造对象的三种不同的使用模式. 第一种函数调用模式: function hello(username){ return ‘hello,’+ usernam ...
- 9.hibernate的一对一映射
一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...
- Mysql字符集修改为UTF8
修改/etc/my.cnf,这个文件是安装的时候拷贝过去的 修改方法: [client]下添加 default-character-set=utf8 [mysqld]下添加 character-set ...
- Mysql授权远程登录
在命令行输入如下命令即可: Grant all privileges on *.* to ' with grant option; 再执行 flush privileges
- Linux中如何设置java环境变量
这里介绍Linux下如何设置java环境变量. 工具/原料 Linux java环境变量 方法/步骤 1 查看java的安装路径 查看java执行路径 配置java环境变量 java的安装 ...
- unity 退到桌面的 OnApplicationPause
void OnApplicationFocus( bool isFocus ) { // Debug.Log("--------OnApplicationPause---" + i ...