前兩個是同一道題合計$100pts$。然後我個弱智沒寫快讀被卡常丟了$40$。
(就算改成scanf("%s")然後再去模擬進製都能$ac$,原理不明,只是讀整數太慢了)
看到這套題感覺題目看起來特別麻煩然後就慫了,大概是在摸魚。
前一兩個小時可能都沒怎麼動腦子(麻木),然後回過神來發現$t1$好像沒有想象中那麼噁心。
但是感覺複雜度好像不太對,也沒想啥反正就是交上去了。
然後繼續摸魚。
嘗試想$t3$來著。但是腦子動不起來,於是打$10pts$跑路。$t2$會$10pts$但是好像挺麻煩
所以嫌少就直接扔掉了。。。
狀態又變差了。。。可能是想放個假。。。或者開個學
t1:bohemian rhapsody
大意:維護$m$棵樹,每棵樹最開始都一樣,支援操作:把第$[l,r]$棵樹上$(u,v)$路徑的所有邊長度改為$0$。
所有操作結束後,詢問每棵樹的 所有點對距離和。$n,m,q \le 5 \times 10^5$
同時對多棵樹搞什麼操作很麻煩就算是$o(1)$複雜度也不對。考慮差分(也就是掃瞄線)那麼增量的個數是有限的。
樹剖線段樹維護$size_u \times (n-size_u)$。支援區間打置零標記以及刪除一層標記。隨便寫。$o(nlog^2n)$
使用$lct$可以做到$o(nlogn)$(說著輕巧。。)
繼續$\mod$開鴿的$fread$板子。
1 #include2 #include3view codeusing
namespace
std;
4const
int mod=1000000007,s=500005;5
char in[1
<<26],*p=in;
6int mo(int a)
7int n,m,q,f[s],dep[s],sz[s],top[s],dfn[s],tim,son[s],fir[s],l[s<<1],to[s<<1],ec,ans,w[s],tot[s<<2],tag[s<<2];8
void link(int a,int b)
9void
in(int&x)
10void dfs(int p,int
fa)16}17
void dfs(int p,int
tp)23
#define lc p<<1
24#define rc lc|1
25#define md (l+r>>1)
26void up(int p,int l,int r)
27void build(int p,int l,int
r)29 build(lc,l,md);build(rc,md+1
,r); up(p,l,r);30}
31void add(int l,int r,int v,int p=1,int l=1,int r=n)
35void upd(int x,int y,int
o)if(dfn[x]>dfn[y])x^=y^=x^=y;
40if(x!=y)add(dfn[x]+1
,dfn[y],o);41}
42 vectorx[s],y[s],o[s];
43#define pb push_back
44int
main()printf("
%d\n
",ans);
55 }
t2:under pressure
題如其名。狗屁題。
因為思路完全不著邊際所以絲毫沒有改的慾望。
t3:radio ga ga
$n$時刻恰好走完$[1,n]$。多次詢問如果你的初始區間是$[s_i,s_i]$那麼你獲得的最大獎勵是多少。$n\le 10^9,m,q \le 5 \times 10^5$
暴力$dp$的話,就是記錄一下這$m$個任務對應的$2m$個區間(標記最後經過的點是左端點還是右端點)
轉移數級別是$m^2$的。優化一下。
首先我們考慮從較大的區間轉移到較小的區間,應該是包含關係。
那麼左端點排序之後,右端點應該遞減。掃瞄線加一些資料結構。
為了處理特殊情況這裡的排序很神奇:左端點公升序,然後如果最後經過的點是有端點則優先,在否則如果是右端點則按長度降序,否則公升序。
只要分一大堆情況討論就發現$akt$成功解決了所有轉移的邊界限制。需要特殊處理的是如果限制的是右端點則插入資料結構的時候右端點要$-1$。
然後資料結構可以直接動態開點線段樹也可以直接離散化+樹狀陣列。
然後你就處理出了每個區間的$dp$值。對於每個詢問只要找到包含它區間的最大$dp$值就可以了。
可以再來乙個線段樹,也可以離線掃瞄線+可刪堆。注意如果限制的是左右端點則初始位置就不能是那個。同時還要考慮到長度為$1$的區間。
我就是懶得寫線段樹了。反正複雜度都是$o(nlogn)$
1 #include2view codeusing
namespace
std;
3#define s 3333333
4#define ll long long
5int
n,q,m,r[s],rc,pc;ll t[s],ans[s];
6 unordered_mapex;
7struct pp[s];
8struct qsqs[s];
9void add(int p,ll v)
10 ll ask(int p,ll a=0)
11 vectorv[s],v[s]; priority_queueq,d;
12 ll top()
13void lsh(int x)
14int
main()
18if(x+k-1
<=n)lsh(x+k-1),p[++pc]=(p);
19if(x-k+1>=1)lsh(x-k+1),p[++pc]=(p);20}
21 sort(r+1,r+1+rc); rc=unique(r+1,r+1+rc)-r; r[rc]=n+1;22
for(int i=1;i<=pc;++i)p[i].l=lower_bound(r+1,r+rc,p[i].l)-r,p[i].r=lower_bound(r+1,r+rc,p[i].r)-r;
23 sort(p+1,p+1+pc,(p x,p y));
24for(int i=1;i<=pc;++i)v[p[i].r+1-p[i].o].push_back(p[i].dp=ask(p[i].r)+p[i].w),v[p[i].l+1-p[i].o].push_back(p[i].dp),add(p[i].r-p[i].o,p[i].dp);
25for(int i=1;i<=q;++i)scanf("
%d",&qs[i].x),qs[i].o=i;
26 sort(qs+1,qs+1+q,(qs x,qs y));
27int pt=1;28
while(pt<=q&&qs[pt].x1])pt++;
29for(int i=1;ii)for(int i=1;i<=q;++i)printf("
%lld\n
",ans[i]);
34 }
考試反思 0502省選模擬86 恐懼
還是狀態持續不佳。但是今天沒那麼困,雖說腦子還是不想動。一看到原題就慫,毛病。好像考場上遇到原題的話,得分會比非原題還低。t2 作為原題就直接放棄正解了 然後乖乖的打部分分,結果教練把子任務放錯了於是丟了 15pts 放錯子任務同時也導致 直接輸出 0 能多 20 分。啊人就應該有信仰啊為什麼我沒輸...
考試反思 0316省選模擬47 偏頗
這套題的考察思路其實不錯。三暴力,掛乙個。t1 是送分,但是一眼覺得是大資料結構,於是直接扔掉了。結果竟然是個原題。dy 講的只記住了只言片語思路早就忘了。好歹這次會了。t2 的話寫了個亂搞,結果把本來到手的 20 給寫死迴圈了,加了句判斷就 50 了。t3 差不多想到正解了,但是毒瘤出題人不給部分...
考試反思 0313省選模擬44 習慣
我也不知道我在幹什麼了。僥倖還是害人啊。t1 乙個變數名的大小寫寫錯了 shift沒按住 然後就爆零了,丟了 45 分。然後 oj 貌似終於支援靜態記憶體了?不知道反正我就謎之 mle 了,我根本都沒用那東西。然後開小點就有 35 分了。85 分的場打成 5 分。哎。話說這套題好噁心啊,部分分很少且...