模擬16 題解

2022-03-16 14:57:18 字數 2531 閱讀 7881

貪心,對於每只青蛙,跳的時候盡量遠,越遠選擇越多

注意若用set實現,要先insert(0)

1 #include2 #include3 #include4 #include5 #include6 #include

7#define r register

8using

namespace

std;

9 inline int

read()

1014

return

x;15}16

const

int maxn=1000005;17

intn,m,d,l;

18set

s;19int

main()

2034

if(d==l)

35int pos=0,ans=0;36

while

(s.size())

3744

set::iterator it=s.upper_bound(pos+d);

45int x=*--it;

46if(x<=pos)break;47

s.erase(x);

48 pos=x;49}

50if(pos+d>=l)ans++;

51if(ans>=m)puts("

excited");

52else printf("

%d\n

",ans);53}

54 }

view code

線段樹:以時間為下標,建一顆線段樹,維護以下資訊:

1.s,這個區間的ans值,就是量2.na,這個區間的當前層數,3.nd這個區間還沒有刪完的層數

那某個區間怎麼會na與nd同時存在?  是因為這個區間中,刪除操作在左面,而增加在右面,刪除操作無法影響後面的,

怎麼維護:讀入初始資料,建樹和修改時,將子節點資訊update到父節點是關鍵,

分三種情況討論,見**注釋

1 #include2 #include3 #include4

#define r register

5#define lc (k<<1)

6#define rc (k<<1|1)

7#define mid ((t[k].l+t[k].r)>>1)

8using

namespace

std;

910 inline int

read()

1115

return

x;16}17

const

int maxn=2e5+5;18

intm,q;

19int

b[maxn],v[maxn];

20struct

nodet[4*maxn];

23int cal(int k,int res)//

k子樹減去res後的s值

2429

void update(int

k)30

36else

if(t[rc].nd==0)//

rc沒減的

3742

else

//左兒子沒被減完

4348}49

void build(int k,int l,int

r)50

59build(lc,l,mid);

60 build(rc,mid+1

,r);

61update(k);62}

63void change(int k,int l,int r,int pos,int bl,int

vl)64

71if(pos<=mid)change(lc,l,mid,pos,bl,vl);

72else change(rc,mid+1

,rc,pos,bl,vl);

73update(k);74}

75int

main()

7688 }

view code

暴力可以水過,本渣渣就不寫正解了,這個坑以後再填

比較好打的暴力:從左上角開始向右列舉每個點放入佇列中,然後從右上角開始,向下然後向左列舉,依次從佇列中填入,$o(q*2*nm)$

優化常數2:對於每一次翻轉,四個點同時轉,這樣常數變為$1/4$

1 #include2 #include3 #include4

#define r register

5using

namespace

std;

6char a[2005][2005],q[4000001

];7 inline int

read()812

return

x;13}14

intmain()

1525

for(r int i=1;i<=q;++i)

2637}38

}39for(r int i=1;i<=n;++i)

44 }

view code

NOIP模擬16 題解

出題人大概已經去為國家處理積壓子彈了?貪心,讓每乙隻青蛙 我慫行吧 都盡量往遠跳,能到達的最遠的被踩了就跳次遠的,以此類推。可以維護乙個單調佇列,表示每只青蛙的位置 開始都是0 然後按順序掃一遍每個石頭,如果隊首的青蛙不能跳過去就放棄它直接pop掉,如果能跳就把石頭位置從隊尾push進去並pop掉隊...

csp模擬 模擬測試16

fdasds include using namespace std define cle a memset a,0,sizeof a inline int read const int mod 1e9 7,maxn 1e3 100 int n,m,ans 0 int f maxn maxn int...

模擬17 題解

t1 a.入陣曲 60 演算法 維護一下某一列的從第一行到這一行和二維字首和 然後列舉上下左右邊界,o n 4 100 演算法 省掉左右邊界的列舉,改為從左向右掃一邊,記錄總和 k的餘數,並放入桶中,可以發現,如果這個值出現過,那說明這個位置的總和減去那個位置的差 即這個區間 是k的正倍數 t2又是...