<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                該題和紫書上的一道題很相似,都是用滑動窗口來優化DP。 ?紫書上題目見這里:[點擊打開鏈接](http://blog.csdn.net/weizhuwyzc000/article/details/47321975)? ? ? 該題鏈接:[點擊打開鏈接](http://acm.uestc.edu.cn/#/problem/show/1132) 該題也是需要利用滑動窗口優化的。 ? 首先我們很容易想到這樣的狀態表示:d[i][j]表示第i朵花展出時,醬神在位置j處時的最優解。 ?那么我們首先按照時間從小到大排序,這樣相臨兩個時間差乘以速度,就可以知道每次醬神能走的位置范圍,然后狀態轉移過去就行了d[i][j] = max(d[i-1][k]+ a[i].b - abs(j-a[i].a));。但是這樣的復雜度是O(n*n*m)需要優化DP。 對于每一個i和j來說,我們可以發現,其可以轉移到的范圍是j-k*d~j+k*d,對于每一個i,移動范圍相同。而j又是從小到大增加的,這不就是一個滑動窗口嗎? ?所以我們可以用滑動窗口優化第三重循環,在平攤意義下,查詢最小值的復雜度為O(n)。 細節參見代碼: ~~~ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<set> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int INF = 1000000000; const int maxn = 100000+5; const int maxm = 100+5; const double PI = acos(-1.0); int T,l,r,id[maxn]; ll d[maxm][maxn]={0},v[maxn],dd,n,m; struct node { ll a, b, t; bool operator < (const node& rhs) const { return t < rhs.t; } }a[maxn]; int main() { while(~scanf("%lld%lld%lld",&n,&m,&dd)) { for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].a,&a[i].b,&a[i].t); sort(a+1,a+1+m); for(ll i=1;i<=m;i++) { ll t = a[i].t - a[i-1].t; l = 0; r = 0; ll len = min(n,1+t*dd); for(ll k=1;k<=len;k++) { while(l < r && v[r-1] <= d[i-1][k]) r--; //刪除隊列中無用的元素 v[r] = d[i-1][k]; //加入新元素 id[r++] = k; //記錄單調隊列中元素對應的原位置 } for(ll j=1;j<=n;j++) { if(id[l] < j-t*dd) l++; if(j+t*dd <= n) { ll u = j+t*dd; while(l < r && v[r-1] <= d[i-1][u]) r--; v[r] = d[i-1][u]; id[r++] = u; } d[i][j] = v[l] + a[i].b - abs(j-a[i].a); } } ll ans = -INF; for(int i=1;i<=n;i++) ans = max(ans,d[m][i]); printf("%lld\n",ans); } return 0; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看