第11周訓練總結

本週心得:差不多已經習慣了熬夜,從原來10點半準時睡覺到10點半準時打開CF……

就這周的三場比賽而言感覺挺穩定的,第一場Div2的半個小時多一點做出前兩到,被C題卡住,至於第二場Unrated的那場最後一個題只能過樣例;至於昨晚的一場,emmmm精神狀態不太好,本來不想打的,但從來沒參加過Div4的我還是想去試一下(其實是上星期掉分太猛了,這星期前面兩場又不記分),總的來說題目少了點拐彎抹角,考察思維和動手能力(說白了就是模擬,僅僅對我這樣的而言找不出規律只能模擬),

這場進去的晚了一點,不過也沒有很晚,榜首都A完A題的樣子,然後我就被A題卡住了,最後無奈只能暴力,差不多還是半個小時左右做出了前兩個,C題用數學,感覺很簡單就放了一下,然後D題又是暴力,不過碼字真的太慢了,剩下的時間都是D題的,最後10分鐘還剩才寫完,可最後還是隻過了樣例,但是腦子真的很混亂了當時,就差一點點,愣是沒找出錯誤來,最後結果以做出兩道收尾。

 

這周就總結一下這周所學的單調棧和數論吧

                           

 

(1)當新元素在單調性上優於棧頂時(單增棧新元素比棧頂大,單減棧新元素比棧頂小),壓棧,棧深+1;

(2)當新元素在單調性與棧頂相同(新元素於棧頂相同)或劣於棧頂時(單增棧新元素比棧頂小,單減棧新元素比棧頂大),彈棧,棧深-1;//  如果題目要求嚴格單調的話

比如:有一組數10,3,7,4,12,22。從左到右依次入棧,則如果棧爲空或入棧元素值小於棧頂元素值,則入棧;

否則,如果入棧則會破壞棧的單調性,則需要把比入棧元素小的元素全部出棧。單調遞減的棧反之。

  1.     10入棧時,棧爲空,直接入棧,棧內元素爲10。

  2.     3入棧時,棧頂元素10比3大,則入棧,棧內元素從下往上依次爲10,3。

  3.     7入棧時,棧頂元素3比7小,則棧頂元素出棧,此時棧頂元素爲10,比7大,比較完成,最後7入棧,棧內元素從下往上依次爲10,7。

  4.     4入棧時,棧頂元素7比4大,則入棧,棧內元素從下往上依次爲10,7,4。

  5.     12入棧時,棧內元素都比12小,所以依次彈出:棧頂元素4比12小,4出棧,此時棧頂元素爲7,仍比12小,棧頂元素7繼續出棧,此時棧頂元素爲9,仍比12小,出棧,9此時棧爲空,12入棧,棧內元素只有12。

  6.      2入棧時,因爲比100小,所以什麼事情都不會發生

                                                                                                         轉載至:https://blog.csdn.net/lucky52529/article/details/89155694

 下面看一個例題:

Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads.

Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.

Consider this example:

        =
=       =
=   -   =         Cows facing right -->
=   =   =
= - = = =
= = = = = =
1 2 3 4 5 6 

Cow#1 can see the hairstyle of cows #2, 3, 4
Cow#2 can see no cow's hairstyle
Cow#3 can see the hairstyle of cow #4
Cow#4 can see no cow's hairstyle
Cow#5 can see the hairstyle of cow 6
Cow#6 can see no cows at all!

Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.

Input

Line 1: The number of cows, N.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.

Output

Line 1: A single integer that is the sum of c1 through cN.

Sample Input

6
10
3
7
4
12
2

Sample Output

5

題目大意 :依次給出n個數,找出從這個數開始到後面第一個大於他的數之間共有幾個數x,將每一個數對應的x相加

思路:看到這個題的第一眼,就可以看出要構成單調遞減序列,棧內的某一個數每多保留一會,那麼就證明當前的數比棧內的數要小

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
using namespace std;
typedef __int64 ll;
const int idata=1e3+5;

int n,m,t,_;
int i,j,k;
int cnt,num,ans;
int minn,maxx;
stack<int>stk;
priority_queue<ll,vector<ll>,less<ll> >q;
map<ll,int>mp;
vector<int>v;

int main()
{
    cin.tie(0);
    iostream::sync_with_stdio(false);
    while(cin>>n)
    {
        ll num=0;
        for(i=1;i<=n;i++){
            cin>>_;
            while(!stk.empty()&&_>=stk.top()){
                stk.pop();
            }
            num+=stk.size();
            stk.push(_);
        }
        cout<<num<<endl;
    }
    return 0;
}

 第二部分:數論

剛剛接觸數論 ,說實話,我對數學還是挺感興趣的(雖然後來才發現我喜歡的是做數學題,而不是真正喜歡數學),這次就簡單介紹一下素數篩,畢竟有些思路還是不大清楚

 
埃氏篩

這種篩法應該是是效率相對比較高(下文會解釋),而且很好理解的篩法。

試除法是用原數去嘗試諸多因子,那對於求一個範圍(比如1~N)的所有素數,顯然上述方法是不可取的。

那我們反向思考,嘗試枚舉因子去排除素數(即標記合數)。

枚舉2~N,並且用2~N的倍數去標記合數,比如枚舉到i,那2*i,3*i,4*i······,全部都標記爲合數,直到k*i>N。(這樣將2,3,5的倍數去掉後,剩下的合數就很少了,所以效率相對較高)

掃到數x時,看它是否有合數標記,如果沒有,則說明2~x-1的數中,都沒有它的因數,顯然x-1>√x(x>2),所以x爲質數。

                                                                                                                  轉載至:https://www.cnblogs.com/NSD-email0820/p/9490828.html

 

void isPrime(int n)
{
    memset(v,0,sizeof(v));//假設全是素數,無合數 
    for(int i=2;i<=n;i++)
    {
        if(!v[i])
        {
            prime[++cnt]=i;
            for(int j=i*i;j<=n;j+=i)
            v[j]=1; 
        }
    }
}

爲什麼是從i*i開始篩呢?

因爲當掃i的時候   2~i-1   的倍數已經全部被篩了,沒必要再篩i的2~i-1倍的數,可以直接從i*i開始篩了。

 

這周看起來許學的不多 ,但是很碎,至於CF,就像昨晚那一場來說,其實完全可以避免最後因時間不夠而後悔的情況,對題目的選擇也是比賽場上能力的一部分,要進步的地方還是蠻多的。目前爲止就總結這些,還有因數分解,有幾道例題還沒想明白(正應了之前那一句,靠題目來理解知識點)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章