比赛题目训练系列17 (2020-2021 ACM-ICPC Brazil Subregional Programming Contest)

训练网址

E. Party Company

  • 给一棵树 (n≤105n \le 10^5n≤105),每个节点有一个权值。然后给 mmm 个区间 m≤105m \le 10^5m≤105,以及这个区间内的一个结点。然后问每个点的权值,在这个区间内,并且存在他的一个子结点或者父结点,使得其权值也在这个区间内。还有一个条件,就是子节点的权值小于等于父结点
  • 看一遍思路,就明白了
  • 首先预处理出树上倍增的数组 f(u,k)f(u, k)f(u,k),即 uuu 的 2k2^k2k 的结点是哪个.
  • 然后对于每一个区间内的结点,找到小于等于区间右端点 rrr 的权值最大的父结点u. 把当前的 L 推入到 vec[u]vec[u]vec[u] 中(vector数组)
  • 然后 dfsdfsdfs 一遍,建立一个权值树状数组,把每一个 vec[u]vec[u]vec[u] 中的左端点对用的树状数组的位置加1. 然后当前的 ans[u]=sum(age[u])ans[u] = sum(age[u])ans[u]=sum(age[u])
  • 深搜下去。然后回溯,把 vec[u]vec[u]vec[u] 中的每一个左端点在减掉
  • 这样子,就相当于把以 u 为根节点的子树都左端点都加进去,看看当前有多少个 l 满足 l<=age[u]l <= age[u]l<=age[u].
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int tr[N], age[N];
vector<int> vec[N];
int h[N], e[N], ne[N], idx;
int fa[N][20];
int ans[N];
int lowbit(int x)
{return x & -x;
}
void insert(int x, int c)
{for(int i = x; i <= 100000; i += lowbit(i)){tr[i] += c;}
}
int sum(int x)
{int res = 0;for(int i = x; i; i -= lowbit(i)){res += tr[i];}return res;
}
void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void init()
{queue<int> que;//别忘把根结点 push 进去que.push(1);while(que.size()){int u = que.front(); que.pop();for(int i = h[u]; i != -1; i = ne[i]){int v = e[i];que.push(v);fa[v][0] = u;for(int k = 1; k <= 17; k++) fa[v][k] = fa[fa[v][k - 1]][k - 1];}}
}void dfs(int u)
{for(auto p : vec[u]){insert(p, 1);}ans[u] = sum(age[u]);for(int i = h[u]; i != -1; i = ne[i]){int v = e[i];dfs(v);}for(auto p : vec[u]){insert(p, -1);}
}
int main()
{memset(h, -1, sizeof h);int n, m;scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++){scanf("%d", &age[i]);int p;scanf("%d", &p);if(i != 1) add(p, i);}age[0] = 1e9;init();while(m--){int oj, lj, rj;scanf("%d%d%d", &oj, &lj, &rj);int u = oj;for(int k = 17; k >= 0; k--){if(age[fa[u][k]] <= rj){u = fa[u][k];}}vec[u].push_back(lj);}dfs(1);for(int i = 1; i <= n; i++){printf("%d ", ans[i]);}printf("\n");return 0;
}

H. SBC’s Hangar

  • 题意:给 nnn 个数字 (n≤50n \le 50n≤50),从中选择 k 个数,使得他们之和在 [A,B][A, B][A,B] 之间。这 n 个数中,任意两个数,一定会有一个数至少是另一个数的两倍。求方案数。
  • 方案数应该是凑成 [0,B][0,B][0,B] 的方案数减去 [0,A−1][0,A-1][0,A−1] 的方案数
  • 然后,我们从大到小排序,如果当前剩余的体积可以装进去这个数,就把它加进去,然后体积减去这个数。然后继续找下一个数。这样子就得到了一个二进制序列。因为我们发现,一个数至少是另一个数的两倍,那么等价于,一个方案对应的二进制小于另一个方案。
  • 那么就变成了一个数位 dp 问题,在此范围内有多少个数,二进制的下1的个数之和为 k.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 60;
