HDU 2836 Traversal Simple DP + 트리 배열
10117 단어 트리 배열
dp[i]는 i를 끝으로 하는 하위 서열이 얼마나 되는지 나타낸다. 알기 쉬운 상태 이동 방정식은 dp[i]=sum(dp[j])+1이다.( abs( height[i] - height[j] ) <= H )
abs(height[i] - height[j]) <= H에서 height[i] - H <= height[j] <= height[i] + H
서열의 수를 이산화하고 각 하이라이트는 하나의 id에 대응하며 트리 그룹으로 구간 [height[i]-H의 id, height[i]+H의 id] 내 dp[j]의 합을 구하고 새로 얻은 dp[i]를 트리 그룹에서 하이라이트[i]의 id에 대응하는 위치로 업데이트합니다.
1 #include <cstdio>
2 #include <cstring>
3 #include <cstdlib>
4 #include <algorithm>
5
6 using namespace std;
7
8 const int MAXN = 100100;
9 const int MOD = 9901;
10
11 int dp[MAXN];
12 int height[MAXN];
13 int num[MAXN];
14 int C[MAXN];
15 int n, d;
16
17 int lowbit( int x )
18 {
19 return x & ( -x );
20 }
21
22 int Query( int x )
23 {
24 int res = 0;
25 while ( x > 0 )
26 {
27 res += C[x];
28 res %= MOD;
29 x -= lowbit(x);
30 }
31 return res;
32 }
33
34 void Add( int x, int v )
35 {
36 while ( x <= n )
37 {
38 C[x] += v;
39 C[x] %= MOD;
40 x += lowbit(x);
41 }
42 return;
43 }
44
45 int main()
46 {
47 while ( ~scanf( "%d%d", &n, &d ) )
48 {
49 for ( int i = 1; i <= n; ++i )
50 {
51 scanf( "%d", &height[i] );
52 num[i] = height[i];
53 }
54
55 sort( num + 1, num + n + 1 );
56 int cnt = unique( num + 1, num + n + 1 ) - num - 1;
57
58 memset( C, 0, sizeof(C) );
59 int ans = 0;
60 dp[0] = 0;
61 for ( int i = 1; i <= n; ++i )
62 {
63 int id = lower_bound( num + 1, num + cnt + 1, height[i] ) - num;
64 int left = lower_bound( num + 1, num + cnt + 1, height[i] - d ) - num;
65 int right = upper_bound( num + 1, num + cnt + 1, height[i] + d ) - num - 1;
66 dp[i] = ( Query( right ) - Query( left - 1 ) + 1 ) % MOD;
67 ans += dp[i];
68 Add( id, dp[i] );
69 }
70
71 if ( ans >= n ) ans -= n;
72 else ans = 0;
73 printf("%d
", ans % MOD );
74 }
75 return 0;
76 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu2227---Find the nondecreasing subsequences (dp+ 트리 배열)Problem Description How many nondecreasing subsequences can you find in the sequence S = {s1, s2, s3, …., sn} ? For exam...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.