CC Functional Array

Posted 吃花椒的妙酱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CC Functional Array相关的知识,希望对你有一定的参考价值。

传送门

题目大意:

 是否存在数组a,使得b是它的子序列,且a的差分数组是z的子序列

思路:贪心+dp

既然a的差分数组是z的子序列,那么b的差分数组也可以通过z组合得到

题目转化成:是否能从左到右从z里选一些区间,满足sum(l,r) = b[i]-b[i-1],对于任意i>1都满足

贪心的从左边找满足的区间,每次找的过程我们手动模拟一下

假设我们现在有z:1,2,3,3....

目标是找sum = 6

对于z数组,我们从左往右扫,相当于每次check所有后缀有无和为sum的,

第一次1,第二次3,2,第三次6,5,3,第四次,9,8,6,6,我们发现每加入一个数x,其他后缀都会+x,因为数的范围都在1e5内,我们可以用bitset优化01背包来实现这个过程

#define _CRT_SECURE_NO_WARNINGS
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <list>
#include <queue>
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <deque>
#include <bitset>
using namespace std;
typedef long long ll;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define scd(v) scanf("%d",&v)
#define scdd(a,b) scanf("%d %d",&a,&b)
#define endl "\\n"
#define IOS ios::sync_with_stdio(false)
#define pb push_back
#define all(v) v.begin(),v.end()
#define int long long
#define odd(x) x&1
#define mst(v,a) memset(v,a,sizeof(v))
#define lson p<<1 ,l,mid
#define rson p<<1|1,mid+1,r
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define pii pair<double,double>
#define inf 0x7f7f7f7f
const int mod = 998244353;
const int N = 1e5 + +10;
int n,m;
int b[N],z[N];
bitset<100010> bt;
void solve()
{
    int flag = 1;
    int x = 1;
    _for(i, 1, n-1)
    {
        flag = 0;
        if (b[i] > b[i + 1])
        {
            break;
        }
        bt &= 0;
        bt[0] = 1;
        while ( x<=m )
        {
            if (b[i] == b[i + 1])
            {
                if (z[x] == 0)
                {
                    flag = 1;
                    x++;
                    break;
                }
            }
            else
            {
                bt |= bt << z[x];
                if (bt[b[i + 1] - b[i]])
                {
                    flag = 1;
                    x++;
                    break;
                }
            }
            x++;
        }
        if (!flag) break;
    }
    if (flag)
    {
        cout << "YES" << endl;
    }
    else
    {
        cout << "NO" << endl;
    }
}
signed main()
{
//    freopen("data.txt","r",stdin);
    IOS;
    int T; cin >> T;
    while (T--)
    {
        cin >> n>>m; 
        _for(i, 1, n) cin >> b[i];
        _for(i, 1, m) cin >> z[i];
        solve();
    }
    
}

以上是关于CC Functional Array的主要内容,如果未能解决你的问题,请参考以下文章

[Functional Programming] Randomly Pull an Item from an Array with the State ADT (Pair)

js代码片段: utils/lcoalStorage/cookie

[TIA PORTAL][CONVERT] Convert Char Array to DInt...DInt to Char Array..Useful and easy function(代码片段

Discuz代码片段

javascript常用代码片段

call/cc 总结 | Scheme