第四場膜你賽總結

2021-07-24 11:50:54 字數 3265 閱讀 4274

前言

這場比之前的能做多了qwq

題目+題解

t1 原題:nkoi 3539 移棋子遊戲[6月月賽題a]

【題意】

明明和亮亮在玩乙個遊戲。桌面上一行有n個格仔,一些格仔中放著棋子。明明和亮亮輪流選擇如下方式中的一種移動棋子(圖示中o表示棋子,*表示空著的格仔):

1)當一枚棋子的右邊是空格子的話,可以將這枚棋子像右移動一格。

**o*** -> ***o**

2)當一枚棋子的右邊連續兩個都有棋子,並且這個棋子往右邊數第3格沒有棋子,那麼可以將這個棋子可以跳過去那兩個棋子

**ooo* -> ***oo*

當任何一枚棋子到達最右邊的格仔時,這枚棋子自動消失。當一方不能移動時,這方輸。假設明明和亮亮都採取最優策略,明明先走,誰將取勝?

50%的點n是小於20的,但是我可能先做了第二題,記錯了範圍啊,以為是100,暴力也沒打。就yy了一種方法,其實跟正解有點類似:我的想法就是按棋堆(就是一段連續的棋子)來看,不是看每個棋子。算到每個棋堆到最右邊的步數和,再判奇偶。

正解就直接貼了..

考慮每個棋子到最右邊格仔的距離。把所有棋子這樣的距離的總和計為s。我們發現不管選擇兩種操作中的一種操作,每走一步,s的奇偶性都會發生一次變化。所以說,如果第一次輪到明明時,s是奇數,那麼每次輪到明明時s都是奇數。而當s是奇數時,s肯定》0,這時明明總可以走最右邊的棋子。也就是說當s為奇數時,總有棋子可以走。所以說,一開始若s為奇數,則明明必勝。同理,若一開始s為偶數,則當亮亮走的時候s總是奇數,所以明明必敗。

t2 【題意】

有一塊n *n 的土地上,明明和亮亮站在(1,1)處。每塊地上寫有乙個數字a(i, j)。現在他們決定玩乙個遊戲,每一秒鐘,他們倆走向相鄰且座標變大的格仔(從(x,y)到(x+1,y)或者從(x,y)到(x,y+1)),他們倆可以按照不同方式來走,最後經過2n-1步到達(n,n)處。明明和亮亮每一秒鐘計算他們站的兩個位置上數字的差的絕對值,他們希望這些差值的和最大,請問這個最大的和是多少?

這個剛看完題目和範圍,寫了寫就馬上決定先跳過第一題打第二題先了。經典的dp。設f[k][i][j]表示已經走了k步,明明走到的橫座標為i,亮亮走到的橫座標為j.當然還有其他的狀態表示我就不說了。這樣我們就可以通過這個表示出兩人走了k步後分別所在的座標:(i,k+1-i);(j,k+1-j) -> 設為(x1,y1);(x2,y2)。

那麼狀態轉移的方程就是f[k][i][j]=max(f[k-1][i-1][j-1],f[k-1][i][j-1],f[k-1][i-1][j],f[k-1][i][j])+abs(a[x1][y1]-a[x2][y2]).

時間複雜度是o(n^3).

t3 【題意】

有一塊n*m的草地組成。顯然有的地方草長的好,有的地方長的不好,於是每一塊草都有乙個舒服度 f。

現在明明和亮亮要選定乙個a*b的草場作為晚會的地點,小朋友們就坐在上面,顯然他希望小朋友們坐的最舒服!

不過別急,篝火晚會怎麼能少了篝火呢,篝火需要占用c*d的草地,當然,篝火必須嚴格放置在選定的草地的內部,也就是說,篝火的邊界不能和選定操場的邊界有公共部分。

給定 n*m 大草地每一塊的舒服度,尋找乙個 a*b 的草地,除去乙個嚴格內部的 c*d 的子草地,使得總的舒服度最大。

這道題比賽花的時間最多了。前後打了大概四五個版本(因為怕錯,所以我的**是一步一步越改越快的..),互相對拍= =也是醉。

在打暴力的時候我們會發現,如果能預處理出當我選擇某處的草地時嚴格內部最小的子草地的值的話,我的時間複雜度就能從o(n^4)降到o(n^2)--乙個能接受的時間複雜度。

而由子草地的大小是固定的,就很容易想到滑動的視窗啊,學單調佇列的第一道題!然後直接用啊就好了..

一開始像gdxb那樣想過二維樹狀陣列,也像hyc那樣想過用rmq來維護,但是我都沒有打(因為想到用單調佇列了,感覺這個好打很多啊。

t4 原題-hdu4812

【題意】

嗯點分治啊,我不會啊。。所以要學啊。。

設d[x]為x到重心root的路徑上點權的乘積,那麼滿足條件的點對(x,y)就滿足d[x]*d[y]/d[root]≡k(mod 10^6+3)。也就是d[x]≡k*d[root]*d[y]^(-1) (mod 10^6+3)。因為模數比較小,就可以直接開個陣列存這些k*d[root]*d[y]^(-1)值,於是找其他子樹的時候只需要看看那個陣列裡有沒有和v[x]一樣的值就好了。

然後去做點分治的題了

#pragma comment(linker,"/stack: 102400000,102400000")

#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define maxn 100010

#define mx 1000010

const ll mod=1000003;

struct node

a[maxn*2];

int len,first[maxn];

int siz[maxn];//以某點為根的子樹大小

int sta[maxn],tp;

int s[maxn],sl;//這個就是用來方便清空w陣列 加速而已

bool mark[maxn];//標記重心 那些點成為過重心

ll v[maxn],d[maxn];//v如題意 d為到重心的路徑上點權的乘積

ll w[mx],ny[mx];//w[x]就表示存在x這個值而更新w[x]這個值的點的編號為w[x] ny就是逆元啊

ll kk;int ans1,ans2;

void ins(int x,int y)

ll qk(ll x,ll t)

return ret;

}void dfs_root(int x,int fa,int sum,int &root)//找重心

if (2*(sum-siz[x])>sum) bk=0;

if (bk) root=x;

}void dfs2(int x,int fa)//掃一遍子樹

else if (as1as2)?as2:ans2;

} for (int k=first[x];k!=-1;k=a[k].next) }

void dfs(int x,int sum)

}int main()

{ int n,i,j,x,y;

ny[1]=1;

for (i=2;i

暑期個人賽 第四場 A

時間限制 2000 ms 記憶體限制 65536 kb 大家都回了本部,本部生活雖然沒有巨集福天 mo 堂 gui 般的生活,但是卻有很多外賣,今天有一家飯店新開張,凡是兩個人的餐點費用之和剛好為m可以免運費,在今天一起點外賣且免運送費的兩個人,各自點的外賣 差值最小的有大驚喜。在機房的n個同學今天...

多校賽第三,第四場總結

第三場說多了都是淚,被clj大神虐的妥妥的 結果只出了2題,痛定思痛,絕對怒學suffix automation以秒殺眾多字串題!第四場麼 結果秒強還可以,出了5題。只不過這場我打的有一些搓 第一道簡單dp糾結了很久也沒有做出來,然後最後還剩乙個小時的時候打03那道搜尋被乙個trick坑到了,結果最...

第四場補題(待續)

frog jumping 水 include include include include include include include include include define ll long long define inf 0x3f3f3f3f using namespace std i...