考試反思 0305省選模擬38 存在

2022-02-03 02:15:24 字數 3443 閱讀 7378

然而今天沒有第二張圖。 因為我並沒有上榜。。。

離考試結束還有$10$分鐘左右的時候開始嘗試提交,然後斷網了。

然後連了$10$分鐘沒連上,然後就硬核爆零了。

如果交上去的話,打的都打滿了,$24+27+40=91$.是$rk9$

好不到**去。。反正是被這個網嚴重影響了心情。

$t1$大概想到了正解思路但是中途網斷了,重連時候就沒有按照原來的思路想下去。

$t2$一眼發現大概是原題,於是開始想,大概有印象但是具體內容忘掉了,所以打了暴力就走了。

$t3$想到了正解的一部分,但是因為時間不夠以及網路問題沒有繼續深究,拿著比較豐厚的$40$暴力就走了。

然後這麼簡單的一次考試我就爆零了。。。

其實今天狀態也不太好,有一點頭暈&困。然後下午就集中爆發了。

大概在晚上恢復了狀態,壓著時間把三道題都改出來了(得虧題目簡單。。。)

話說仨題兩個字首和乙個差分,出題人想表達什麼。。?

t1:inverse

大意:排列,$k$次操作等概率翻轉乙個區間。求最終逆序對數的期望。$n \le 500,k \le 50$

我轉化成方案數來統計了,一樣的。

設$dp_$表示$i$輪後$p_j > p_k$的方案數。列舉翻轉區間暴力來複雜度是$o(kn^4)$的

然後我們分情況討論,討論翻轉的區間包含了哪個端點,4種情況,每種的轉移點數量都是不超過$o(n)$的,所以複雜度是$o(kn^3)$

然後我們把轉移式子繼續化簡,發現可以使用字首和優化,還是二維的,所以多弄幾個行,列,斜線的字首和優化,時間複雜度就是$o(kn^2)$的了

1 #include2

using

namespace

std;

3#define mod 1000000007

4#define cl(s) memset(s,0,sizeof s)

5int qp(int b,int t,int a=1)

6int mo(int a)

7int px(int x)

8int n,k,p[555],dp[501][501],ans,s1[505][505],s2[505][505],s3[505][505],s4[505][505],s5[505][505],s6[505][505];9

intmain()

26for(int i=1;i<=n;++i)for(int j=i+1;j<=n;++j)ans=mo(ans+dp[i][j]);

27 printf("

%lld\n

",1ll*ans*qp(qp(px(n),k),mod-2)%mod);

28 }

view code

t2:subsequence

大意:數列$a$,對於所有長度$k \in [1,n]$求乙個長為$k$的子串行$b$,最大化$\sum\limits_^ i \times b_i$。$n \le 100000$

原題鏈結

。不一樣的地方在於這次必須是子串行,不能亂序。所以把排序去掉就好了。

還是決策單調性,平衡樹維護差分$dp$陣列,依次插入每個數,然後是區間加之類的。

1 #include2

using

namespace

std;

3#define s 123456

4int n,c[2][s],f[s],sz[s],s[s],rt,pc;long

long

ans,lz[s],w[s],a[s];

5#define lc c[0][p]

6#define rc c[1][p]

7void up(int p)

8void down(int p)

9void spin(int

p)14

void splay(int

p)18

void insert(int

p)25 p=pc; c[d][f[p]=lp]=p; w[p]=a[p]*sz; splay(p);

26 w[rc]+=a[p]; lz[rc]+=a[p];27}

28void dfs(int

p)32

intmain()

view code

t3:convex

大意:凸多邊形,求按照每條對角線劃分後兩部分面積差絕對值之和的2倍。$n \le 2 \times 10^6$

暴力的做法是列舉對角線嘛。

不那麼暴力的話我們發現我們可以只列舉乙個端點,然後我們可以找到乙個分界點,順時針方向都是對角線上方的比較大,逆時針則小。

判斷的條件是面積是否超過整個多邊形的一半。因為是凸多邊形所以隨著你列舉的點遞增分界點也遞增,單調指標就好了。

得到分界點,問題在於求出若干多邊形面積的和。

考慮多邊形面積如何計算:三角剖分。這道題裡為了讓不同的邊之間沒有關聯,我們圍繞原點進行三角剖分。

也就是說某個多邊形面積等於它在原多邊形上,直線與每對相鄰的兩點相連,得到的兩個向量的叉積。

所以問題就轉化到了相鄰的點對上。發現如果當前列舉點為$x$而分界點是$y$那麼$(0,0)-> y-1 \times (0,0) -> y$這對向量叉積累加答案一次。

$(y-2,y-1)$累加$2$次。。。$(x,x+1)$累加$y-x$次。是等差數列。所以維護字首和的字首和,加加減減就好了。

這是在原凸多邊形上相鄰的兩個點做出的貢獻,通過預處理解決了。

剩下沒有考慮的就是對角線兩點的貢獻。發現當你列舉的點確定是,另乙個點是連續的。

你大概要求乙個$\sum\limits_^ x_x y_i - y_x x_i$。很明顯的字首和形式,維護橫縱座標的字首和就好了。

既然已經得到了分界點以及一堆面積小於一半的多邊形的面積,那麼剩下的就都可以大概同理的求出來了。

然後加一些取模優化啥的不然可能被卡常。。大概是沒了。

1 #include2

using

namespace

std;

3#define s 6222222

4#define mod 1000000007

5long

long s[s],s2[s],s1[s],x[s],y[s],ans,ss,x[s],y[s];intn;6

long

long cross(int a,int b)

7long

long cal(int a,int b)

8int

read()

14int mo(int a)

15int

main()printf("

%lld\n

",(ans+mod)%mod*500000004ll%mod);

29 }

view code

考試 省選38

我t2被卡常。笑。t1 這個題和那個zjoi線段樹挺像的。利用期望的線性性,dp出每一對點成為逆序對的概率。然後加起來就是答案了。這樣直接dp是 o n 4k 的。做兩個字首和就可以做到 o n 2k 了。t2打個錶能發現決策如果在 i 可行,那麼在 i 1 也可行。證明的話考慮 選 i 個的話,選...

省選模擬38

這個題考場上打的有點噁心,導致調的時間有點長最後沒優化出來,常數還掛了,被卡成暴力分。考慮dp,令 f i j k 表示第 i 次操作小的點在j大的點在k,最終形成逆序對的方案數。暴力列舉當前選擇的區間的話複雜度是 n 4k 的,仔細看可以發現轉移到的狀態是 o n 的,所以對於每種狀態轉移就是 n...

考試反思 0502省選模擬86 恐懼

還是狀態持續不佳。但是今天沒那麼困,雖說腦子還是不想動。一看到原題就慫,毛病。好像考場上遇到原題的話,得分會比非原題還低。t2 作為原題就直接放棄正解了 然後乖乖的打部分分,結果教練把子任務放錯了於是丟了 15pts 放錯子任務同時也導致 直接輸出 0 能多 20 分。啊人就應該有信仰啊為什麼我沒輸...