NOIP2018模擬賽10 20A 掛分報告

2022-03-13 04:43:10 字數 4345 閱讀 7931

先看看了b組,t1 zroi剛好講過乙個性質原根一般很小的,直接列舉;t2一眼二分然後似乎狀壓 t3沒看

然後上來a組題,t1 flow這名字...網路流?!

t1題面非常的社會主義核心價值觀,看到有個\(m==n\)的限制就想如果去掉怎麼樣,發現一棵樹的話答案是確定的,然後考慮加上那條多出來的邊,發現答案還是不變的?!想了想好像確實是這樣,你樹邊確定了環邊根本不用管,判斷有無解就是點值加起來是否為0.於是直接dfs掃一遍去掉環邊再dfs一遍就好了

t2 題面1984還行 出題人小心啊 掃了一眼覺得好難告辭

t3 第一眼題面 woc!!求求你們給國家省點子彈,我覺得部落格中貼出這題題面的也要被查睡標了

第二眼woc?!這不是雅禮集訓講過的原題嗎?!還記得點思路就是預處理坐幾班車最遠可到達的地方,講題人還提到了長鏈剖分

於是肛肛肛...結果死活沒調出來...然後xxzh巨佬講了一種更好寫的暴力....感覺以後考試看到原題還是得想想有沒有其他的思路

結果15+0+0 t1 tm 正負號打反了,又犯sb錯誤 心態崩了

分析某div 2 f竟這麼水(你還不是掛分了)

見閒扯**

/*

code by ryecatcher

*/inline char gc()

#define gc getchar

template inline void read(t &x)

const int maxn=200005;

const int inf=0x7fffffff;

struct edgeedge[maxn<<2];

int h[maxn],num_edge=1;

inline void add_edge(int f,int to,int id)

int w[maxn];

struct niconico[maxn<<2];

struct qaqyyy[maxn<<2];

int tot=0;

int n,m;

namespace fake

if(edge[i].ok)continue;

fa[v]=now;

gao_cyc(v);

} return ;

} void get_ans(int now)

get_ans(v);

} yyy[++tot].x=now,yyy[tot].y=fa[now];

yyy[tot].xd=-w[now],yyy[tot].yd=w[now];

yyy[tot].fff=id;

w[fa[now]]+=w[now];

return ;

} void main()

memset(vis,0,sizeof(vis));

if(ans==0)puts("possible");

else

fa[1]=0;

gao_cyc(1);

get_ans(1);

for(ri i=1;i<=tot;i++)

else if(x==b&&y==a)

} for(ri i=1;i<=m;i++)

return ; }}

int main()

//if(m<=20&&n<=20)bf::main();

fake::main();

return 0;

}

預處理每個點在一條鏈上坐\(2^j\)次車最遠到**,這顯然可以倍增搞

然後考慮答案怎麼算

對於詢問\((x,y)\),求出\(z=lca(x,y)\),\(x,y\)先分別跳到距\(z\)最近的點(也就是下次就到\(z\)或更遠),這時候先統計個答案步數\(ans\)

然後發現答案只有兩種情況

case#1

兩點分別跳一次到\(z\),最終\(ans=ans+2\)

case#2

設這時候\(x,y\)分別跳到了\(x',y'\)

有一班車覆蓋了路徑\((x',y')\),那麼答案就是\(ans=ans+1\),因為你只要坐這班車就可以越過lca到另乙個點

考慮怎麼判斷有沒有一班車覆蓋這條路徑,轉化一下變成是否有一班車\((st,ed)\),\(st\)在\(x'\)子樹中,\(ed\)在\(y'\)子樹中(包括\(x'.y'\))

如果你看過

就會發現這還可以繼續轉化成\(dfn[x']<=dfn[st]<=ed[x'],dfn[y']<=dfn[ed]<=ed[y']\)

將\((dfn[st],dfn[ed])\)看成乙個座標,發現就是判斷乙個矩形中有沒有點

我們轉化後詢問\((x',y')\)矩形的四個座標為\((dfn[x'],dfn[y']),(dfn[x'],ed[y']),(ed[x'],dfn[y']),(ed[x'],ed[y'])\)

