先看看了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 行發現自己肯定調...