題目鏈結
題意:題意不難看懂,就是要求兩點間道路中最大權值的最小值
思路:這道題有很多種解法,這裡講利用lca的解法
首先我們知道,解肯定是建立在最大生成樹上的
先用kruscal建最大生成樹
然後再在lca中維護乙個d(u,v)表示從節點u走到節點v經過的道路的最小權重
然後就可以上**了
ac**:
#include
#include
#include
using
namespace std;
const
int n =
1e5+
10,m =
5e5+
10,inf =
0x3f3f3f3f
;int head[n]
,tot;
int n,m,q;
int fa[n]
;int fa[n][20
],d[n][20
],dep[n]
;int vis[n]
;struct edgee[m <<1]
;struct node
}a[n]
;void
add(
int u,
int v,
int w)
intgetf
(int x)
void
kruscal()
}}void
dfs(
int u)
for(
int i = head[u]
;~i;i = e[i]
.next)}}
intlca
(int x,
int y)
if(x == y)
return x;
for(
int i =
16;i >=
0;i --)}
return fa[x][0
];}int
solve
(int u,
int v)
}return ans;
}int
main()
kruscal()
;//最大生成樹
for(
int i =
1;i <= n;i ++
)//預處理出fa,d,depif(
!vis[i]
)dfs
(i);
cin >> q;
for(
int i =
0;i < q;i ++)}
return0;
}
題目鏈結
ps:這道題的優化真的很妙!!
題意:首先易證校驗值就是乙個有序陣列裡,最大與最小的差的平方加上次大與次小的差的平方加上…依次類推
然後這個問題就是乙個貪心問題了
思路:可以用倍增優化一下取值操作,再用歸併優化一下排序操作 因為要算校驗值陣列必須有序,那麼已經取到的數必然是有序的,新加進去的若干數隻需要先自身排序再與前面的數歸併一下即可
ac**:
#include
#include
#include
#include
using
namespace std;
const
int n =
5e5+10;
int t,n,m;
typedef
long
long ll;
ll k;
ll a[n]
,b[n]
,c[n]
;int ans,r;
void
merge
(int l,
int mid,
int r)
while
(i <= mid) c[t ++
]= b[i ++];
while
(j <= r) c[t ++
]= b[j ++];
}ll cal
(int l,
int r)
sort
(b + r +
1,b +
1+ r)
;merge
(l,r,r)
;for
(int i =
1;i <=
min(m,
(r - l +1)
>>1)
;i ++
)return res;
}int
work
(int l)
else p >>=1;
}return r;
}int
main()
printf
("%d\n"
,ans);}
return0;
}
兩道FFT的應用題
計算 c k k ia i b i k 正好看到 具體數學 上處理和式的tricks,雖然熱身題也不會做,但碾oi題還是很穩的 orz神犇高教授 對於 k ia i b i k 將b陣列倒置,即b i b n 1 i 原式變為 c k 0 i0 n k 1 ia i b n k 1 i 化簡得到c ...
兩道遞推公式題的解題報告
數學課講題的話到這裡為止吧 這兩題看似相似,其題解分別看來也都很有道理,為什麼其結果卻大相徑庭呢?因為去掉的含非法字串的情況不是f n 2 因為在求f n 時我們已經事先使前n 1項合法,所以在f n 1 我們用來乘以三作為總數的 中a n 1 為o的可能性比t2中a n 1 為w的可能性小。這是因...
益智題 (簡單的兩道題)
a公司拍攝的 黃河頌 獲最佳故事獎 b公司的 孫悟空 獲最佳武術獎 c公司的 白娘子 獲最佳戲劇獎。a公司的經理說 我們三經理的姓分別是三部片名的第乙個字,而又同自己所拍 首字不一樣。另一公司的孫經理笑著說 真是這樣 那三經理各姓什麼?答案 a白 b黃 c孫 另一公司的孫經理 說明a不姓孫,而a又不...