一條班車路徑轉化成乙個點\((dfn[st],dfn[ed])\)

我們把這些點放在一起按照掃瞄線思路,將點按橫座標進行排序,然後遍歷所有點(優先遍歷班車路徑轉化後的點)

如果是班車路徑的點,加入樹狀陣列\([1,dfn[ed]]\)(\(dfn[ed]\)其實就是座標(x,y)中的\(y\))字首和

如果是個矩形想要查詢裡面點數咋辦?二維字首和.

我們是將所有點按橫座標排序的,所以我們可以先加上\(b\)的點數,減去\(a+b\)的點數,然後等到\(ed[x']\)座標時減去\(b+c\) 點數,最後加上整個大面積就是矩形內點數

顯然這些部分直接查詢樹狀陣列字首和就好了

然後有非常多的細節,見**注釋吧...

對於樹上路徑,我們都預設dfs序小的為起點方便處理,也算是個技巧

/*

code by ryecatcher

*/inline char gc()

template inline void read(t &x)

const int maxn=500005;

const int inf=0x7fffffff;

int n,m,q;

struct edgeedge[maxn<<1];

int h[maxn],num_edge=1;

inline void add_edge(int f,int to)

int f[maxn][23];

int dep[maxn],fa[maxn],son[maxn],size[maxn],top[maxn],dfn[maxn],ed[maxn],tot=0;

void dfs_1(int now)

return ;

}void dfs_2(int now,int t)

dfs_2(son[now],t);

for(ri i=h[now];i;i=edge[i].ne)

ed[now]=tot;

return ;

}inline int get_lca(int x,int y)

void pre_dfs(int now)

return ;

}struct seg

int fac[maxn],ans[maxn];

int qwq=0,pt[maxn];

int main()

dep[1]=0;

dfs_1(1);

dfs_2(1,1);

read(m);

for(ri i=1;i<=m;i++);

}pre_dfs(1);

fac[0]=1;

for(ri i=1;i<=n;i++)if(f[i][0]==i)

for(ri k=1;k<=21;k++)

//for(ri k=0;k<=2;k++)for(ri i=1;i<=n;i++)printf("%d %d %d\n",i,k,f[i][k]);

int po,qo;

read(q);

for(ri o=1;o<=q;o++)

for(ri i=21;i>=0;i--)

if(dep[f[qo][i]]>dep[lca])

if((!f[po][0]&&po!=lca)||(!f[qo][0]&&qo!=lca))

else

else ;//二維字首和

seg[++qwq]=(seg);

seg[++qwq]=(seg);

seg[++qwq]=(seg);}}

}std::sort(seg+1,seg+1+qwq);

for(ri i=1;i<=qwq;i++)

else

}for(ri i=1;i<=q;i++)

return 0;

}

NOIP2018模擬賽2018 10 18 輕功

description 題目背景 尊者神高達進入了基三的世界,作為乙個 mmorpg 做任務是必不可少的,然而跑地圖卻令人十分不爽。好在基三可以使用輕功,但是尊者神高達有些手殘,他決定用梅花樁練習輕功。題目描述 一共有 n 個木樁,要求從起點 0 開始,經過所有梅花樁,恰好到達終點 n,尊者神高達一...

NOIP2018模擬賽2018 10 18 開荒

description 題目背景 尊者神高達作為乙個萌新,在公升級路上死亡無數次後被乙隻大黃嘰帶回了師門。他加入師門後發現有無窮無盡的師兄弟姐妹,這幾天新副本開了,尊者神高達的師門作為乙個 pve師門,於是他們決定組織一起去開荒。題目描述 師門可以看做以 1 為根的一棵樹,師門中的每乙個人都有一定的...

NOIp2018模擬賽三十六

好久沒打模擬賽了。今天一樣是兩道國集,一道bzoj題 成績 13 0 95 108 a題開始看錯題了。導致樣例都沒看懂,結果xfz提醒我後我理解了乙個我自認為正確的題意 事實證明我和xfz都錯了qwq 然後瞎打了乙個線段樹,結果只有13分。c題一看就是乙個大平衡樹,開始手打了100 行發現自己肯定調...