穩住陣腳。
還可以。
至少想拿到的分都拿到了,最後一題的確因為不會按秩合併和線段樹分治而想不出來。
對拍了,暴力都拍了。挺穩的。
但是其實也有波折,險些被卡記憶體。
如果記憶體使用不連續或申請的記憶體全部使用的話,切記計算記憶體,一點都不能開大。
t1:divisors
直接根號篩,拿map也能過。
遍歷map直接begin和end啊。。。
1 #include2hash_map 581bint cnt[202];3
struct
hash_map
9}m;
10int
main()
16for(int i=1;i<=m.cnt;++i)cnt[m.w[i]]++;
17for(int i=1;i<=m;++i)cnt[0]-=cnt[i];
18for(int i=0;i<=m;++i)printf("
%d\n
",cnt[i]);
19 }
hash_map的陣列大小要記得計算空間
t2:market
應該都能看出是個揹包。
不讀錯題問題都不大。
1 #include2稍短 641busing
namespace
std;
3int dp[301][90002
];4 vectorint,int> >v[305];5
intmain()
15for(int v=89999;~v;--v)dp[t][v]=min(dp[t][v],dp[t][v+1
]);16}17
while(m--)scanf("
%d%d
",&t,&c),printf("
%d\n
",upper_bound(dp[t],dp[t]+90001,c)-dp[t]-1
);18 }
不離線詢問的話不要開long long。會mle。
t3:dash speed
好題。考場上一直在想主席樹,以為有50000有70000會卡兩個log的。顯然沒有。
這題要處理對於每乙個速度的答案。
先考慮li=1的特殊性質。
我們從大到小的考慮速度,這樣的話就是乙個不斷解鎖邊的過程。
不斷填邊,求最長鏈。和模擬測試40《影子》的並查集做法一模一樣。
如果li不是1呢?那就有刪邊操作了。然而直接做貌似不可撤銷。
考慮分治。
如果我們現在要求解速度為1和2時的答案,那麼乙個暴力的思路就是:
把1能過的所有邊連上,求解,撤銷。把2能過的所有邊連上,求解,撤銷。
複雜度是n2的。
我們可以發現上面這個方法存在冗餘。如果我們一開始就把1和2的邊都連上,在求解1,2時不撤銷這些邊,就可以快一些了。
我們利用的是線段樹的結構,我們現在考慮所有[3,5]的詢問,於是加入l<=3&&r>=5的邊。
然後是處理3的詢問,再加入速度可以接受3的邊,求解3,再撤銷剛剛加入的這些邊就好。。。
然後不斷按mid分治下去直到葉節點就是答案。
怎麼撤銷?
倍增lca並沒有被卡t。
然而因為要撤銷,所以按照原來那道題打路徑壓縮並查集是不可行的(過程中修改的點太多),為了保證複雜度,我們採取按秩合併。
按秩合併其實就是把並查集按照深度合併,深度小的往打的裡面合併的話那麼很大可能總深度不變,或者+1。
只用兩棵樹深度恰好相等時深度+1,其餘時候深度還是原來樹的深度。不知道為什麼網上給的板子深度陣列叫rk。
1按秩合併大概的板子int find(int k)
2int merge(int a,int
b)
然後就差不多了。
1 #include2 #include3 #include4稍長using
namespace
std;
5int n,m,fir[70005],l[140005],to[140005],cnt,ans[70005],u[70005],v[70005],l[70005],r[70005];6
void link(int a,int b)
7int p1[70005],p2[70005],mx[70005],f[70005][20],f[70007],rk[70005],dep[70005],stans[1500005];8
int stp1[1500005],stp2[1500005],stmx[1500005],stf[1500005],strk[1500005],o[1500005
],top,ans;
9 vectorv[1500000
];10
void insert(int p,int l,int r,int
i)12
if(r[i]>l+r>>1)insert(p<<1|1,(l+r>>1)+1
,r,i);
13if(l[i]<=l+r>>1)insert(p<<1,l,l+r>>1
,i);14}
15int find(int k)
16void dfs(int p,int
fa)21
int dt(int a,int
b)29
void copy(int x)
30void recover()
31void merge(int i)
46void divide_and_conquer(int p,int l,int r)
49 divide_and_conquer(p<<1,l,l+r>>1
);50 divide_and_conquer(p<<1|1,(l+r>>1)+1
,r);
51 ed: while(top>re)recover();52}
53int main()
1003CSP S模擬測試賽後總結
我是垃圾 我只會騙分。拿到題目通讀一遍,感覺t3 暴力 是個樹剖 線段樹。剛學了樹刨我這個興奮啊。然而手懶決定最後再說。對著t1一頓yyxjb碼了個60pts的測試點分治就失去夢想了。順便圍觀fh大神寫完t1並拍上,心態稍崩 然後開始yyt2。經過我發了半天呆縝密而周詳的思考覺得可以打個揹包。裸揹包...
考試反思 1114csp s模擬測試115 零遲
最後一次了,允許自己混進榜裡吧。沒有心態,原題不會做 真的忘了 t2的搜尋沒有分。零 遲 酷刑 只有在最後的時刻才開始意識到,一切的一切都已經晚了。就在眼前了。沒有機會了。退役,告別oi,粉碎夢想,這,就是最嚴苛的酷刑。生存,生存!hzoi2018!所有人!一年走來,我們還要繼續走下去!csp s,...
考試反思 1112csp s模擬測試111 二重
還是ak場。考前信心賽?而且t3的部分分還放反了所有80的都其實只有50。總算在ak場真正ak了一次。手感好,整場考試很順利。要不是因為t3是原題可能就沒這麼好看了。20mint1,50mint2,去趟廁所回來70min想到t3,110min寫完調完對拍完,然後去學skyh寫平衡樹了。然後我發現我不...