列表

详情


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]

上一题