Replay


Dup4:

  • 两轮怎么退火啊?
  • 简单树形dp都不会了,送了那么多罚时
  • 简单题都不想清楚就乱写了,喵喵喵?

X:

  • 欧拉怎么回路啊, 不会啊。
  • 还是有没有手误?未思考清楚或者未检查就提交, 导致自己白送罚时。

A:夺宝奇兵

Solved.

考虑$所有i >= 2 需要跟i - 1 连两条边 只有两种可能 取最小的一种$

$注意n的两个点要连一条边$

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 const int maxn = 1e5 + ;

 struct node{
int x1, x2, y1, y2;
}arr[maxn]; ll calc(int i,int j)
{
ll ans1 = abs(arr[i].x1 - arr[j].x1) + abs(arr[i].y1 - arr[j].y1) + abs(arr[i].x2 - arr[j].x2) + abs(arr[i].y2 - arr[j].y2);
ll ans2 = abs(arr[i].x1 - arr[j].x2) + abs(arr[i].y1 - arr[j].y2) + abs(arr[i].x2 - arr[j].x1) + abs(arr[i].y2 - arr[j].y1);
return min(ans1, ans2);
} int n , m; int main()
{
while(~scanf("%d %d", &n, &m))
{
for(int i = ; i <= n; ++i) scanf("%d %d %d %d", &arr[i].x1, &arr[i].y1, &arr[i].x2, &arr[i].y2);
ll ans = ;
for(int i = ; i <= n; ++i) ans += calc(i, i - );
ans += abs(arr[n].x1 - arr[n].x2) + abs(arr[n].y1 - arr[n].y2);
printf("%lld\n", ans);
}
return ;
}

C:最小边覆盖

Solved.

考虑$No的情况$

  • 存在一个点的度数为0(没有被覆盖)
  • 存在一条边所连接的两个点其度数 >= 2 即这条边去掉还是个最小边覆盖
 #include <bits/stdc++.h>
using namespace std; #define N 300010
#define pii pair <int, int>
int n, m;
pii G[N];
int d[N]; bool f()
{
for (int i = ; i <= n; ++i) if (!d[i]) return false;
for (int i = ; i <= m; ++i)
{
int u = G[i].first, v = G[i].second;
if (d[u] >= && d[v] >= )
return false;
}
return true;
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(d, , sizeof d);
for (int i = , u, v; i <= m; ++i)
{
scanf("%d%d", &u, &v);
++d[u], ++d[v];
G[i] = pii(u, v);
}
puts(f() ? "Yes" : "No");
}
return ;
}

F:小小马

Solved.

因为不同颜色出现次数相同, 所以步数一定是奇数。

暴力跑出大数据的状态, 发现颜色相同就输出No, 否则输出Yes。

小数据暴力跑即可

 #include<bits/stdc++.h>

 using namespace std;

 const int maxn = 1e6 + ;

 struct node{
int x, y;
int step;
node(){}
node(int x, int y, int step): x(x), y(y), step(step){}
}; int n, m;
int sx, sy, ex, ey;
int vis[][maxn][];
int dir[][] = {-, -, -, , -, -, -, , , -, , , , -, , }; int judge(int x, int y,int step)
{
if(x < || x > n || y < || y > m || vis[x][y][step % ]) return false;
else return true;
} void BFS()
{
memset(vis, , sizeof vis);
queue<node>q;
q.push(node(sx, sy, ));
while(!q.empty())
{
node st = q.front();
q.pop();
node now = st;
now.step++;
for(int i = ; i < ; ++i)
{
now.x = st.x + dir[i][];
now.y = st.y + dir[i][];
if(judge(now.x, now.y, now.step))
{
vis[now.x][now.y][now.step % ] = ;
q.push(now);
}
}
}
} int main()
{
while(~scanf("%d %d", &n, &m))
{
scanf("%d %d", &sx, &sy);
scanf("%d %d", &ex, &ey);
if(n < || m < )
{
if(n > m)
{
swap(n, m);
swap(sx, sy);
swap(ex, ey);
}
BFS();
if(vis[ex][ey][]) puts("Yes");
else puts("No");
}
else
{
int ans1 = (sx + sy) % ;
int ans2 = (ex + ey) % ;
if(ans1 != ans2) puts("Yes");
else puts("No");
}
}
return ;
}

