e 神奇的迷宮
思路:點分治+ntt裸題,ntt初始化很重要!!!
ntt中limit,l,a陣列和b陣列都得初始化。
這個題中點分治的sum和主函式中的sum求和弄混了因此一直t,心態崩了。
#include
//注意此模板點的下標應為1到n!!!
#include
#include
using
namespace std;
const
int max_n=
600100
;const
int g=3;
const
int gi=
332748118
;const
long
long mod=
998244353
;const
int inf=
0x3f3f3f3f
;int son[max_n]
,max_son[max_n]
,dis[max_n]
;long
long pp[max_n]
;bool vis[max_n]
;long
long ans=0;
int root;
int cnt,sum;
vector<
int>v[max_n]
;long
long p[max_n]
,w[max_n]
;int limit=
1,l,r[max_n]
;long
long a[
2*max_n]
,b[2
*max_n]
;inline
long
long
pow_mod
(long
long a,
long
long n,
long
long m)
a=(a*a)
%m; n>>=1;
}return ans;
}inline
void
ntt(
long
long
*a,int type)
for(
int mid=
1;mid}}
}void
solve
(int n,
int m)
for(
int i=
0;i) r[i]
=(r[i>>1]
>>1)
|((i&1
)<<
(l-1))
;for
(int i=n+
1;i) a[i]
=b[i]=0
;ntt
(a,1);
ntt(b,1)
;for
(int i=
0;i) a[i]
=a[i]
*b[i]
%mod;
ntt(a,-1
);long
long inv=
pow_mod
(limit,mod-
2,mod)
;for
(int i=
0;i<=n+m;i++
) a[i]
=a[i]
*inv%mod;
}void
dfs(
int now,
int fa)
max_son[now]
=max
(max_son[now]
,sum-son[now]);
if(max_son[now]
) root=now;
}void
getdis
(int now,
int fa,
int d)
}int
calc
(int now,
int d)
for(i=
0;i<=n;i++
) b[i]
=a[i]
;//cout// coutsolve
(n,n)
;for
(i=0
;i<=n+n;i++
)//cout<<"\n";
for(i=
0;i<=n+n;i++
) a[i]
=b[i]=0
;return res;
}void
divide
(int now)
}int
main
(void
)for
(i=1
;i<=n;i++
) p[i]
=p[i]
*pow_mod
(sum,mod-
2,mod)
%mod;
for(i=
0;i)scanf
("%lld"
,&w[i]);
for(i=
1;i) sum=n;
max_son[0]
=n; root=0;
dfs(1,
0);divide
(root)
;//ans
printf
("%lld\n"
,ans)
;return0;
}
牛客練習賽11E(最近點對)
這個題出得還是蠻好的其實。要不是看到很多人a了窩可能就被數學勸退了。表面是數學題,那個函式分析一下就會發現和距離公式很像。設h x 為a的字首和,那f x 就是h x 上2點之間的距離,即求h x 上的最近點對。然後關於最近點對窩是沒學過。然後由汪聚聚提供了模板。過後要學。可以很容易發現這個是個分治...
牛客20180601練習賽19 E
已知第i個瓶子的品牌為ai,且其能開啟bi品牌的瓶子.問有幾瓶飲料托公尺無法喝到.被用於開啟飲料瓶的瓶子不一定需要被開啟.乙個瓶子不能開啟其本身.輸入描述 第一行乙個整數n,表示飲料的瓶數.接下來n行,每行兩個整數ai,bi.輸出描述 輸出一行乙個整數,表示小托公尺無法喝到的飲料瓶數.示例1 輸入 ...
牛客練習賽12 B 迷宮
牛客練習賽12 b 迷宮 這道題比以前的迷宮問題多了一道門 d 必須有 k 才能過門 以前我們用bfs搜尋來解決這種問題,每個 只能經過一次 而此時每個 能夠經過兩次,分別為有 k 和無 k include include include include include include define...