t1 3555【gdkoi2014模擬】樹的直徑
t2 3542【清華集訓2014】氣泡排序
t3 3486【noip2013模擬聯考10】道路改建(rebuild)
樹直徑的乙個性質,兩棵樹合併,形成新的樹的直徑的兩個端點為原樹中的四個端點之二。
可以用反證法證明。用此性質本題就變成了lca裸題了
#include#include#include#include#include#include#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define rep(i,x) for(int i=head[x];i;i=next[i])
#define mem(a,x) memset(a,x,sizeof(a))
typedef long long ll;
typedef double db;
using namespace std;
inline int max(int x,int y)
inline int min(int x,int y)
inline int read()
const int n=200000+50;
int to[n<<1],next[n<<1],tot,head[n],dep[n],go[n][17],s,t,mx,m,x,son;
void add(int x,int y)
void dfs(int x)
void init_lca()
int lca(int a,int b)
return 0;
}
一看是清華集訓題就慌了,但仔細一想還是十分簡單的。
若乙個數之前有t個比它要大,那麼前t輪中每輪它會往前移1個位置,之後便不再會往前移了。
考慮到交換次數=前移次數,可據此求出最大的輪數x使得做了x輪冒泡後交換次數剛好不超過k。
那些t>=x的數的位置前移了x,所有t#include#include#include#include#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define rep(i,x) for(int i=head[x];i;i=next[i])
#define mem(a,x) memset(a,x,sizeof(a))
typedef long long ll;
typedef double db;
using namespace std;
inline int max(int x,int y)
inline int min(int x,int y)
inline int read()
const int n=1000001;
int a[n],upper[n],ans[n],sa[n],tr[n],n;
inline int lowbit(int x)
inline void add(int x,int xx)
inline int sum(int x)
int main()
sx=0;
fo(i,1,n) sx+=(ll)min(r+1,upper[i]);
ll m=k-sx;
if(m>0)
sx=0;
fo(i,1,n) sx+=(ll)min(r,upper[i]);
m=k-sx;
int p=0;
fo(i,1,n)
if(upper[i]>r) ans[i-r]=a[i];
else p++,sa[p]=a[i];
sort(sa+1,sa+1+p);
p=0;
fo(i,1,n) if(ans[i]==0) p++,ans[i]=sa[p];
for(int i=1;ians[i+1])
}fo(i,1,n-1) printf("%d ",ans[i]);
printf("%d\n",ans[n]);
return 0;
}只能憑印象寫一下題解了(記性不好,算了 等oj好了再補齊吧)
NOIP提高組 矩陣
在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...
NOIP提高組2005 過河
過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...
NOIP提高組 20151029模擬
其實這套題目並不算太難,但是還是發揮不了100 水平。第一題直接線性篩法,求出質數,然後就可以判斷乙個數是否為質數了。這道題還可以用miller rabin去求,後者的速度較快,如果資料再大些,就要使用後者了。第二題,比賽時發現了,當n 7時,答案會每四個一迴圈,但是就沒有繼續往下想,其實想下去會想...