ll f[N][N], a[N];
int w[N];
int n, k;
ll dfs(int pos, int k, int lim)
{if(pos == 0) {return k == 0;}if(lim == 0 && f[pos][k] != -1){return f[pos][k];}else{ll ans = 0, up = lim ? w[pos] : 1;for(int i = 0; i <= up; i++){if(k > 0) ans += dfs(pos - 1, i == 0 ? k : k - 1, lim && i == up);if(!k && !i) ans += dfs(pos - 1, k, lim && i == up);}if(lim == 0){f[pos][k] = ans;}return ans;}
}
ll solve(ll x)
{memset(f, -1, sizeof f);memset(w, 0, sizeof w);for(int i = 1; i <= n; i++){if(x >= a[i]){w[n - i + 1] = 1;x -= a[i];}}return dfs(n, k, 1);
}
int main()
{ll A, B;scanf("%d%d", &n, &k);for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);scanf("%lld%lld", &A, &B);sort(a + 1, a + n + 1, greater<ll>());printf("%lld\n", solve(B) - solve(A - 1));return 0;
}

I. Interactivity

  • 题意:给一个树,父结点的权值是子结点权值之和。问最少需要多少询问可以知道树的所有权值。
  • 记 f(u,0)f(u, 0)f(u,0) 为当前不需要选择这个点,这个子树的权值确定,为 f(u,0)=∏v(f[v][0]+f[v][1])f(u, 0) = \prod_v (f[v][0] + f[v][1])f(u,0)=∏v​(f[v][0]+f[v][1]).
  • 记 f(u,1)f(u, 1)f(u,1) 为当前需要选择这个结点,这个子树的权值才确定下来,那么这个等价于有一个子树也是如此,即不选择这个结点(可以注意到,选择当前子结点的才能确定这个树的权值,和不选择当前点确定不了当前树的权值,是一个意思,方案数是一样的),那么 f(u,1)=∏vf(v,1)∗∏v′v′≠vg(v′)f(u, 1) = \prod_v f(v, 1) * \prod\limits_{v'}^{v' \ne v} g(v')f(u,1)=∏v​f(v,1)∗v′∏v′​=v​g(v′).
  • g(u)=f(u,0)+f(u,1)g(u) = f(u, 0) + f(u, 1)g(u)=f(u,0)+f(u,1). 表示确定当前子树权值的方案总数。
  • 最后一个求 f(u,1)f(u,1)f(u,1) 的时候,求那个 g(v′)g(v')g(v′),不可以总的乘积除以 g(v) 的方式,因为当前的 g(v) 可能取模后为0. 可以正着打一个前缀积,倒着打一个前缀积。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int N = 100010;
vector<int> son[N];
ll g[N], f[N][2];
ll pre[N], suf[N];
void dfs(int u)
{int sz = son[u].size();if(sz == 0){f[u][1] = g[u] = 1;return;}for(int i = 0; i < sz; i++){int v = son[u][i];dfs(v);}//这个地方千万不要初始化。f[u][0] = 1;for(int i = 0; i < sz; i++){int v = son[u][i];f[u][0] = f[u][0] * g[v] % mod;}pre[0] = 1, suf[sz + 1] = 1;for(int i = 1; i <= sz; i++){int v = son[u][i - 1];pre[i] = pre[i - 1] * g[v] % mod;}for(int i = sz; i >= 1; i--){int v = son[u][i - 1];suf[i] = suf[i + 1] * g[v] % mod;}for(int i = 1; i <= sz; i++){int v = son[u][i - 1];f[u][1] = (f[u][1] + f[v][1] * pre[i - 1] % mod * suf[i + 1] % mod) % mod;}g[u] = (f[u][1] + f[u][0]) % mod;
}
int main()
{int n;scanf("%d", &n);for(int i = 2; i <= n; i++){int x;scanf("%d", &x);son[x].push_back(i);}dfs(1);printf("%lld\n", g[1]);return 0;
}

K. Between Us

  • 题意:给 n 个点的图 n≤100n \le 100n≤100,把这个图分成两部分,每一个点的度数都是奇数。问是否存在这个划分方案。
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
bitset<N> a[N];
int g[N][N], d[N];
int n, m;
bool gauss()
{int r, c;for(c = 1, r = 1; c <= n; c++){int t = r;for(int i = r; i <= n; i++){if(a[i][c]){t = i;break;}}if(a[t][c] == 0) continue;swap(a[t], a[r]);for(int i = 1; i <= n; i++){if(a[i][c] && i != r){a[i] ^= a[r];}}r++;}if(r <= n){for(int i = r; i <= n; i++){if(a[i][n + 1]) return false;}}return true;
}
int main()
{scanf("%d%d", &n, &m);for(int i = 1; i <= m; i++){int a, b;scanf("%d%d", &a, &b);d[a]++, d[b]++;g[a][b] = g[b][a] = 1;}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){if(g[i][j]) a[i][j] = 1;}if(d[i] & 1){a[i][n + 1] = 0, a[i][i] = 1;}else{a[i][n + 1] = 1;}}if(gauss()){printf("Y\n");}else printf("N\n");
}

