我直接从第三题开始讲了。

T3

把数组 \(A\) 从大到小排序。

然后从前往后把前 \(q\) 个数加起来,然后判断这 \(q\) 个数的和与 \(d\) 的大小关系,如果大了就变成 \(d\)。

然后有些细节就看代码吧。

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int maxn = 2e5 + 10;
  5. int n,d,p;
  6. int a[maxn];
  7. int cnt,sum;
  8. bool cmp(int a,int b)
  9. {
  10. return a > b;
  11. }
  12. signed main()
  13. {
  14. ios::sync_with_stdio(false);
  15. cin.tie(0);cout.tie(0);
  16. cin >> n >> d >> p;
  17. int ans = 0;
  18. for(int i = 1;i <= n;i++)
  19. {
  20. cin >> a[i];
  21. ans += a[i];
  22. }
  23. sort(a + 1,a + n + 1,cmp);
  24. for(int i = 1;i <= n;i++)
  25. {
  26. sum += a[i];
  27. cnt++;
  28. if(cnt >= d && sum <= p)
  29. {
  30. break;
  31. }
  32. if(cnt == d)
  33. {
  34. if(sum >= p)
  35. {
  36. cnt = 0;
  37. ans -= sum - p;
  38. sum = 0;
  39. }
  40. }
  41. }
  42. if(sum >= p)
  43. {
  44. ans -= sum - p;
  45. }
  46. cout << ans;
  47. return 0;
  48. }

T4

看到 \(n \le 16\),想到状压 DP。

然后就没有然后了, DP式就是很普通的 DP 式。

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,ans = -1e9;
  5. int d[20][20];
  6. int dp[1 << 17];
  7. signed main()
  8. {
  9. ios::sync_with_stdio(false);
  10. cin.tie(0);cout.tie(0);
  11. cin >> n;
  12. for(int i = 0;i < n;i++)
  13. {
  14. for(int j = 0;j < n;j++)
  15. {
  16. if(i != j && i < j)
  17. cin >> d[i][j];
  18. }
  19. }
  20. for(int i = 0;i < (1 << n);i++)
  21. {
  22. for(int j = 0;j < n;j++)
  23. {
  24. if(!(i & (1 << j)))
  25. {
  26. continue;
  27. }
  28. for(int k = j + 1;k < n;k++)
  29. {
  30. if(!(i & (1 << k)))
  31. {
  32. continue;
  33. }
  34. int befor = i xor (1 << j) xor (1 << k);
  35. dp[i] = max(dp[befor] + d[j][k],dp[i]);
  36. }
  37. }
  38. }
  39. for(int i = 0;i < (1 << n);i++)
  40. {
  41. ans = max(ans,dp[i]);
  42. // cout << dp[i] << " " << i << '\n';
  43. }
  44. cout << ans;
  45. return 0;
  46. }
  47. /*
  48. 16
  49. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  50. 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  51. 1 1 1 1 1 1 1 1 1 1 1 1 1
  52. 1 1 1 1 1 1 1 1 1 1 1 1
  53. 1 1 1 1 1 1 1 1 1 1 1
  54. 1 1 1 1 1 1 1 1 1 1
  55. 1 1 1 1 1 1 1 1 1
  56. 1 1 1 1 1 1 1 1
  57. 1 1 1 1 1 1 1
  58. 1 1 1 1 1 1
  59. 1 1 1 1 1
  60. 1 1 1 1
  61. 1 1 1
  62. 1 1
  63. 1
  64. */

T5

有很多种方法。

比如liangbowen先生说的:e你直接从后往前枚举 i 不就做完了

谔谔,大家的方法都比我高级。

我是直接容斥。

首先先算出以这个点为 \(k\) 的组数并且忽略第二条。

然后减去 \(a_i = a_j = a_k\) 的情况即可。

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int maxn = 3e5 + 10;
  5. int n,ans;
  6. int cnt[maxn],sum[maxn];
  7. signed main()
  8. {
  9. ios::sync_with_stdio(false);
  10. cin.tie(0);cout.tie(0);
  11. cin >> n;
  12. for(int i = 1;i <= n;i++)
  13. {
  14. int x;
  15. cin >> x;
  16. ans += cnt[x] * (i - 1) - sum[x];
  17. sum[x] += i;
  18. cnt[x]++;
  19. }
  20. for(int i = 1;i <= n;i++)
  21. {
  22. ans -= cnt[i] * (cnt[i] - 1) * (cnt[i] - 2) / 6;
  23. }
  24. cout << ans;
  25. return 0;
  26. }

但是呢,你有可能对 ans += cnt[x] * (i - 1) - sum[x]; 有疑问,我们画个图就知道了。

F

每个物品搭配每只脚,能不能取到临界值组成的 \(2n^2\) 个点。

那么暴力判断每个点行不行。