G:置置置换

Solved.

$在已知1-n的方案数, 枚举n+1出现的位置$

$当枚举到位置x的时候, 选出x-1个数放在前x个, 然后计算方案数 统计即可$

$2 \cdot ans_{n + 1} = \sum\limits_{i = 0}^{n} C_n^i \cdot ans_i \cdot ans_{n - i}$

 #include <bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 const ll MOD = (ll)1e9 + ;
const int maxn = 1e3 + ; int n;
ll fac[maxn];
ll inv[maxn];
ll invfac[maxn]; ll ans[maxn]; void Init()
{
fac[] = , inv[] = , invfac[] = ;
for(int i = ; i < maxn; ++i)
{
fac[i] = fac[i - ] * i % MOD;
inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
invfac[i] = invfac[i - ] * inv[i] % MOD;
}
} ll calc(int n, int m)
{
if(n == m || m == ) return 1ll;
return fac[n] * invfac[m] % MOD * invfac[n - m] % MOD;
} int main()
{
Init();
ans[] = ans[] = ;
for(int i = ; i + < maxn; ++i)
{
for(int j = ; j <= i; ++j)
{
ans[i + ] = (ans[i + ] + calc(i, j) * ans[j] % MOD * ans[i - j] % MOD) % MOD;
}
ans[i + ] = (ans[i + ] * inv[]) % MOD;
}
while (scanf("%d", &n) != EOF)
{
printf("%lld\n", ans[n]);
}
return ;
}

I:咆咆咆哮

Solved.

考虑如果选择$a_i的个数固定为x,那么对于所有选取b_i的卡牌来说它的贡献是固定的$

枚举$x, 再贪心选取即可$

 #include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 1010
int n, a[N], b[N]; ll f(int x)
{
priority_queue <ll> pq;
ll res = ;
for (int i = ; i <= n; ++i)
{
res += a[i];
pq.push(1ll * b[i] * x - a[i]);
}
for (int i = ; i <= n - x; ++i)
{
res += pq.top();
pq.pop();
}
return res;
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d%d", a + i, b + i);
ll res = ;
for (int i = ; i <= n; ++i)
res = max(res, f(i));
printf("%lld\n", res);
}
return ;
}

Div1:

三分

好像满足凸性? 我不会证啊。..

 #include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 100010
int n, a[N], b[N]; ll check(int x)
{
ll res = ;
priority_queue <ll> pq;
for (int i = ; i <= n; ++i)
{
res = res + a[i];
pq.push(1ll * b[i] * x - a[i]);
}
for (int i = n - x; !pq.empty() && i; --i)
{
res += pq.top(); pq.pop();
}
return res;
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d%d", a + i, b + i);
int l = , r = n; ll res = ;
while (r - l >= )
{
int midl = (l + r) >> ;
int midr = (midl + r) >> ;
ll tmpl = check(midl);
ll tmpr = check(midr);
if (tmpl <= tmpr)
{
res = max(res, tmpr);
l = midl + ;
}
else
{
res = max(res, tmpl);
r = midr - ;
}
}
printf("%lld\n", res);
}
return ;
}

K:两条路径

Solved.

考虑$x作为交它的权值要被算上$

在考虑两条路径可以选取端点,端点的选择在其儿子对应的子树中选取一个点且仅能选取一个

树形DP即可

 #include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 100010
