牛客国庆集训派对Day3 Solution
A Knight
留坑。
B Tree
思路:两次树形DP,但是要考虑0没有逆元
可以用前缀后缀做
#include <bits/stdc++.h>
using namespace std; #define N 1000010
#define ll long long const ll MOD = (ll)1e9 + ; int n;
ll dp[N], dp2[N];
ll prefix[N], suffix[N];
vector <int> G[N]; void Init()
{
for (int i = ; i <= n; ++i) dp[i] = , dp2[i] = , G[i].clear();
} void DFS(int u, int fa)
{
for (auto v : G[u])
{
if (v == fa) continue;
DFS(v, u);
dp[u] = dp[u] * (dp[v] + ) % MOD;
}
} void DFS2(int u, int fa)
{
prefix[] = ;
suffix[G[u].size() + ] = ;
int len = G[u].size();
for (int i = ; i < len; ++i)
{
int v = G[u][i];
if (v == fa) prefix[i + ] = prefix[i];
else prefix[i + ] = prefix[i] * (dp[G[u][i]] + ) % MOD;
}
for (int i = len - ; i >= ; --i)
{
int v = G[u][i];
if (v == fa) suffix[i + ] = suffix[i + ];
else suffix[i + ] = suffix[i + ] * (dp[G[u][i]] + ) % MOD; }
for (int i = ; i < len; ++i)
{
int v = G[u][i];
if (v == fa) continue;
dp2[v] = prefix[i] % MOD * suffix[i + ] % MOD * (dp2[u] + ) % MOD;
}
for (auto v : G[u])
{
if (v == fa) continue;
DFS2(v, u);
}
} void Run()
{
while (scanf("%d", &n) != EOF)
{
Init();
for (int i = , u, v; i < n; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
DFS(, ); DFS2(, );
for (int i = ; i <= n; ++i) printf("%lld\n", dp[i] * (dp2[i] + ) % MOD);
}
} int main()
{
#ifdef LOCAL
freopen("Test.in", "r", stdin);
#endif Run();
return ;
}
C Two Graphs
留坑。
D Shopping
贪心即可。
#include <bits/stdc++.h>
using namespace std; #define N 1010 int t, n, m;
int arr[N], res; int main()
{
scanf("%d", &t);
while (t--)
{
res = ;
scanf("%d%d", &n, &m);
for (int i = , b; i <= n; ++i)
{
scanf("%d%d", arr + i, &b);
if (b) ++res;
}
sort(arr + , arr + + n);
res = min(res, m);
double ans = ;
for (int i = n; i >= ; --i, --res)
ans += res > ? arr[i] * 1.0 / : arr[i];
printf("%.1f\n", ans);
}
return ;
}
E Trophies
留坑。
F Palindrome
留坑。
G Stones
留坑。
H Travel
思路:隔板法,一条边相当于划成两个区域。
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 100010 const ll MOD = (ll)1e9 + ; ll fac[N]; void Init()
{
fac[] = ;
for (int i = ; i < N; ++i) fac[i] = fac[i - ] * i % MOD;
} ll qpow(ll base, ll n)
{
ll res = ;
while (n)
{
if (n & ) res = res * base % MOD;
base = base * base % MOD;
n >>= ;
}
return res;
} ll C(ll n, ll m)
{
if (m > n) return ;
return fac[n] * qpow(fac[m] * fac[n - m] % MOD, MOD - ) % MOD;
} int t, n, m; int main()
{
Init();
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = , a, b; i < n; ++i) scanf("%d%d", &a, &b);
printf("%lld\n", C(n - , m - ) * fac[m] % MOD);
}
return ;
}
I Metropolis
思路:将所有大都会都放到最短路去跑多源最短路,记录每个点的最短路是由哪个点扩展而来
显然,如果一个点源点i扩展到一个点j, 而点j又已经被点k扩展了,那么就没有必要扩展下去
我们在枚举每一条边,更新答案
#include <bits/stdc++.h>
using namespace std; #define N 200010
#define ll long long
#define INFLL 0x3f3f3f3f3f3f3f3f struct Edge
{
int to, nx; ll w;
Edge() {}
Edge(int to, int nx, ll w) : to(to), nx(nx), w(w) {}
}edge[N << ]; int n, m, p;
int head[N], pos;
int x[N], Belong[N];
ll dis[N], ans[N]; void addedge(int u, int v, ll w)
{
edge[++pos] = Edge(v, head[u], w); head[u] = pos;
} struct node
{
ll w; int u, v;
node() {}
node(int u, int v, ll w) : u(u), v(v), w(w) {}
bool operator < (const node &r) const
{
return w > r.w;
}
}; priority_queue <node> q; void Init()
{
memset(head, -, sizeof head);
pos = ;
while (!q.empty()) q.pop();
memset(Belong, , sizeof Belong);
memset(ans, 0x3f, sizeof ans);
} void Dijkstra()
{
while (!q.empty())
{
node top = q.top(); q.pop();
if (Belong[top.v]) continue;
Belong[top.v] = top.u;
dis[top.v] = top.w;
for (int it = head[top.v]; ~it; it = edge[it].nx)
{
int v = edge[it].to;
q.emplace(top.u, v, top.w + edge[it].w);
}
}
} void Run()
{
while (scanf("%d%d%d", &n, &m, &p) != EOF)
{
Init();
for (int i = ; i <= p; ++i)
{
scanf("%d", x + i);
q.emplace(x[i], x[i], );
}
for (int i = , u, v, w; i <= m; ++i)
{
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
Dijkstra();
for (int u = ; u <= n; ++u)
{
for (int it = head[u]; ~it; it = edge[it].nx)
{
int v = edge[it].to;
ll w = edge[it].w;
if (Belong[u] == Belong[v]) continue;
ans[Belong[u]] = min(ans[Belong[u]], dis[u] + dis[v] + w);
ans[Belong[v]] = min(ans[Belong[v]], dis[u] + dis[v] + w);
}
}
for (int i = ; i <= p; ++i) printf("%lld%c", ans[x[i]], " \n"[i == p]);
}
} int main()
{
#ifdef LOCAL
freopen("Test.in", "r", stdin);
#endif Run();
return ;
}
J Graph Coloring I
思路:对于一张图,如果没有奇圈,那么肯定可以用两种颜色进行染色,那么肯定有解
只要去找奇圈即可。
#include <bits/stdc++.h>
using namespace std; #define N 300010 int n, m;
vector <int> G[N], ans;
int deep[N], fa[N];
bool flag; void DFS(int u)
{
if (flag) return;
for (auto v : G[u])
{
if (flag) return;
if (v == fa[u]) continue;
if (fa[v] != - && !flag)
{
if ((deep[u] - deep[v]) % == )
{
ans.push_back(u);
while (u != v)
{
u = fa[u];
ans.push_back(u);
}
flag = true;
return;
}
}
else
{
fa[v] = u;
deep[v] = deep[u] + ;
DFS(v);
}
}
} void Init()
{
for (int i = ; i <= n; ++i) G[i].clear();
ans.clear();
memset(fa, -, sizeof fa);
deep[] = ;
flag = false;
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
Init();
for (int i = , u, v; i <= m; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
DFS();
if (flag)
{
printf("%d\n", (int)ans.size());
for (int i = , len = ans.size(); i < len; ++i) printf("%d%c", ans[i], " \n"[i == len - ]);
}
else
{
puts("");
for (int i = ; i <= n; ++i) printf("%d%c", deep[i] & , " \n"[i == n]);
}
}
return ;
}
K Graph Coloring II
留坑。
牛客国庆集训派对Day3 Solution的更多相关文章
- 牛客国庆集训派对Day2 Solution
A 矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...
- 牛客国庆集训派对Day4 Solution
A 深度学习 puts(n) #include <bits/stdc++.h> using namespace std; int main() { double n; while ( ...
- 牛客国庆集训派对Day3 B Tree
Tree 思路: 树形dp 注意0不存在逆元,任何一个数乘以0就变成0了,就没有价值浪,所以要暴力转移 代码: #pragma GCC optimize(2) #pragma GCC optimize ...
- 牛客国庆集训派对Day3 I Metropolis
Metropolis 思路: 多源点最短路 只要两个不同源点的最短路相遇,我们就更新两个源点的答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3 ...
- 牛客国庆集训派对Day3 A Knight
Knight 思路: bfs打表找规律 如下图 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) ...
- 牛客国庆集训派对Day3 G Stones
Stones 思路: sg函数打表找规律 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #in ...
- 牛客国庆集训派对Day1 Solution
A Tobaku Mokushiroku Kaiji 水. #include <bits/stdc++.h> using namespace std; ], b[]; void Ru ...
- 牛客国庆集训派对Day5 Solution
A 璀璨光滑 留坑. B 电音之王 蒙特马利大数乘模运算 #include <bits/stdc++.h> using namespace std; typedef long ...
- 牛客国庆集训派对Day6 Solution
A Birthday 思路:设置一个源点,一个汇点,每次对$源点对a_i, b_i , a_i 对 b_i 连一条流为1,费用为0的边$ 每个点都再连一条 1, 3, 5, 7, ....的边到 ...
随机推荐
- (DCloud)用这个来写H5,好像好厉害的样子哦
HBuilder: http://www.dcloud.io MUI: http://dev.dcloud.net.cn/mui/getting-started/ http://dev.dcloud. ...
- 使用mt_rand代替rand
mt_rand比rand生成的随机数“更随机”,重复值较少 下面是测试: <?php function t1($num=10000){ $arr = array(); for ($i=0; $i ...
- NUC131演示如何通过PWM触发ADC。
今天我来讲讲PWM触发ADC的例程 /**************************************************************************** * @f ...
- C++中的抽象基类示例
抽象基类(abstract base class,ABC)例子:圆与椭圆.建立一个基类BaseEllipse,建立它的恋歌继承了Ellipse和Circle.ellipse.h #ifndef ELL ...
- 开源的PaaS方案:在OpenStack上部署CloudFoundry (二)部署OpenStack
硬件要求 安装OpenStack 1 安装CentOS 65系统并清空iptables防火墙规则 2 安装系统需要的工具包包括Openstack依赖的和CloudFoundry依赖的 3 安装EPEL ...
- 腾讯云大数据套件Hermes-MR索引插件使用总结
版权声明:本文由王亮原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/121 来源:腾云阁 https://www.qclou ...
- [Java语言] HashMap,HashSet,Hashtable,Vector,ArrayList 的关系 <转>
这么几个比较常用的但是比较容易混淆的概念同出于 java.util 包.本文仅作几个类的浅度解析. (本文基于JDK1.7,源码来自openjdk1.7.) ├── Collection │ ├── ...
- UINavigationController和UITabBarController
UINavigationController和UITabBarController 目录 概述 UINavigationController UITabBarController 实用功能 待解决 概 ...
- Android屏幕适配和文字屏幕适配
http://blog.sina.com.cn/s/blog_9996c67e0101euwd.html 最近在一个项目中要实现屏幕适配平板和手机等不同的型号,而蛋疼的美工给了一套图,而且这些图纸有在 ...
- Tensorflow%20实战Google深度学习框架 4.2.2 自定义损失函数源代码
import os import tab import tensorflow as tf from numpy.random import RandomState print "hello ...