比赛题目训练系列17 (2020-2021 ACM-ICPC Brazil Subregional Programming Contest)相关推荐

  1. 2019-2020 ACM ICPC Brazil Subregional Programming Contest E.Exhibition of Clownfish

    我搬运我自己应该算原创吧 题目 题意 题解 题意 某水族馆有一种神奇的

  2. A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)

    滴答滴答---题目链接 Multiplication operation is not always easy! For example, it is hard to calculate 27 × 2 ...

  3. 2018 ACM ICPC Arabella Collegiate Programming Contest A

    Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your ...

  4. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  5. 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...

  6. ACM/ICPC 比赛生涯总结+经验分享

    ACM/ICPC 比赛生涯总结+经验分享 1.获奖经历 时间 比赛 奖励 大一下 ACM陕西省赛 打铁 大一下 CCCC 团队二等奖 大二下 ACM/ICPC全国邀请赛 银奖 大二下 CCCC 团队特 ...

  7. 中国团队狂揽5项大奖!北航团队获2021 ACM MultiMedia唯一最佳论文奖

    来源:新智元 又一场计算机学术盛会落下帷幕! 10月24日,2021 ACM MultiMedia会议顺利闭幕.会议公布了多个奖项:包括最佳论文奖.最佳学生论文奖.最佳Demo奖.最佳开源奖等9个奖项 ...

  8. 2021高考本溪高中成绩查询,本溪市高级中学2020—2021学年度(上学期) 高一高二期中表奖大会...

    原标题:本溪市高级中学2020-2021学年度(上学期) 高一高二期中表奖大会 横空大气排山去,人间砥柱是此峰.在这个烟波致爽的时节,在这个书声琅琅的校园,璀璨的星辰却不仅高悬于九天之巅,也灵动在我们 ...

  9. Volatility2安装使用以及CTF比赛题目(复现)

    Volatility2安装使用以及CTF比赛题目(复现) 一 .简介 二 .安装Volatility 三 .安装插件 四 .工具介绍 五 .使用方法 1.系统基本信息(windows.info) 2. ...

最新文章

  1. 取消win开机chkdsk is verifying files
  2. python编写es脚本_es数据迁移脚本(python)
  3. 《网络攻防实践》第七周作业
  4. ambari 维护模式及reset API 操作
  5. shell 脚本从1加到100
  6. iphone7配置_西安苹果售后维修教您iphone7发热严重、耗电快怎么解决?
  7. .NET Framework VS .NET Core
  8. .NET Core使用NLog通过Kafka实现日志收集
  9. db2 脚本运行错误返回错误原因_电脑运行错误代码大全,遇到报错请自己对照断电原因所在吧...
  10. 如何重启_消费市场按下重启键,企业该如何提前布局
  11. 设计一个可以变换的c语言图案,关于图形和变换专题的数学试题
  12. 为C程序员准备的0x10个最佳问题
  13. tp5 database.php,Tp5项目修改数据库
  14. 内存溢出 permgen_通过增加堆内存/ Permgen空间来修复Eclipse OutOfMemory错误
  15. 【ESIM】论文阅读笔记:文本蕴含之ESIM
  16. phpstudy连接SQL Server 2008数据库 以及 php使用sql server出现乱码解决方式
  17. ccleaner无法更新_CCleaner回滚粗略更新,承诺不要在以后的版本中撤消用户首选项...
  18. ubuntu16.04使用腾达U6网卡驱动+建立无线热点(手机可链接)
  19. CSS 实现元素固定宽高比
  20. java框架难吗_java框架难学吗?怎样才能学好java框架?

热门文章

  1. c语言比其他语言都高级,9.以下说法中正确的是( ) a.C语言比其他语言高级 b.C语言不用编译就能被计算机执行 c.C语言以接近英语国...
  2. 如果你也被pyinstaller折磨,建议阅读,pyinstaller打包教程。
  3. 蚂蚁金服风控部怎么样_蚂蚁金服面试——风控策略
  4. 计算机软件与理论 算法,几种几何约束求解算法的分析-计算机软件与理论专业论文.docx...
  5. NEU 1690 (最短路+LCA)
  6. Code Festival 2017 qualA E-Modern Painting
  7. VIVADO 11.Divider除法器IP
  8. 罚单不断,长文揭秘第三方支付!
  9. F2FS MOUNT过程
  10. 南京邮电大学网络攻防平台WriteUP——WEB(上)