정기 대회 101 F AtCoder

주제 링크 : atcoder

각 로봇에 상관없이 자신이이 범위를 벗어나 이동할 수있는 방법입니다, 축이 여러 섹션으로 구분 될 모든 구멍을 고려, 그것은 단지 두 개의 구멍에 빠질 수있는 각 로봇에 달려있다

가장 왼쪽 분명히 독특한 자신의 구멍 프로그램 중 가장 오른쪽에 구멍이없는 로봇, 그래서 우리는 로봇의 나머지 부분을 고려하지 않는 경우, 우리는 튜플 사용 (l_i, r_i) \ (\를 ) 그것은 그에게 나타냅니다 구멍의 가장 가까운 왼쪽 / 오른쪽의 거리, 구멍과 작업의 순서의 위치에 해당 로봇 / 오른쪽은 가장 왼쪽에 도달 할 것이 분명하다.

평평한 모든 투플 만 업 및 우측 접는 선을 달성하기 위해 사용될 수있는 일련의 동작 최 좌측 / 우측 위치 과거 어느 시점에이를 사용한다.도. 이 시점에서 폴리 라인은 왼쪽에있는 구멍에 떨어질 것 배 선 위의 점에서, 오른쪽의 구멍 아래로 떨어질 것이다.

표시된 점의 구석에 자리를 거절 점선은 최종 프로그램의 변화가 발생할 경우에만 우리는 나타났습니다. 그래서 우리가 쓸 수 (f_i \) \ 후 폴리 라인의 마지막 점 나타내는 \ (내가 \) 터닝에서만 포인트로, 그리고 마지막으로 오른쪽으로 이동하는 라인을 망가 프로그램의 수, \ (내가 \) 때문에, 왼쪽 하단을 전사 식을 얻는 것이 곤란
\ [f_i = 1 + \ sum_ {x_j <x_i로부터, y_j <y_i f_j} \]

펜윅 트리 유지 보수 사용하여 더 많은 고전적인 형태 (F \) \를 두 번째 차원에주의를 지불 할 수는 같은과 내림차순으로 정렬하지 않도록해야합니다 \ (X의 \) 와 작은 \ (y를 \) 위치는 선물 할 것이다 생성 된 값 전송

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<math.h>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
const int N=10000;
const db pi=acos(-1.0);
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define fir first
#define sec second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define maxd 1000000007
#define eps 1e-8
int n,m,tot=0,val[100100],rob[100100],hol[100100],tot1=0;
ll f[100100];
pii p[100100];

struct fenwick_tree{
    int a[100100];
    
    void modify(int x,int p)
    {
        for (int i=p;i<=tot;i+=lowbit(i)) a[i]=(a[i]+x)%maxd;
    }
    
    int query(int p)
    {
        int ans=0;
        for (int i=p;i;i-=lowbit(i)) ans=(ans+a[i])%maxd;
        return ans;
    }
}tr;

int read()
{
    int x=0,f=1;char ch=getchar();
    while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
    while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
    return x*f;
}

bool cmp(pii p,pii q) {return ((p.fir<q.fir) || ((p.fir==q.fir) && (p.sec>q.sec)));}

int main()
{
    n=read();m=read();
    rep(i,1,n) rob[i]=read();
    rep(i,1,m) hol[i]=read();
    rep(i,1,n)
    {
        if ((rob[i]<=hol[1]) || (rob[i]>=hol[m])) continue;
        int pos=lower_bound(hol+1,hol+1+m,rob[i])-hol;
        if (hol[pos]==rob[i]) continue;
        p[++tot1]=mp(rob[i]-hol[pos-1],hol[pos]-rob[i]);
        val[++tot]=hol[pos]-rob[i];
    }
    //rep(i,1,n) cout << p[i].fir << " " << p[i].sec << endl;
    sort(val+1,val+1+tot);
    tot=unique(val+1,val+1+tot)-val-1;
    rep(i,1,tot1) p[i].sec=lower_bound(val+1,val+1+tot,p[i].sec)-val;
    sort(p+1,p+1+tot1,cmp);
    tot1=unique(p+1,p+1+tot1)-p-1;
    //cout << endl;
    //rep(i,1,tot1) cout << p[i].fir << " " << p[i].sec << endl;
    rep(i,1,tot1)
    {
        f[i]=tr.query(p[i].sec-1)+1;
        tr.modify(f[i],p[i].sec);
    }
    //rep(i,1,tot1) cout << f[i] << " ";cout << endl;
    ll ans=1;
    rep(i,1,tot1) ans=(ans+f[i])%maxd;
    printf("%lld",ans);
    return 0;
}

추천

출처www.cnblogs.com/encodetalker/p/11618875.html