sro fjzzq2002
1.直径
xjb构造三叉树一定有解
时间复杂度 O ( n 2 ) O(n^2) O(n2)
#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int k,n,a,b,c;
int u[N],v[N],tot,pre;
inline void fd()
{
for(a=1;a<5000;++a)
for(b=a;a+b<5000 && a*b<=k;++b)
if((k-a*b)%(a+b)==0){
if((k-a*b)/(a+b)<=5000-a-b-4)
{
c=(k-a*b)/(a+b);
return;}
}
}
int main(){
freopen("diameter.in","r",stdin);
freopen("diameter.out","w",stdout);
int i,j;
scanf("%d",&k);fd();
u[++tot]=(n=1);v[tot]=++n;pre=n;
for(i=1;i<=a;++i){
u[++tot]=pre;v[tot]=++n;}
u[++tot]=1;v[tot]=++n;pre=n;
for(i=1;i<=b;++i){
u[++tot]=pre;v[tot]=++n;}
if(c){
u[++tot]=1;v[tot]=++n;pre=n;
for(i=1;i<=c;++i) {
u[++tot]=pre;v[tot]=++n;}
}
printf("%d\n",n);
for(i=1;i<n;++i) printf("%d %d 1\n",u[i],v[i]);
fclose(stdin);fclose(stdout);
return 0;
}
2.定价
用你喜爱的数据结构维护:
- 每个二进制位上1出现的连续区间
- 在位置 i i i找到最高的一位 j j j满足第 i − 1 i-1 i−1位置这位为1且位置 i i i这位不能再为1,并查找更高位最近的一个可以变成1的0,并把所有小的位变成0。
似乎可以暴力艹标算。
代码咕咕咕。
std:
#include <bits/stdc++.h>
using namespace std;
const int md = 1e9 + 7;
inline void add(int &x, int y) {
x += y;
if (x >= md) {
x -= md;
}
}
inline void sub(int &x, int y) {
x -= y;
if (x < 0) {
x += md;
}
}
inline int mul(int x, int y) {
return (long long) x * y % md;
}
inline int power(int x, int y) {
int res = 1;
for (; y; y >>= 1, x = mul(x, x)) {
if (y & 1