1. 程式人生 > >HDU6406 Taotao Picks Apples(單調佇列+二分)

HDU6406 Taotao Picks Apples(單調佇列+二分)

當時只差臨門一腳,多了許多罰時,貼個程式碼警示一下;

#include<bits/stdc++.h>
#define MAXN 100000
using namespace std;
int s[100005],a[100005],b[100005],c[100005];
int lis[100005];
struct node {
    int x,y,id;
    bool operator<(const node &z)const {
        return x>z.x;
    }
} xt[100005];
int sum[100005];
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        int n,m;
        memset(s,0,sizeof(s));
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        //memset(lis,0,sizeof(lis));
        scanf("%d%d",&n,&m);
        int maxn=0;
        for(int i=1; i<=n; i++) {
            scanf("%d",&s[i]);
            if(s[i]>maxn) {
                maxn=s[i];
                a[i]=a[i-1]+1;
                c[i]=maxn;
            } else
                a[i]=a[i-1],c[i]=maxn;
        }
        for(int i=0; i<m; i++) {
            int a,b;
            scanf("%d%d",&a,&b);
            xt[i].x=a,xt[i].y=b;
            xt[i].id=i;
        }
        sort(xt,xt+m);
        int head=MAXN,tail=MAXN;
        lis[MAXN]=s[n],maxn=n;
        for(int i=0; i<m; i++) {
            int p=xt[i].x,q=xt[i].y,id=xt[i].id;
            for(int j=maxn; j>=p+1; j--) {
                while(head>=tail&&lis[tail]<=s[j])
                    tail++;
                lis[--tail]=s[j];
            }
            maxn=p;
            if(c[p-1]>=q) {
                int j=upper_bound(lis+tail,lis+head+1,c[p-1])-lis;
                sum[id]=a[p-1]+head-j+1;
            } else {
                int j=upper_bound(lis+tail,lis+head+1,q)-lis;
                sum[id]=a[p-1]+head-j+2;
            }
        }
        for(int i=0; i<m; i++) {
            printf("%d\n",sum[i]);
        }
    }
    return 0;
}

相關推薦

HDU6406 Taotao Picks Apples單調佇列+二分

當時只差臨門一腳,多了許多罰時,貼個程式碼警示一下; #include<bits/stdc++.h> #define MAXN 100000 using namespace std; int s[100005],a[100005],b[100005],c[100

6406】 Taotao Picks Apples單調佇列 + 線段樹(查詢區間第一個大於val的位置)】

Problem Description There is an apple tree in front of Taotao’s house. When autumn comes, n apples on the tree ripen, and Taotao w

HDU 6406 Taotao Picks Apples 【預處理 + 二分 + 思維(rmq || 線段樹)】 多校。 好題!!

傳送門 題意: 題意相當於問你改變一個位置之後,從左往右掃描最大值, 這個最大值會改變多少次. 每次改變獨立 思路:我們首先要預處理出每一個位置從前往後的答案數, 以及字首最大值, 還有從後往前的答案數, 前面兩個可以邊讀入邊處理, 後面那個需要用到單調佇列

2018 Multi-University Training Contest 8&&HDU6406 Taotao Picks Apples【ST表&&LIS】

Taotao Picks Apples Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description Th

51nod 1962 區間計數單調棧+二分

urn amp 單調棧 one pac span img top spa   維護兩個單調遞減的棧,當i加進棧,位置x的數彈出的時候,在另一個棧中找到和這個數一樣大的數,計算貢獻(x-靠右左端點)*(i-x)。 #include<iostream>

[BZOJ1233][Usaco2009Open]乾草堆tower單調佇列優化

傳送門 題意搞skr人…,其實就是堆方塊: 有n(n<=100000)個乾草,每堆有個寬度,現在要且分成若干段,把每一段的乾草按順序堆起來形成一個多層的乾草堆(所以下標越小的乾草堆放在越下面)且寬度要逐層非嚴格遞減(上面一層的寬度<=下面一層的寬度),求最多可以放多少層。