然后判断每个关键点之后的一个点可不可以,可以的话那整个闭区间就可以。

  1. // LUOGU_RID: 123641746
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. using namespace std;
  5. const int maxn = 210;
  6. int n,cnt,ans,a[maxn],b[maxn];
  7. int c[maxn * maxn * 2],tmp[maxn];
  8. int X;
  9. bool cmp(int x,int y)
  10. {
  11. return abs(x - X) < abs(y - X);
  12. }
  13. bool check(int x)
  14. {
  15. X = x;
  16. for(int i = 1;i <= n;i++)
  17. {
  18. tmp[i] = a[i];
  19. }
  20. sort(tmp + 1,tmp + n + 1,cmp);
  21. for(int i = 1;i <= n;i++)
  22. {
  23. if(tmp[i] < x - b[i] || tmp[i] > x + b[i])
  24. {
  25. return 0;
  26. }
  27. }
  28. return 1;
  29. }
  30. signed main()
  31. {
  32. ios::sync_with_stdio(false);
  33. cin.tie(0);cout.tie(0);
  34. cin >> n;
  35. for(int i = 1;i <= n;i++)
  36. {
  37. cin >> a[i];
  38. }
  39. for(int i = 1;i <= n;i++)
  40. {
  41. cin >> b[i];
  42. }
  43. for(int i = 1;i <= n;i++)
  44. {
  45. for(int j = 1;j <= n;j++)
  46. {
  47. c[++cnt] = a[i] - b[j];
  48. c[++cnt] = a[i] + b[j];
  49. }
  50. }
  51. sort(c + 1,c + cnt + 1);
  52. cnt = unique(c + 1,c + cnt + 1) - c - 1;
  53. for(int i = 1;i <= cnt;i++)
  54. {
  55. if(check(c[i]))
  56. {
  57. ans++;
  58. }
  59. }
  60. for(int i = 1;i < cnt;i++)
  61. {
  62. if(check(c[i] + 1))
  63. {
  64. ans += c[i + 1] - c[i] - 1;
  65. }
  66. }
  67. cout << ans;
  68. return 0;
  69. }

ABC317题解报告的更多相关文章

  1. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  2. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  3. cojs 二分图计数问题1-3 题解报告

    OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...

  4. 题解报告:hdu 1398 Square Coins(母函数或dp)

    Problem Description People in Silverland use square coins. Not only they have square shapes but also ...

  5. 题解报告:hdu 2069 Coin Change(暴力orDP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...

  6. 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)

    Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...

  7. CF Educational Round 78 (Div2)题解报告A~E

    CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students​ 依题意模拟即可 #include<bits/stdc++.h> us ...

  8. CF1169(div2)题解报告

    CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...

  9. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  10. CF Round #580(div2)题解报告

    CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...

随机推荐

  1. 谢老师2024春 - Day1:组合数学

    Day1:组合数学 A - P5520 [yLOI2019] 青原樱 隔板法: 已选择的位置:\(m\) 棵樱花树. 未选择的位置:\(n-m\) 个空位置 板的数量(一棵樱花树就是一个板):\(m\ ...

  2. TairSearch:加速多列索引查询

    简介: 互联网及传统行业应用服务的关键数据一般存储在MySQL这类的关系型数据库中.如需缓解数据库访问压力,可引入Redis等缓存系统承担热数据的查询,以此提升查询效能.然而业务场景如果是在数据库上做 ...

  3. SysOM 案例解析:消失的内存都去哪了 !| 龙蜥技术

    简介: 这儿有一份"关于内存不足"排查实例,请查收. 文/系统运维 SIG 在<AK47 所向披靡,内存泄漏一网打尽>一文中,我们分享了slab 内存泄漏的排查方式和工 ...

  4. [FAQ] MEMORY ALLOC FAILED: mmap with HUGETLB failed, attempting without it (you should fix your kernel)

    cat /proc/meminfo | grep Huge sysctl vm.nr_hugepages=128 cat /proc/meminfo | grep Huge Link:https:// ...

  5. [FE] JS 判断当前是否在微信浏览器中的最新代码

    注意以下使用了 const 定义未改变的变量,没有使用 var. function isWeChatBrowser () { const ua = window.navigator.userAgent ...

  6. Windows 官方提供的触屏硬件延迟测量方法

    本文记录微软 Windows 官方在 Windows Hardware Lab Kit 提供的触屏硬件延迟测量方法 Overview of measuring Touch Down Hardware ...

  7. WPF 获取全局所有窗口的创建显示事件 监控窗口打开

    本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机.如此可以用来辅助定位问题和输出日志 这篇博客是有背景的,老司机告诉我说他的应用不响应鼠标 ...

  8. WPF 通过 RawInput 获取触摸消息

    触摸在 Windows 下属于比较特殊的输入,不同于键盘和鼠标,键盘和鼠标可以通过全局 Hook 的方式获取到鼠标和键盘的输入消息.而触摸则没有直接的 Hook 的方法.如果期望自己的应用,可以在没有 ...

  9. 解决 System.Net.Sockets.SocketException 10106 无法加载或初始化请求的服务提供程序 无法联网

    本文收集 System.Net.Sockets.SocketException 异常错误码为 10106 导致无法联网的问题 这里的 10106 是 Win32 的 Socket 错误码,可以从 Wi ...

  10. K8s应用---配置管理中心configmap和Secret(13)

    一.Configmap概述 1.1 什么是configmap Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形 ...