HDU 2836 Traversal(세그먼트 트리 + 이산화 + DP)
제목: n개의 서열을 줍니다. 한 개의 서열은 h입니다. 인접수의 차이가 h의 서열을 초과하지 않는 개수와% 9901을 구합니다.
사고방식: 고전적인 물문제는 분명히 d[i]로 a[i]로 끝나는 조건을 만족시키는 서열 개수를 나타낸다.그러면 j=a[i]-h와 같다.이 제한은 라인 트리 아래에 표시된 유지보수를 사용하고 라인 트리는 d[i]의 누적 유지보수를 사용합니다.
자세한 참고 코드:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
typedef long double ld;
const ld eps = 1e-9, PI = 3.1415926535897932384626433832795;
const int mod = 9901;
const int INF = 0x3f3f3f3f;
// & 0x7FFFFFFF
const int seed = 131;
const ll INF64 = ll(1e18);
const int maxn = 100000 + 10;
int T,n,m,sum[maxn<<2],h,d[maxn],a[maxn],b[maxn];
inline void add(int& a, int b) {
a += b;
if(a >= mod) a %= mod;
}
void pushup(int o) {
sum[o] = sum[o<<1] + sum[o<<1|1];
if(sum[o] >= mod) sum[o] %= mod;
}
void build(int l, int r, int o) {
int m = (l + r) >> 1;
sum[o] = 0;
if(l == r) return ;
build(l, m, o<<1);
build(m+1, r, o<<1|1);
pushup(o);
}
void update(int L, int R, ll v, int l, int r, int o) {
int m = (l + r) >> 1;
if(L <= l && r <= R) {
add(sum[o], v); return ;
}
if(L <= m) update(L, R, v, l, m, o<<1);
if(m < R) update(L, R, v, m+1, r, o<<1|1);
pushup(o);
}
int query(int L, int R, int l, int r, int o) {
int m = (l + r) >> 1;
if(L <= l && r <= R) return sum[o];
int ans = 0;
if(L <= m) add(ans, query(L, R, l, m, o<<1));
if(m < R) add(ans, query(L, R, m+1, r, o<<1|1));
pushup(o);
return ans;
}
int main() {
while(~scanf("%d%d",&n,&h)) {
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
b[i-1] = a[i];
}
sort(b, b+n);
int len = unique(b, b+n) - b;
build(1, len, 1);
int ans = 0;
for(int i=1;i<=n;i++) {
int l = lower_bound(b, b+len, a[i]-h) - b + 1;
int r = upper_bound(b, b+len, a[i]+h) - b ;
int pos = lower_bound(b, b+len, a[i]) - b + 1;
d[i] = 1;
add(d[i], query(l, r, 1, len, 1));
add(ans, d[i]-1);
update(pos, pos, d[i], 1, len, 1);
}
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.