暴力+树状数组维护 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 ...
随机推荐
- CodeForces 703B Mishka and trip
简单题. 先把环上的贡献都计算好.然后再计算每一个$capital$ $city$额外做出的贡献值. 假设$A$城市为$capital$ $city$,那么$A$城市做出的额外贡献:$A$城市左边城市 ...
- ACdream 1064 完美数
数位dp. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #incl ...
- hdu1022
#include <stdio.h>#include <string.h> int main(void){ int n,i,j,k,l; char o1[10],o2[10], ...
- 计算机网络课程优秀备考PPT之第二章物理层(二)
为了记录自己从2016.9~2017.1的<计算机网络>助教生涯,也为了及时梳理和整写笔记! 前期博客是, 计算机网络课程优秀备考PPT之第一章概述(一) 以上是<计算机网络> ...
- 为啥使用Iscroll.js之后,a不能触发点击事件?
原因:是iscroll.js阻止了a的行为. 解决方法:打开iscroll-probe.js,然后找到preventDefaultException方法. 然后修改为: // preventDefau ...
- CascadeType
当Hibernate配置了(JPA注解) cascade = { CascadeType.PERSIST, CascadeType.MERGE } 调用保存时 session.save(user); ...
- CF 602B Approximating a Constant Range
(●'◡'●) #include<iostream> #include<cstdio> #include<cmath> #include<algorithm& ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
- Android 中执行定时任务 Timer + TimerTask
1. new Timer().schedule(new TimerTask() { @Override public void run() { //任务代码 } }, 0, 5000);
- docker的一些命令
转自:http://blog.csdn.net/wsscy2004/article/details/25878363 查看容器的root用户密码 docker logs <容器名orID> ...