2019牛客暑期多校訓練營(第四場

2021-09-25 17:44:42 字數 2188 閱讀 1926

a meeting

答案為最遠關鍵點的距離的一半向上取整,也就是關鍵點的樹的直徑的一半向上取整。

先考慮兩個點,他倆是最遠距離,那麼最短時間就是⌈d/2⌉,在此基礎上再加乙個點(前提是加上這個點,後不影響初始條件,即初始的兩個點之間的距離最遠),那麼不會影響答案,因為他與另外兩個點的相會的時間必然小於⌈d/2⌉,這個題是最小化最大值。

所以答案是關鍵點的樹的直徑的一半向上取整.

求樹的直徑的方法有兩半bfs,兩邊dfs,書上dp。

另附兩遍bfs的**:

#include #define inf 0x3f3f3f3f

#define pair pair#define int long long

#define fir first

#define sec second

namespace io

use[y]=1;}}

} return last;

}signed main()即可。

加入a為13 (8+4+1) 對應模數為(2+1      +1),多出來的1導致了結果mod 3=1,我們用a減去這個1就是3的倍數,此時這個3的倍數的被減去的二進位制位為0,可以通過減去另乙個1,產生的另乙個3的倍數,兩者相或可以彌補二進位制位置。

• 如果a中的二進位制位有恰好乙個mod 3=1的,那麼設mod 3=1的這個位為p,mod 3=2 的某個位為q,我們取即可。

如a= 43 (32+8+2+1)對應模數為(2+2+2      +1),多出來的1導致了結果mod 3=1,剪掉這個 1,則產生第乙個3的倍數,這個1隨便加上乙個2,也是3的倍數,同時可相互彌補二進位制中的位數,

• 如果a中的二進位制位沒有mod 3=1的,那麼假設有三個mod 3=2的位p,q,r,我們取即可。

如a= 682 (512+128+32+8+2)對應模數為(2+2+2      +2+2),多出來的4導致了結果mod 3=1,剪掉這個 2+2,則產生第乙個3的倍數,這兩個2隨便加上乙個2,也是3的倍數,同時可相互彌補二進位制中的位數,

• 若a mod 3=2只需把上面的討論中1與2互換即可,是完全對稱的。

我們簡單分別舉一下例子:

至少兩個mod 3=2:

如a= 14 (8+4+2)對應模數為(2+1      +2),多出來的2導致了結果mod 3=2,剪掉這個2,則產生第乙個3的倍數,這個2隨便加上乙個1,也是3的倍數,同時可相互彌補二進位制中的位數,

恰好乙個mod 3=2的:

如a= 85 (64+16+4+1)對應模數為(1+1+1      +2),多出來的2導致了結果mod 3=2(也可理解為多出來的1+1 導致mod3=2),剪掉這個2,則產生第乙個3的倍數,這個2隨便加上乙個1,也是3的倍數,同時可相互彌補二進位制中的位數,

沒有mod 3=1的:

如a= 85 (64+16+4+1)對應模數為(1+1+1      +1+1),多出來的1+1導致了結果mod 3=2,剪掉這個(1+1),則產生第乙個3的倍數,這兩個1隨便加上乙個1,也是3的倍數,同時可相互彌補二進位制中的位數,

另附**:

#include #define inf 0x3f3f3f3f

#define pair pair#define int long long

#define fir first

#define sec second

namespace io

base*=2;

x>>=1;

}}signed main()

}else }}

} return 0;

}

k number

字尾和找規律,

簡單附**

#include #define inf 0x3f3f3f3f

#define pair pair#define int long long

#define fir first

#define sec second

namespace io

} if(z)res+=(1+z)*z/2;z=0;

//printf("%lld\n",res);

for(int i=len;i>=1;i--)

res+=m[num[i]%3];

} printf("%lld\n",res);

return 0;

}

2019牛客暑期多校訓練營(第四場)A

題意 給定n個頂點,n 1條邊權為1的邊,將各個頂點連成乙個最小生成樹,再給定乙個k,表示有多少個人,每個人都在特點的乙個頂點上,現在這些人要相會,求使得這些人能夠相聚在一起的最短時間。看了標程,答案就是k個人當中那2個距離最遠的人的距離d,答案就是d 2向上取整。證明 必要性 k個人當中,最遠的那...

牛客暑期多校訓練營B Boundary

給定n個點,然後確定乙個過原點的圓,要使這n個點盡可能多的存在與圓上,最後輸出最多的存在於圓上的點的個數 三點確定乙個圓,我們已知這個圓必定經過原點,所以再依次利用三點求圓心的公式列舉每兩個點與原點 三點不共線 確定的圓心,最後選擇確定次數最多的圓心構成的圓 include include incl...

2019牛客暑期多校訓練營(第九場)

d knapsack cryptosystem 折半搜尋,晚上又去看了挑戰程式設計,對於時間複雜度高的情況,可以通過犧牲空間來降低時間複雜度。先把前半部分所有可以組合的情況列舉出來,然後對於後半部分依次列舉,那麼複雜度變化為o 2 36 o 2 18 2 18log 18 顯然就可做了,折半的裸題。...