暴力+树状数组维护 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 ...
随机推荐
- Windows下WordPress搭建博客过程
搭建环境:Win7 + XAMPP5.5 + wordpress4.5.1 官网下载安装包,解压,拷贝到网站根目录(D:\IT\XAMPP5.5\htdocs\),重命名为blog(随意) 创建数据库 ...
- zoj 2750 Idiomatic Phrases Game
迪杰斯特拉单源最短路算法.对成语进行预处理.做出邻接矩阵即可. #include<cstdio> #include<cstring> #include<cmath> ...
- Black Jack
Black Jack 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5602 记忆化搜索 用dp[0][i][j]记录当player为i,banker为 ...
- CSS3秘笈复习:第十一章
1.text-align与vertical-align: text-align控制水平方向的定位,关键字是left.right.center和justify. vertical-align控制垂直方向 ...
- bootstrap复习:组件
一.下拉菜单 1.实例:将下拉菜单触发器和下拉菜单都包裹在 .dropdown 里,或者另一个声明了 position: relative; 的元素.然后加入组成菜单的 HTML 代码.为下拉菜单的父 ...
- OSCache 使用
引入OSCache的jar包 package com.sun.utils; import java.util.Date; import com.opensymphony.oscache.base.Ne ...
- infix to postfix 完整版
#include<iostream> #include<stack> #include<string> #include<deque> using na ...
- Zmodem协议
Zmodem文件传输协议 做zeppelin测试时,自己安装了虚拟机,发现一个在linux和windows之间特别方便的命令行rz/sz工具. Install # 由于虚拟机不能上网,所以先挂载镜像. ...
- HDU 1264 Counting Squares(模拟)
题目链接 Problem Description Your input is a series of rectangles, one per line. Each rectangle is speci ...
- LeetCode OJ 33. Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...