NOIP2017提高A組模擬10 5 Ping

2021-08-09 00:13:29 字數 2007 閱讀 4560

這是一道比較玄學的題目

首先我們看一下在一條鏈怎麼做,我們可以先把右端點排一下序,從左到右掃一遍,每次遇到乙個左端點就把它加入到佇列裡面,遇到乙個右端點就把整個序列清空,並且答案+1,這樣很顯然是對的,因為我如果再往右就覆蓋不到第乙個了,如果不那麼右後面的一些可能又覆蓋不到(那不是虧了)

然後這個結論可以拓展到樹上面,可以把所有詢問的lca的dfs序倒序排一下序,然後再按照順序查詢,每一次我們看一下那個詢問的路徑上面有沒有已經刪掉的點,否則我們就刪掉根節點,證明和上面的都差不多

具體實現的話可以用線段樹

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fo1(i,b,a) for(i=b;i>=a;i--)

using namespace std;

const int maxn=2e5+5;

struct pa[maxn*2];

int fi[maxn],ne[maxn*2],dui[maxn*2],qc[maxn],dfn[maxn],sum[maxn],de[maxn],size[maxn],ans[maxn];

int tree[maxn*3];

bool bz[maxn];

int ff[maxn][19];

int i,j,k,l,n,m,x,y,z,now,p,tot,cc;

void add(int

x,int

y)void dfs(int

x) ff[dui[i]][0]=x;

de[dui[i]]=de[x]+1;

dfs(dui[i]);

size[x]+=size[dui[i]];

}}void ge_ff()

int m1a(int

x,int

y) int i;

fo1(i,16,0)if (de[x]-(1

<=de[y])

fo1(i,16,0)if (ff[x][i]!=ff[y][i])

if (x!=y) x=ff[x][0];

returnx;}

int cmp(p x,p y)

void change(int v,int l,int r,int

x) else

}void find(int v,int l,int r,int

x,int

y) else

}}int main()

dfs(1);

ge_ff();

scanf("%d",&m);

fo(i,1,m)

sort(a+1,a+m+1,cmp);

fo(i,1,m)

}printf("%d\n",cc);

fo(i,1,cc) printf("%d ",ans[i]);

return

0;}

Noip2017提高組 乳酪

noip 2017 提高組 不怎麼難啦 思路如下 首先先寫乙個函式判斷兩個洞是否相連,即兩洞之間距離是否小於等於球直徑 注意是直徑 struct dong dong p 1001 bool pd dong a,dong b 第二個難點在於如何判斷是否可以穿過乳酪,對此我們可以模擬老鼠鑽洞 run函式...

NOIP2017提高組 列隊

noip2017提高組 day2 t3 sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia 所在的方陣中有 n m 名學生,方陣的行數為 n,列數為 m 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...

NOIP 2017 提高組 寶藏

傳送門 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n nn 個深埋在地下的寶藏屋,也給出了這 n nn 個寶藏屋之間可供開發的 m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發...