貪心,對於每只青蛙,跳的時候盡量遠,越遠選擇越多
注意若用set實現,要先insert(0)
1 #include2 #include3 #include4 #include5 #include6 #includeview code7#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 }
線段樹:以時間為下標,建一顆線段樹,維護以下資訊:
1.s,這個區間的ans值,就是量2.na,這個區間的當前層數,3.nd這個區間還沒有刪完的層數
那某個區間怎麼會na與nd同時存在? 是因為這個區間中,刪除操作在左面,而增加在右面,刪除操作無法影響後面的,
怎麼維護:讀入初始資料,建樹和修改時,將子節點資訊update到父節點是關鍵,
分三種情況討論,見**注釋
1 #include2 #include3 #include4view code#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 }
暴力可以水過,本渣渣就不寫正解了,這個坑以後再填
比較好打的暴力:從左上角開始向右列舉每個點放入佇列中,然後從右上角開始,向下然後向左列舉,依次從佇列中填入,$o(q*2*nm)$
優化常數2:對於每一次翻轉,四個點同時轉,這樣常數變為$1/4$
1 #include2 #include3 #include4view code#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 }
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又是...