CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法

来源:互联网 发布:js touchevent 编辑:程序博客网 时间:2024/05/18 17:58

题意:

给你一个数组A,是否能组成给定的数组B

合成规则:

必须是大数合小数,大数和小数后,大数的值变成大数+小数

合成时数字会自动向前补齐

注意:

合成的时候数字的位置会发生改变

思路:

1.

先从左到右划分一遍数组A,如果不能整分,A数组肯定不能被合成B数组。划分后每个区间对应合成B数组中的一个值

2.

再暴搜每一个小区间,看能不能按规则合成出每个区间要合成的那个数。

同时把搜到的可行的方法保存下来

注意:如果有任何一个区间不能合成直接返回NO

3.

最后输出的时候要注意,由于合成的这个过程,数字的位置发生了变化。

我的方法是假设数字不自动移位,只是在合成的过程中将原来的位置留空。那么我们用树状数组做一下查询就可以知道前面空了几个位置。

原来的位置减去前面的空位置就是当前的位置。

代码:

#include <bits/stdc++.h>using namespace std;typedef struct Node{    int pos;    int dir;    Node(int po,int di){        pos=po;        dir=di;    }}Node;const int MAXN=600;int c[MAXN];int lowbit(int x){    return x&(-x);}void modify(int x,int add){    while(x<=MAXN){        c[x]+=add;        x+=lowbit(x);    }}int get_sum(int x){    int ret=0;    while(x!=0){        ret+=c[x];        x-=lowbit(x);    }    return ret;}int n,a[MAXN],b[MAXN],m;int st,en,v;bool dfsflag;int cuuuut;int sub[MAXN];vector <Node> ans[MAXN];void ini(){    memset(c,0,sizeof(c));    for(int i=0;i<n;i++) scanf("%d",&a[i]);    scanf("%d",&m);    for(int i=0;i<m;i++) scanf("%d",&b[i]);    for(int i=0;i<m;i++)        ans[i].clear();    cuuuut=0;    sub[0]=0;}int divi(int cut,int pos){    int sum=0;    for(int i=pos;i<n;i++){        sum+=a[i];        if(sum==cut){            return i+1;        }else if(sum>cut){            return 0;        }    }    return 0;}void dfs(int sum,int pos,int le,int ri,vector<Node>way){    if(pos<st||pos>en) return ;    sum+=a[pos];    if(dfsflag||sum==v){        dfsflag=1;        ans[cuuuut++]=way;        return;    }    if(a[le]<sum){        vector<Node>lway=way;        lway.push_back(Node(pos,0));        dfs(sum,le,le-1,ri,lway);    }    if(dfsflag) return ;    if(a[ri]<sum){        vector<Node>rway=way;        rway.push_back(Node(pos,1));        dfs(sum,ri,le,ri+1,rway);    }    return ;}bool judge(){    dfsflag=0;    for(int i=st;i<=en;i++){        vector<Node>way;        way.clear();        dfs(0,i,i-1,i+1,way);        if(dfsflag) return 1;    }    return 0;}bool sovle(){    int pos=0;    for(int i=0;i<m;i++){        int res=divi(b[i],pos);        if(!res)            return 0;        else{            v=b[i];            st=pos;            en=res-1;            sub[cuuuut+1]=en-st;            if(judge())                pos=res;            else                return 0;        }    }    if(pos==n)        return 1;    return 0;}void output(){    for(int i=0;i<m;i++){        vector<Node>::iterator it;        for(it=ans[i].begin();it!=ans[i].end();it++){            if(it->dir){                int pos=it->pos+1;                cout<<pos-get_sum(pos)<<' '<<'R'<<endl;                modify(pos,1);            }            else{                int pos=it->pos+1;                cout<<pos-get_sum(pos)<<' '<<'L'<<endl;                modify(pos,1);            }        }    }}int main(){    while(cin>>n){        ini();        if(!sovle())            cout<<"NO"<<endl;        else{            cout<<"YES"<<endl;            output();        }    }}

C. Epidemic in Monstropolis
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

There was an epidemic in Monstropolis and all monsters became sick. To recover, all monsters lined up in queue for an appointment to the only doctor in the city.

Soon, monsters became hungry and began to eat each other.

One monster can eat other monster if its weight is strictly greater than the weight of the monster being eaten, and they stand in the queue next to each other. Monsters eat each other instantly. There are no monsters which are being eaten at the same moment. After the monster A eats the monster B, the weight of the monster A increases by the weight of the eaten monster B. In result of such eating the length of the queue decreases by one, all monsters after the eaten one step forward so that there is no empty places in the queue again. A monster can eat several monsters one after another. Initially there were n monsters in the queue, the i-th of which had weight ai.

For example, if weights are [1, 2, 2, 2, 1, 2] (in order of queue, monsters are numbered from 1 to 6 from left to right) then some of the options are:

  1. the first monster can't eat the second monster because a1 = 1 is not greater than a2 = 2;
  2. the second monster can't eat the third monster because a2 = 2 is not greater than a3 = 2;
  3. the second monster can't eat the fifth monster because they are not neighbors;
  4. the second monster can eat the first monster, the queue will be transformed to [3, 2, 2, 1, 2].

After some time, someone said a good joke and all monsters recovered. At that moment there were k (k ≤ n) monsters in the queue, the j-th of which had weight bj. Both sequences (a and b) contain the weights of the monsters in the order from the first to the last.

You are required to provide one of the possible orders of eating monsters which led to the current queue, or to determine that this could not happen. Assume that the doctor didn't make any appointments while monsters were eating each other.

Input

The first line contains single integer n (1 ≤ n ≤ 500) — the number of monsters in the initial queue.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 106) — the initial weights of the monsters.

The third line contains single integer k (1 ≤ k ≤ n) — the number of monsters in the queue after the joke.

The fourth line contains k integers b1, b2, ..., bk (1 ≤ bj ≤ 5·108) — the weights of the monsters after the joke.

Monsters are listed in the order from the beginning of the queue to the end.

Output

In case if no actions could lead to the final queue, print "NO" (without quotes) in the only line.

Otherwise print "YES" (without quotes) in the first line. In the next n - k lines print actions in the chronological order. In each line print x — the index number of the monster in the current queue which eats and, separated by space, the symbol 'L' if the monster which stays the x-th in the queue eats the monster in front of him, or 'R' if the monster which stays the x-th in the queue eats the monster behind him. After each eating the queue is enumerated again.

When one monster eats another the queue decreases. If there are several answers, print any of them.

Examples
input
61 2 2 2 1 225 5
output
YES2 L1 R4 L3 L
input
51 2 3 4 5115
output
YES5 L4 L3 L2 L
input
51 1 1 3 332 1 6
output
NO
Note

In the first example, initially there were n = 6 monsters, their weights are [1, 2, 2, 2, 1, 2] (in order of queue from the first monster to the last monster). The final queue should be [5, 5]. The following sequence of eatings leads to the final queue:

  • the second monster eats the monster to the left (i.e. the first monster), queue becomes [3, 2, 2, 1, 2];
  • the first monster (note, it was the second on the previous step) eats the monster to the right (i.e. the second monster), queue becomes [5, 2, 1, 2];
  • the fourth monster eats the mosnter to the left (i.e. the third monster), queue becomes [5, 2, 3];
  • the finally, the third monster eats the monster to the left (i.e. the second monster), queue becomes [5, 5].

Note that for each step the output contains numbers of the monsters in their current order in the queue.




0 0
原创粉丝点击