题目大意: 对于给定的一个序列
A
,每个位置上的数字当 大于左边的数字或者右边的数字的时候,他能够将这个数字合并,并且结果为两个数字之和。再给定一个结果序列
思路: 首先
A
序列的某些连续子区间之和等于
#include <cstdio>
#include <string>
#include<iostream>
#include<vector>
#include <stack>
#include <queue>
#include <map>
#include <cstdlib>
#include<string.h>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int, int>pii;
typedef pair<ll, ll> pll;
typedef pair<int, ll> pil;
int main()
{
int n;
vector<ll>v, w;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
ll x;
scanf("%I64d", &x);
v.push_back(x);
}
scanf("%I64d", &n);
for (int i = 0; i < n; i++)
{
ll x;
scanf("%I64d", &x);
w.push_back(x);
}
int p1 = 0;
int flag = 1;
vector<pii>vv;
for (int i = 0; i < w.size(); i++)
{
ll now = 0;
int l = p1, r;
while (p1 < v.size() && now < w[i])now += v[p1++];
if (now != w[i])
{
flag = 0;
break;
}
vv.push_back(pii(l, p1 - 1));
}
if (p1 != v.size())flag = 0;
if (flag)
{
int ch = 1;
vector<pii>kk;
for (int i = 0; i < vv.size(); i++)
{
ll maxx = -1;
for (int j = vv[i].first; j <= vv[i].second; j++)maxx = max(maxx, v[j]);
int gao = -1; int dis = -1;
if (vv[i].second == vv[i].first)gao = vv[i].second;
for (int j = vv[i].first; j <= vv[i].second; j++)
{
if (v[j] != maxx)continue;
if (j != vv[i].first&&v[j]>v[j - 1]){
gao = j, dis = 0; break;
}
if (j != vv[i].second&&v[j] > v[j + 1])
{
gao = j;
dis = 1;
break;
}
}
if (gao == -1)
{
ch = 0;
break;
}
int left = gao - vv[i].first;
int right = vv[i].second - gao;
if (dis == 0)
{
while (left)
{
kk.push_back(pii(i + 1 + left, 0));
left--;
}
while (right--)
{
kk.push_back(pii(i + 1, 1));
}
}
else
{
while (right--)
{
kk.push_back(pii(i + 1 + left, 1));
}
while (left)
{
kk.push_back(pii(i + 1 + left, 0));
left--;
}
}
}
if (ch)
{
puts("YES");
for (int i = 0; i < kk.size(); i++)
{
printf("%d %s\n", kk[i].first, kk[i].second ? "R" : "L");
}
}
else
{
puts("NO");
}
}
else
{
printf("NO\n");
}
return 0;
}