NOIP模擬16 題解

2022-03-16 16:57:27 字數 2801 閱讀 1071

出題人大概已經去為國家處理積壓子彈了?

貪心,讓每乙隻青蛙(我慫行吧)都盡量往遠跳,能到達的最遠的被踩了就跳次遠的,以此類推。可以維護乙個單調佇列,表示每只青蛙的位置(開始都是0)。然後按順序掃一遍每個石頭,如果隊首的青蛙不能跳過去就放棄它直接pop掉,如果能跳就把石頭位置從隊尾push進去並pop掉隊首的舊位置,最後佇列的size就是答案。因為你肯定不能可著乙個青蛙往前跳,必須盡量不讓任何乙隻掉隊,所以乙隻跳完之後把它丟到隊尾。

比較神奇的是這道題用stl會比手寫佇列快300ms??

#include#include

#include

#include

using

namespace

std;

const

int n=1e6+5

;int

t,n,m,d,l;

inta[n];

void

work()

if(q.size()==m)puts("

excited");

else printf("

%d\n

",q.size());

}int

main()

stl:deque

#include#include

#include

#include

using

namespace

std;

const

int n=1e6+5

;int

t,n,m,d,l;

inta[n],q[n];

void

work()

if(tail-head+1==m)puts("

excited");

else printf("

%d\n

",tail-head+1);}

intmain()

陣列好題,先咕著

用線段樹維護操作的題還是第一次見

線段樹上的區間指的是一段連續的操作區間,而不是實際的序列

維護$add$(加了多少層)$del$(刪了多少層)$sum$(有多少量)$lsum(被兄弟刪除後的量,僅對左兒子維護)$

$up()$的時候如果左兒子不夠右兒子刪,直接清0即可。但要是右兒子刪不完左兒子就很麻煩了。需要專門設計乙個函式計算當前區間中刪了x個元素的和。

(於是我又懶癌發作了)

#include#include

#include

using

namespace

std;

intread()

while(isdigit(ch))

return x*f;

}const

int n=2e5+55

;#define ls(k) k<<1

#define rs(k) k<<1|1

intm,q;

struct

ques

q[n];

int del[n<<2],add[n<<2],lsum[n<<2],sum[n<<2

];int query(int k,int

val)

void up(int

k)

else

}void build(int k,int l,int

r)

int mid=l+r>>1

; build(ls(k),l,mid);build(rs(k),mid+1

,r);

up(k);

}void update(int k,int l,int r,int pos,int op,int

val)

int mid=l+r>>1

;

if(pos<=mid)update(ls(k),l,mid,pos,op,val);

else update(rs(k),mid+1

,r,pos,op,val);

up(k);

}int

main()

return0;

}

view code

沒有打噁心至極的大常數正解,其實優化暴力+卡常跑出來和正解的時間相差無幾。

%%%whs式迴圈展開 tql 帥過wys

優化暴力的思路就是每層矩形只列舉最上面的那條邊上的點,因為有了這條邊上乙個點的座標就可以完成矩形上四個點的旋轉,所以只列舉一條邊上的點就能完成整個矩形的旋轉。

然後調整邊長和左上角座標,對每層矩形都來一遍就好了。複雜度其實相比最暴力的沒有變,但是迴圈次數少了,相當於一種迴圈展開。

當然還要稍作卡常,$int$轉$char$  $getchar$讀入  $putchar$輸出啥的

#include#include

#include

#define re register

using

namespace

std;

const

int n=3005

;int

n,m,q,x,y,c;

char

a[n][n],b[n][n];

inline

intread()

while(isdigit(ch))x=x*10+ch-'

0',ch=getchar();

return x*f;

}int

main()

while(q--)}}

for(re int i=1;i<=n;i++)

return0;

}

view code

模擬16 題解

貪心,對於每只青蛙,跳的時候盡量遠,越遠選擇越多 注意若用set實現,要先insert 0 1 include2 include3 include4 include5 include6 include 7 define r register 8using namespace std 9 inline...

NOIP模擬20 題解

來自達哥的問候 究級難題,完全不可做qaq include include include using namespace std typedef long long ll int n ll a 25 b 25 c 25 d 25 ans void dfs int step,ll mdx,ll lh...

NOIP 模擬17 題解

部分分很肥,正解寫得常數稍大就會和暴力乙個分,考試的時候寫什麼自己考慮。滑稽 部分分的迴圈邊界手抖寫錯了 25 原本暴力分中的10分都沒了啊啊啊 沒寫掛的話應該有75,其實就是二維字首和 暴力列舉點對統計 a i j 都相等時只枚舉子矩形大小再乘上這種大小出現的次數。正解 sum r sum l 1...