http://acm.hdu.edu.cn/showproblem.php?pid=2227 dp + 線段樹

來源:互聯網
上載者:User

/*<br /> * 說什麼好呢?對於這個題目寫了好幾天 感覺 dp + 線段樹 總有道關卡,一直突破不了,總是在漫無邊際的沼澤掙紮<br /> * 因為這樣心情嚴重受挫<br /> * 區間的維護總是很難跟dp 聯絡在一起,單單的區間維護是會的,但是感覺牽扯上了dp,就什麼都不會了,dp 。。一個字,怕<br /> * 或許掙紮就是收穫吧,漸漸地應該學會如何取分析問題,如何看待wrong<br /> * 一開始敲代碼的時候。我就是完全沒有理解題目,想當然的理解題目是一個悲劇阿<br /> *<br /> * 題目求的是一個序列中非遞減的所有序列組合的和<br /> */<br />#include <iostream><br />#include <cstdio><br />#include <algorithm><br />#include <cstring><br />#define L int<br />#define LL(x) ((x) << 1)<br />#define RR(x) ((x) << 1 | 1)<br />using namespace std;<br />const int N = 100005;<br />const int mod = 1000000007;<br />struct Seg_tree {<br />int l, r;<br /> L sum;<br />int mid() {<br />return (l + r) >> 1;<br />}<br />} tree[3 * N];<br />int pos[N];<br />int df1[N];<br />int df2[N];<br />L dp[N];<br />inline void Build(int l, int r, int node) {<br />tree[node].l = l;<br />tree[node].r = r;<br />tree[node].sum = 0;<br />if (l == r)<br />return;<br />int mid = (l + r) >> 1;<br />Build(l, mid, LL(node));<br />Build(mid + 1, r, RR(node));<br />}<br />inline void Update(int dx, int node, int sum) {<br />if (tree[node].l == tree[node].r && tree[node].l == dx) {<br />tree[node].sum =(tree[node].sum + sum) % mod; // 這裡不加mod wrong,一個區間要保證在mod的範圍<br />return;<br />}<br />/*<br />if (tree[node].sum != -1) {<br />tree[LL(node)].sum = tree[RR(node)].sum = tree[node].sum;<br />tree[node].sum = -1;<br />}<br />*/<br />int mid = tree[node].mid();<br />if(dx <= mid)<br />Update(dx, LL(node), sum);<br />else<br />Update(dx, RR(node), sum);<br />/*<br />if (r <= mid) {<br />Update(l, r, LL(node), sum);<br />} else if (l > mid) {<br />Update(l, r, RR(node), sum);<br />} else {<br />Update(l, mid, LL(node), sum);<br />Update(mid + 1, r, RR(node), sum);<br />}<br />*/<br />tree[node].sum = (tree[LL(node)].sum + tree[RR(node)].sum) % mod; // 區間維護<br />}<br />inline int Query(int l, int r, int node) {<br />if (l <= tree[node].l && tree[node].r <= r) {<br />return tree[node].sum;<br />}<br />/*<br />if (tree[node].sum != -1) {<br />tree[LL(node)].sum = tree[RR(node)].sum = tree[node].sum;<br />tree[node].sum = -1;<br />}<br />*/<br />int mid = tree[node].mid();<br />if (r <= mid) {<br />return Query(l, r, LL(node));<br />} else if (l > mid) {<br />return Query(l, r, RR(node));<br />} else {<br />return (Query(l, mid, LL(node)) + Query(mid + 1, r, RR(node))) % mod ;<br />}<br />}<br />inline int Bin(int x, int len){ // 二分<br />int low = 0;<br />int high = len - 1;<br />while(low <= high){<br />int mid = (low + high) >> 1;<br />if(pos[mid] == x)<br />return mid;<br />if(pos[mid] < x){<br />low = mid + 1;<br />} else{<br />high = mid - 1;<br />}<br />}<br />return -1;<br />}<br />int main() {<br />int n;<br />while(scanf("%d", &n) != EOF){<br />for(int i = 0; i < n; i++){<br />scanf("%d", &df1[i]);<br />df2[i] = df1[i];<br />}<br />sort(df2, df2 + n);<br />int len = 0;<br />for(int i = 0; i < n; i++){<br />if(i == 0 || df2[i] != df2[i - 1])<br />pos[len++] = df2[i];<br />} // 離散化<br />Build(0, len - 1, 1);<br />//memset(dp, 0, sizeof(dp));<br />for(int i = 0; i < n; i++){<br />int r = Bin(df1[i], len);<br />//printf("r :: %d df1[i] :: %d/n", r, df1[i]);<br />L sum = (Query(0, r, 1) + 1 ) % mod;<br />//printf("sum :: %d/n", sum);<br />/*<br />if(sum == 0){<br />sum = 1;<br />dp[r] =( dp[r] + sum) % mod;<br />Update(r, 1, 1);<br />continue;<br />}<br />*/<br />//dp[r] = (dp[r] + sum) % mod;<br />Update(r, 1, sum);<br />}<br />printf("%d/n", Query(0, len - 1, 1));<br />/*// 這裡太麻煩了。。。其實就是統計一個區間的和<br />L sum = 0;<br />for(int i = 0; i < len; i++){<br />//printf("i :: %d dp[i] :: %d/n", i, dp[i]);<br />sum = (sum + dp[i]) % mod;<br />}<br />printf("%d/n", sum);<br />*/<br />}<br />}<br />//9 8 5 32 1 5 4 6 2 1<br /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.