劭星
30分做法:暴力列舉
假定查詢l,r最值
**如下:
for(int i=l;i<=r;i++)
滿分做法:
什麼分塊啊、樹狀陣列啊、線段樹啊……都可以
反正這兒沒有設定太嚴格的空間限制
這裡一定要注意,這裡給出的m是自動修復能力值,
所以你還要自己用n減去m求你最多可以銷毀多少個平台
接下來就要求出最小dfs序了
(當然,你也可以直接在樹上跑,這樣子浪費時間,大概得個50分吧)
接著,把求得的序列對映出來,然後對對映出來的做乙個二分答案
怎麼說呢……就是跳石頭那題差不多吧
ps:原本出題思路:就是想出個dfs序的
但是審題的時候發現滿足遞增序列……woc
於是就可以把最小dfs序替換成快排了的
嚶嚶嚶那些老老實實寫了最小dfs序的同學給你們點讚
我也不知道多少分,反正是暴力的做法;
每次刪除陣列中的前導和字尾的0,然後統計剩下的有多少個0小於等於
下一輪每個數依次減去1
這樣的話,假設最高高度為m,那麼時間複雜度就是o(n*m)了
不用想,還是過不了
100分做法:捨去常數的話是o(n)
對於每乙個水槽的邊,可以說其容積為tag(當前水槽的邊上面有多少單位的水),可以是0
第一步:從左往右掃一遍,找到當前位置左邊最高的水槽的邊
第二步:從右往左掃一遍,找到當前位置右邊最高的水槽的邊
第三步:對於每個位置,在那個位置左右最高的邊之中取最小值
這三步是什麼意思呢?
就是說,乙個區域(通俗直**上去就是「水坑」)能夠裝水,取決於區域兩邊的最高峰
可以自己畫圖理解一下,然後對於這個區域裝的最高(注意是高度)的的高度則取決於最低的那個峰(類似於木桶效應)
第四步:用第三步得到的最小值減去當前位置的高度,就可以得到這個水槽的邊上方有多少個單位體積的水(tag)啦!注意:如果差小於1,就不用累計進答案,continue即可
第五步:累計每個水槽的邊的tag,求出答案
還行吧~
這題也是只有滿分的情況
做法:先將字元做乙個對映,比如說a—1,b—2等等
然後這題就變成一道對數列的處理問題了
這裡參(zhai)照(chao)一下我的blog:
2333,順便幫本蒟蒻推廣一下
解法:這裡還是乙個所謂的數學解法
這裡比較玄學,我盡量講明白吧。
先來看解題步驟,最後再解釋:
拿序列3 4 2 1舉例子
1.從右往左找到第乙個反遞增的數a,將這個數所在的位置(下標)記為pos
在這個例子裡頭,a=3,pos=1
2.從右到左找到比a大的第乙個數b
在這裡,b=4
3.交換a和b
例子中的序列就變成了:4 3 2 1
4.將pos右邊的所有數都翻轉(最後一位變為第一位,倒數第二位變為第二位……)
例子中的序列就變成了4 1 2 3
此時的序列就是所求的解
怎麼樣,玄學吧【笑】
看到這裡,還是請自行思考5~10分鐘
一步一步理解(也可以畫圖,也可以論證,理解就行)
我的理解:
我理解了蠻久,大概也是10min這樣才看懂。
第一步,找到a和pos
我們反過來理解,a是右到左反遞增數,那麼說,從右到左在pos之前的一直都是保持遞增的序列
ps:如果沒找到就直接輸出-1,自己想想為什麼
第二步,找到b
這一步還是要連著第三步一起講
第三步:交換a和b
這一步就是使新得到的序列比原序列大,連第二步來說,就是讓新的到的序列在其他比原序列大的序列中盡可能小,因為b是第乙個比a大的數
第四步:pos後面的翻轉
因為pos後的都是遞增,翻轉後就也是遞增,不過方向不一樣,翻轉後的遞增是使b為關鍵的序列最小
我盡力解釋清楚了
附上每一題std**:
第一題:
#include #include #include using namespace std;
int read()
while(ch>='0' && ch<='9')
return x*f;
}int n,m;
struct nodetree[400000+10];
int ans=-1;
int ans2=1000000000;
void down(int k);
void build(int l,int r,int k)
int m=(l+r)>>1;
build(l,m,2*k);
build(m+1,r,k*2+1);
tree[k].maxx=max(tree[2*k].maxx,tree[2*k+1].maxx);
tree[k].minn=min(tree[2*k].minn,tree[2*k+1].minn);
}void find(int k,int x,int y)
if(tree[k].lazy) down(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(x<=mid) find(2*k,x,y);
if(y>mid) find(2*k+1,x,y);
}void down(int k)
int main()
;bool vis[10001];
vectornod[10001];
int from[10001];
int d[10001],w[10001];
int read()
return x;
}int cnt=1;
void dfs(int now)
else
void doit()
cout《第三題:
#include using namespace std;
int n;
int a[100000001]=;
int read()
while(ch>='0' && ch<='9')
return x*f;
}int main()
maxx=a[n];
int ans=0;
for(int i=n;i>=1;i--)
cout《第四題:
#include #include using namespace std;
int read()
while(ch>='0' && ch<='9')
return x*f;
}int n;
void doit()
int pos;
int aa;
int f=0;
for(int i=m;i>=1;i--)
if(a[i]=1;i--)
if(a[i]>aa)
for(int i=1;i<=pos;i++)
coutcout
辭舊迎新,2015咩咩噠
習慣每年都寫總結,但是今年盡然在年前忘記了。可能是2014年真的太忙了,但是2014年確實太不順利了,希望這是給2015年攢人品。雖然2013年過的渾渾噩噩,好在2014年幡然醒悟。先說上半年吧,也就是研一下學期,經過自己的努力,找了乙份recommendation algorithm相關的實習工作...
辭舊迎新,2008,新的自我!
辭舊迎新,2008,新的自我!2007 離我而去,也伴隨著 18年的讀書生涯 回首研究生這幾年,一直想轉型 想進入乙個高效益高利潤的行業 無線通訊的市場是否會隨著3g和 wimax 的發展而膨脹呢?我相信這是未來新的技術增長點,輝煌是遲早的 這也堅定了我進入無線通訊領域的決心 xx將作為我職業發展的...
辭舊迎新 2023年我來了
2014年已經過去了,回顧過去,看走過來的路,歪歪扭扭,但是總的方向還是向前的。這一年,收穫了寶貝女孩,生命中多了一層意義,感覺有了生命的延續,有了乙份責任。這一年,努力掙扎在未來的惶恐中,公司動盪,很多高層和中層領導離職,新的同事和領導融合,鎮痛一直延續。但是也是這一年,花更多的時間泡在csdn中...