NC229116. 监狱逃亡
描述
勇者为救公主杀入魔塔,不料在魔塔三层遭遇魔王偷袭,失去了神圣剑与神圣盾,而自身也被关入监狱。
监狱是一块的区域,每块格子都有一个价值。勇者目前在监狱的左上角处,而他需要逃亡到监狱的右下角处。
勇者每次可以向右或者向下移动一格,请问勇者逃亡到右下角,其路径价值和大于等于0的不同方法数一共有多少种,答案对取模。
输入描述
第一行一个正整数,。
接下来三行,每行个整数,第行第个整数表示该块格子的价值,。
输出描述
输出勇者逃亡路径价值和大于等于0的不同方法数。
示例1
输入:
2 0 -1 -1 -1 -1 3
输出:
3
C++ 解法, 执行用时: 326ms, 内存消耗: 31688K, 提交时间: 2021-11-12 19:52:05
#include<bits/stdc++.h> #define ll long long using namespace std; int n,cn,ans,tr[1000100];ll a[3][500100],v1[500100],v2[500100],qc[1001000]; const int mod=1e9+7; int sum(int x){ int s=0; for(;x;x-=(x&-x))s+=tr[x];return s; } void add(int x){for(;x<=cn;x+=(x&-x))tr[x]++;} int main(){ cin>>n; for(int i=0;i<3;i++)for(int j=1;j<=n;j++)scanf("%lld",&a[i][j]),a[i][j]+=a[i][j-1]; for(int i=1;i<=n;i++){ v1[i]=a[0][i]-a[1][i-1],qc[++cn]=v1[i], v2[i]=-(a[1][i]-a[2][i-1]+a[2][n]),qc[++cn]=v2[i]; } sort(qc+1,qc+cn+1);cn=unique(qc+1,qc+cn+1)-qc-1; for(int i=n;i;i--){ v2[i]=lower_bound(qc+1,qc+cn+1,v2[i])-qc; v1[i]=lower_bound(qc+1,qc+cn+1,v1[i])-qc; add(v2[i]);(ans+=sum(v1[i]))%=mod; //v1[i]>=v2[j] } return printf("%d",ans),0; } //s1[i]+s2[j]-s2[i-1]+s3[n]-s3[j-1]