NOIP模擬:最佳序列單調佇列DP

給一個序列,求所有滿足長度在給定 L,R之中的序列的平均值的最大值。 題解:單調佇列+DP。 看到平均值應該想到二分平均值然後再每個數減去這個平均值,此時所有平均值滿足大等於當前二分的平均值

poj 2823 Sliding Window單調佇列模板

介紹單調佇列不錯的部落格:點選開啟連結 還有這題輸出用printf G++交會T,C++就能過.....而用cout兩個都能過..好坑.... 程式碼: #include<cstdio> using namespace std; const int maxn

HDU 640 Taotao Picks Apples & FJUT3592 做完其他題後才能做的題線段樹題解

題意(FJUT翻譯HDU): 錢陶陶家門前有一棵蘋果樹。 秋天來了,樹上的n個蘋果成熟了,淘淘會去採摘這些蘋果。 到園子裡摘蘋果時,淘淘將這些蘋果從第一個蘋果掃到最後一個。 如果當前的蘋果是第一個蘋果,或者它嚴格高於之前選擇的蘋果,那麼淘淘將採摘這個蘋果; 否則,他不會選擇。

HDU 6406 Taotao Picks Apples 預處理+二分

Taotao Picks Apples There is an apple tree in front of Taotao's house. When autumn comes, nn apples on the tree ripen, and Taotao will go to pick th

2018 Multi-University Training Contest 8 1010 Taotao Picks Apples二分

題意:求上升序列(能上升則上升無需最長),有修改操作(盡當時有效),求上升序列長度。 分析:先求出一個原答案,然後把原答案的每個點當做區間端點。 如果新加進來的數不在端點上: 1.介於端點取值之間,ans++ 2.小於左端點,無貢獻 3.大於右端點

HDU 6406 Taotao Picks Apples (單調棧+樹狀陣列統計+離散化)

#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def

P3084 [USACO13OPEN]照片Photo dp+單調佇列優化

題目連結:傳送門 題目: 題目描述 Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always

HDU 3401 TradeDP + 單調佇列優化

任重而道遠 Recently, lxhgww is addicted to stock, he finds some regular patterns after a few days' study. He forecasts the next T days' stock market. On

P1725 琪露諾 題解單調佇列

題目連結 琪露諾 解題思路 單調佇列優化的\(dp\)。 狀態轉移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考慮單調佇列優化。 因為剛學,不是很熟悉單調佇列,特寫一篇詳細的解釋。 \(queue\) 陣列儲存一個佇列,他的頭部和尾

51Nod 1275 - 連續子段的差異單調佇列

【題目描述】 【思路】 固定左端點 i i i,向右尋找一個最遠的右端點

bzoj3316: JC loves Mkk單調佇列+分數規劃

Description Input 第1行,包含三個整數。n,L,R。第2行n個數,代表a[1..n]。 Output 僅1行,表示詢問答案。如果答案是整數,就輸出整數;否則,輸出既約分數“P/Q”來表示。   Sample Input 5 3

HDU 3401 Tradedp+單調佇列優化

Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5843  &

洛谷3594 [POI2015]WIL-Wilcze doły單調佇列

題目 給定一個長度為n的序列,你有一次機會選中一段連續的長度不超過d的區間,將裡面所有數字全部修改為0。請找到最長的一段連續區間,使得該區間內所有數字之和不超過p。 特性 選擇一個區間[i,i+d-1],那麼我們選擇的最長區間一定在這個區間附近,也就是連續的。 題解 單調佇列

Codeforces 1077F2 Pictures with Kittens (hard version)DP+單調佇列優化

題目連結:Pictures with Kittens (hard version) 題意:給定n長度的數字序列ai,求從中選出x個滿足任意k長度區間都至少有一個被選到的最大和。 題解:資料量5000,O(n^3)的DP不適用。需要加個單調佇列優化。 注意每次是從$[i-k,i)$區間,選擇加上ai。每次