ARC101FRobots and Exits 树状数组优化DP

Posted 812-xiao-wen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARC101FRobots and Exits 树状数组优化DP相关的知识,希望对你有一定的参考价值。

题面



\(solution:\)

先咕着,吃完饭再写。



\(code:\)

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>

#define ll long long
#define db double
#define rg register int

using namespace std;

const int mod=1e9+7;//998244353;

int n,m;
int tt,ans=1; //注意赋了初值1
int a[500005];
int b[500005];
int k[500005]; //离散化
int f[500005]; //计数
int tr[500005]; //树状数组

struct su
    int x,y;
    inline bool operator <(const su &z)const
        if(y==z.y)return x>z.x;
        return y<z.y;
    
s[500005];

inline int qr()
    register char ch; register bool sign=0; rg res=0;
    while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
    while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
    if(sign)return -res; else return res;


inline void add(int x,int v) //树状数组加入
    for(;x<=tt;x+=x&-x) (tr[x]+=v)%=mod;


inline int ask(int x) //树状数组查询
    rg res=0;
    for(;x;x-=x&-x) (res+=tr[x])%=mod;
    return res;


int main()
    //freopen("robot.in","r",stdin);
    //freopen("robot.out","w",stdout);
    n=qr(); m=qr();
    for(rg i=1;i<=n;++i) a[i]=qr();
    for(rg i=1;i<=m;++i) b[i]=qr(); //已经按顺序排序
    for(rg i=1,j=1;i<m&&j<=n;++i)
        while(j<=n&&a[j]<=b[i])++j; //找到中间的第一个机器人
        if(j>n)break;
        while(j<=n&&a[j]<b[i+1]) //遍历所有在中间的机器人
            k[++tt]=a[j]-b[i]; //k数组是用来离散化的
            s[tt]=suk[tt],b[i+1]-a[j]; ++j; //记录左右距离
        
     sort(k+1,k+tt+1); //离散化
    for(rg i=1;i<=tt;++i)
        s[i].x=lower_bound(k+1,k+tt+1,s[i].x)-k; //离散化
    sort(s+1,s+tt+1); //按纵坐标从小到大,横坐标从大到小
    for(rg i=1;i<=tt;++i)
        if(s[i].x==s[i-1].x&&s[i].y==s[i-1].y)continue; //去重!
        f[i]=(ask(s[i].x-1)+1)%mod; //只有横坐标比它小的才可以转移
        ans=(ans+f[i])%mod; //计入答案
        add(s[i].x,f[i]); //加入树状数组
    
    printf("%d\n",ans);
    return 0;

以上是关于ARC101FRobots and Exits 树状数组优化DP的主要内容,如果未能解决你的问题,请参考以下文章

Solution -「ARC 101D」「AT4353」Robots and Exits

Atcoder ARC101 E 树dp

Virtualization and Performance: Understanding VM Exits

题解-AtCoder ARC-078F Mole and Abandoned Mine

python ARC101 E.

arc101比赛记录