1. 程式人生 > >2018/3/12

2018/3/12

太多的 決定 OS 就是 十分 實現 push 同時 上一條

  今天全是神題啊。。。。。。。

T1 遊戲

  一開始一看題還以為是什麽不平等博弈,但是後來下YY了一下,然後打了一波記憶化搜索,居然過了大樣例,然後覺得這個搜索應該是對的,應該有60分,然後看了一眼時間,已經一個小時了,然後就決定先看看別的題,再來優化優化。

  然後最後也沒有時間來搞T1了

  然後這個搜索也不太對,只有50分

  正解其實也是可以是搜索,但是要針對於每一個點來搜索,記憶化一波應該就可以過了,但是這樣弄起來細節很多,還有一種更加清真的算法,就是從已有的狀態來推位置的狀態,就是如果一個必敗態到的所有點都是必勝態,然後如果一個必勝態指向另一個狀態,就把這個狀態的點度數++,如果度數滿了,那麽就說明自己這個點也是必敗的,然後就把他也扔到隊列了就好了,對於剩下沒有確定狀態的點就都是loop,其實也是很好證明的,如果一個點沒有確定狀態,那麽這個點一定不能到達一個必敗態,而且它沒有被所有的必勝態填滿,那麽當前這個點的最優策略就是走環了。。

T2 樹

  這個題的暴搜我居然沒有想到,有一種就是根據prufer序列來搜,然後判一下便就好了,還有一種就是枚舉存在哪些邊,然後用矩陣樹來統計一下就好了,然後剩下三十分的部分分用矩陣數也是很好弄的;

  正解就是考慮矩陣樹乘出來的是每一種生成樹邊權乘積的和,那麽就可以把原樹中的邊邊權設為1,然後剩下的邊設為x,那麽矩陣樹乘出來就是一個多項式,然後x^k項前面的系數就是表示不選k條原樹中的邊的方案數,然後就是跑n遍矩陣數,求出n個點值,然後插值求多項式就好了。。。。。然而我並不會多項式插值

  但是這個東西其實也可以高斯消元來求解,就是類似的構造n個方程,然後解一下系數就好了。

T3 序列

  這個題相當神啊。。。。。。

  學了一個50分的做法就覺得神的不行。 

  可以考慮用KD-Tree,就是把每一個詢問看作是一個點,x=l,y=r, 然後這麽建出KD-Tree來,然後把所有的點從小到大排序,然後依次放到KD-Tree上跑,如果 pos < mn_l || pos>mx_r 那麽就return, 如果 pos>=mx_l && pos<=mn_r ,那麽就對這個節點大上標記, 剩下的情況就是繼續遍歷兒子就好了。

  然後這個標記的話要有4個,lst,mn,mx,ans, 分別表示能放入這個點表示的詢問的最大值,滿足這顆子樹的最小值,最大值,以及這些樹能產生的最優貢獻,然後就是Pushdown的時候,在更新兒子的標記的同時,要拿父親的mn,和兒子的mx取一下答案,然後註意一下邊界情況就好了(說起來很簡單,碼起來可真不太容易)。

  正解的話 就是能與i形成點對的j,要求i<j&&a[i]<a[j],(就是正著來一遍,反著來一遍)那麽當我們再一次找到一個j'的時候且j'能與i組合產生更優的貢獻的話,就要求a[j']<a[j],然後再考慮,如果a[j']-a[i]>a[j]-a[j']的話,那麽反著來的時候,a[j]與a[j’]產生的貢獻顯然更優,那麽就可以再加上一條限制,就是a[j']-a[i]<a[j]-a[j']

  移一下項就是a[j‘]<(a[i]+a[j])/2,那麽我們就可以發現對於每一個a[i],最多有 logw 個可以產生貢獻的j,然後我們把所有的詢問按左端點排序,然後從右向左枚舉點,在用主席樹來找出 log 個能與他產生貢獻的點,然後把差值放到一個樹狀數組裏,然後最後到一個左端點的時候,到樹狀數組裏查一下答案就好了。

  總結一下,T1太相信大樣例了!!!,其實可以自己手造幾個小一些的樣例,或者想一些極端一點的情況卡一卡自己,如果不是數據結構題的話,大樣例可能會很弱。

  T2的話就是想那個搜索想了太長的時間,浪費了很多的時間,還是有一些小的知識點掌握的不夠好,

  T3就是沒有怎麽想,主要是T2浪費了太多的時間,感覺莫隊掌握的不太好啊。。。。。。。。。。。。

  還有就是碼力好弱啊。

  感覺別人的代碼大好清真啊,自己的好醜啊。

  還是多學學別人高效的實現方法吧。

2018/3/12