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的更多相关文章

  1. 牛客国庆集训派对Day2 Solution

    A    矩阵乘法 思路: 1° 牛客机器太快了,暴力能过. #include <bits/stdc++.h> using namespace std; #define N 5000 in ...

  2. 牛客国庆集训派对Day4 Solution

    A    深度学习 puts(n) #include <bits/stdc++.h> using namespace std; int main() { double n; while ( ...

  3. 牛客国庆集训派对Day3 B Tree

    Tree 思路: 树形dp 注意0不存在逆元,任何一个数乘以0就变成0了,就没有价值浪,所以要暴力转移 代码: #pragma GCC optimize(2) #pragma GCC optimize ...

  4. 牛客国庆集训派对Day3 I Metropolis

    Metropolis 思路: 多源点最短路 只要两个不同源点的最短路相遇,我们就更新两个源点的答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3 ...

  5. 牛客国庆集训派对Day3 A Knight

    Knight 思路: bfs打表找规律 如下图 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) ...

  6. 牛客国庆集训派对Day3 G Stones

    Stones 思路: sg函数打表找规律 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #in ...

  7. 牛客国庆集训派对Day1 Solution

    A    Tobaku Mokushiroku Kaiji 水. #include <bits/stdc++.h> using namespace std; ], b[]; void Ru ...

  8. 牛客国庆集训派对Day5 Solution

    A    璀璨光滑 留坑. B    电音之王 蒙特马利大数乘模运算 #include <bits/stdc++.h> using namespace std; typedef long ...

  9. 牛客国庆集训派对Day6 Solution

    A    Birthday 思路:设置一个源点,一个汇点,每次对$源点对a_i, b_i , a_i 对 b_i 连一条流为1,费用为0的边$ 每个点都再连一条 1, 3, 5, 7, ....的边到 ...

随机推荐

  1. iOS调用系统相册、相机 显示中文标题

    解决手机语言已经设置显示中文 在调用系统相册.相机界面 时显示英文问题, 在 info.plist里面添加Localized resources can be mixed          YES 表 ...

  2. Java信号量 Semaphore 介绍

    一.介绍 Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore ...

  3. Python 循环退出

    常用语句: break :退出整个循环,循环外的语句继续执行continue :退出本次循环,继续下一次循环pass :什么也不做,相当于在这里占个位置,以便以后修改代码sys.exit() :直接退 ...

  4. Python urllib2 模块

    urllib2.urlopen(url, data=None, timeout=<object object>) :用于打开一个URL,URL可以是一个字符串也可以是一个请求对象,data ...

  5. M0 M4之UART初始化

    新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发.例如:如果RX FIFO中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断.这样可以降 ...

  6. js里面setInterval和setTimeout相同点和区别

    相同点:两个方法都是先触发间隔时间,再触发回调函数 区别: 1.setInterval每隔指定的时间就执行一次表达式,若不停止会一直执行下去 而setTimeout在执行时,是在载入后延迟指定时间后, ...

  7. Core Location和MapKit的一些简单使用

      Core Location 1. 基本对象是CLLocation,有属性coordinate, altitude, horizontal/vertical Accuracy, timestamp, ...

  8. c++11 数值类型和字符串的相互转换

    string和数值类型转换 c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型: std::string to_string(int value); std::stri ...

  9. delphi中Case语法的使用方法

    Case 语句If...Then…Else 语句适合选项较少的情况,如果有很多选项的话利用If 语句就比较麻烦,在这种情况下,Case 语句就容易多了.Case 语句的语法如下: case <表 ...

  10. css - Position定位属性与层级关系

    今天同事发现一个有意思的问题,关于position的层级关系的,他要不说我也没注意过 测试后果然有趣,有待深入研究: <!DOCTYPE html> <html> <he ...