#define INFLL 0x3f3f3f3f3f3f3f3f
int n, q;
ll val[N];
vector <int> G[N];
ll Bit[], f[N]; void DFS(int u, int fa)
{
f[u] = -INFLL;
for (auto v : G[u]) if (v != fa)
{
DFS(v, u);
f[u] = max(f[u], f[v]);
}
f[u] = max(f[u], 0ll);
f[u] += val[u];
} void out(ll x)
{
if (x < ) putchar('-'), x = -x;
string res = "";
while (x)
{
res += (x % + '');
x /= ;
}
reverse(res.begin(), res.end());
cout << res << "\n";
} int main()
{
Bit[] = ;
for (int i = ; i <= ; ++i) Bit[i] = Bit[i - ] << ;
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) G[i].clear();
for (int i = , x; i <= n; ++i)
{
scanf("%d", &x);
if (!x)
{
val[i] = ;
continue;
}
int vis = ;
if (x < )
{
x = -x;
vis = -;
}
--x;
val[i] = Bit[x] * vis;
}
for (int i = , u, v; i < n; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
int x;
scanf("%d", &q);
while (q--)
{
scanf("%d", &x);
priority_queue <ll> pq;
for (auto v : G[x])
{
DFS(v, x);
pq.push(f[v]);
}
ll res = val[x];
for (int i = ; i <= && !pq.empty() && pq.top() > ; ++i)
{
res += pq.top(); pq.pop();
}
//cout << res << endl;
out(res);
}
}
return ;
}

CCPC-Wannafly Winter Camp Day4 (Div2, onsite)的更多相关文章

  1. 2019 CCPC-Wannafly Winter Camp Day4(Div2, onsite)

    slove 6/11 A.夺宝奇兵 Code:zz Thinking:zz 贪心即可.这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  4. CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)

    题目链接 题意 对序列进行三种操作: 1.区间求和. 2.将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边. 3.将区间大于$x$的数不改变相对顺序的前提 ...

  5. CCPC-Wannafly Winter Camp Day8 (Div2, onsite)

    咕咕咕.    camp补题. 传送门:https://www.zhixincode.com/contest/29/problems A.Aqours 题意:有一棵有根树,根节点为1,给出每个结点的父 ...

  6. CCPC-Wannafly Winter Camp Day3 (Div2, onsite)

    Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...

  7. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  8. 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)

    solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...

  9. Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的 ...

随机推荐

  1. VS-Qt-OSG-CMake基本项目框架

    在VS-Qt-CMake基础上,打开mainwindow.ui,添加一个QWidget,然后在widget上右键-提升,选择SceneViewWidget CMakeLists.txt中添加了OSG相 ...

  2. 在联网时,两台linux服务器传输文件方法

    登陆服务器root用户命令:su - root 传输文件命令:scp +需要传输linux系统文件+空格+目标linux服务器的用户名@服务器ip地址:+传输的文件路径:例:scp /mnt/work ...

  3. 如何让IOS中的文本实现3D效果

    本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9       zh ...

  4. linux配置了dns后导致mysql远程连接慢问题

    有时候dns配置错误或者其它原因会导致mysql远程连接缓慢,此时只需要关闭mysqlDNS反向解析即可解决此问题. 打开my.cnf配置,将[mysqld]下的#skip-name-resolve前 ...

  5. 如何提高AJAX客户端响应速度

    AJAX的出现极大的改变了Web应用客户端的操作模式,它使的用户可以在全心工作时不必频繁的忍受那令人厌恶的页面刷新.理论上AJAX技术在很大的程度上可以减少用户操作的等待时间,同时节约网络上的数据流量 ...

  6. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP

    TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的:

  7. 正则表达式—RegEx(RegularExpressio)(二)

    今日随笔,继续写一些关于正则表达式的东西. 首先补一点昨天的内容: 昨天少说了一个贪婪模式,什么是贪婪模式,比如像+或者*这样的元字符匹配中,会以最大匹配值匹配,这句话是什么意思呢,例如: 定义一个正 ...

  8. Hibernate数据类型映射

    Hibernate映射类型分为两种:内置的映射类型和客户化映射类型.内置映射类型负责把一些常见的Java类型映射到相应的SQL类型:此外,Hibernate还允许用户实现UserType或Compos ...

  9. Oracle等待事件之db file scattered read

    1.产生原因 该等待事件通常发生在数据库多块读时,表示发生了与全表扫描和快速索引扫描相关的等待.通常意味着全表扫描过多,或者I/O 能力不足,或者I/O 竞争. 2.确定产生问题对象方法 a)查找全表 ...

  10. scrapy爬虫系列之二--翻页爬取及日志的基本用法

    功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...