首页 > 其他分享 >codeforces 1829G. Hits Different 容斥原理+记忆化搜索

codeforces 1829G. Hits Different 容斥原理+记忆化搜索

时间:2023-10-30 21:57:35浏览次数:39  
标签:1829G return int 容斥 Hits mid mp curRow

题目描述

给定一个n,把n给打倒,然后递归的求出包含n在内的上面所有的会倒下的瓶子值的平方和。

这里使用二分先求出目前给定的n的行号i和列号j。观察可以发现,对于所有的列号j,j=1或者j=i时,是需要考虑往上单边的总和,其他情况都有两个分支。

再观察可以发现,两个分支在再上一行的重合部分,会被dfs多计算一遍,所以减去这一部分即可。

把计算结果用map保存,减少重复计算。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define int long long
 6 
 7 map<pair<int, int>, int> mp;
 8 
 9 int dfs(int i, int j)
10 {
11     if (mp.count({i, j})) {
12         return mp[{i, j}];
13     }
14     if (j > i || j <= 0) {
15         return mp[{i, j}] = 0;
16     }
17     int s = i * (i - 1) / 2 + j;
18     if (j == 1 || j == i) {
19         return mp[{i, j}] = s * s + dfs(i - 1, j) + dfs(i - 1, j - 1);
20     } else {
21         return mp[{i, j}] = s * s + dfs(i - 1, j) + dfs(i - 1, j - 1) - dfs(i - 2, j - 1);
22     }
23 }
24 
25 void solve()
26 {
27     int n;
28     cin >> n;
29     int l = 1, r = 2023;
30     while (l < r) {
31         int mid = (l + r) >> 1;
32         if ((1 + mid) * mid / 2 >= n) {
33             r = mid;
34         } else {
35             l = mid + 1;
36         }
37     }
38     int curRow = l;
39     int curPos = n - curRow * (curRow - 1) / 2;
40     mp[{1, 1}] = 1;
41     cout << dfs(curRow, curPos) << endl;
42 
43 }
44 
45 int32_t main()
46 {
47     ios_base::sync_with_stdio(false);
48     cin.tie(nullptr); cout.tie(nullptr);
49 
50     int t = 1;
51     cin >> t;
52     while (t--) {
53         solve();
54     }
55 
56     return 0;
57 }

 

标签:1829G,return,int,容斥,Hits,mid,mp,curRow
From: https://www.cnblogs.com/whysopt/p/17798937.html

相关文章

  • 容斥与简单反演乱写
    #defineTBDToBeDone......
  • #dp,二项式反演,容斥#CF285E Positions in Permutations
    题目问有多少个长度为\(n\)的排列\(P\)满足\(|P_i-i|=1\)的\(i\)的个数恰好为\(k\)个分析设\(dp_{i,j,k}\)表示前\(i\)个数钦定\(j\)个数满足上述条件且现在\(i\)和\(i+1\)因此被占用的方案数。那么第\(i\)个满足上述条件无非就是放入\(i-1\)或者\(......
  • Min-Max 容斥学习笔记
    前言某次考试不会这个被打爆了,现在觉得可能有学习的必要。Min-Max容斥我们现在有一个全集\(U\),设\(\min(S)\)为集合\(S\)中的最小值,\(\max(S)\)为最大值。\[\max(S)=\sum_{T\subseteqS}(-1)^{|T|+1}\min(T)\\\min(S)=\sum_{T\subseteqS}(-1)^{|T|+1}\max(T)\\\]然......
  • 反射容斥
    故事的起因是模拟赛遇到了一道题:\(N,M\le1e7\)赛时想到了其实可以去枚举原地不动的步数,然后catalan去计算方案数,但是有一个问题,就是这个限制:这个过程不能走出格子这就相当于说我有一个栈,大小为m,要放入i个数,2*i次操作每次选择放入和拿出的方案数,但是栈不能取空,同时也不能爆栈......
  • 容斥定理
    01容斥定理容斥定理(简单情况)对任意两个有限集合 A 和 B ,有=+-其中,分别表示 A ,B 的元素个数.推广结论:对于任意三个有限集合 A , B , C ,有= ++---+有限集合的计数方法1:利用容斥定理的上述两个公式计算有限集合的元素个数.有限集合的计数方法2:文氏图法,即首先根......
  • 容斥原理应用Acwing890借鉴题解
    参考文献简单的容斥原理介绍请看下图:C++代码简单的容斥原理介绍请看下图:本题思路:将题目所给出的m个数可以看成是m位的二进制数,例如当p[N]={2,3}时,此时会有01,10,11三种情况而二进制的第零位表示的是p[0]上面的数字2,第1位表示p[1]上面的数字3所以当i=1时表示只选择2的......
  • 容斥原理再再探
    前传,一年之期已到!来看一看gf去凑容斥系数!经典例题:20210620省队互测-qwaszxT2,jiangly的排列数数题,P7275计树一个组合对象由若干元素组成,但是元素直接可能可以合并,不能任意拼接。先假设可以任意拼接,然后对系数分配适当的容斥系数(此时一个方案的贡献要乘上所有元素的容斥系数......
  • 集合不相等容斥 笔记
    学习自zhouyuhang老师的ABC236Ex题解。其实就是完善了一下zhouyuhang老师没写的一些简单部分。我们先从一个经典的容斥理解:正难则反,我们钦定\(S\)内部全部相等,那么容斥系数是\((-1)^{|S|}\),于是答案就是\(\sum\limits_{S}(-1)^{|S|}f(S)\)。注意到这个集合不相等容斥......
  • 容斥相关
    二项式反演基本定义设\(f(n)\)表示在恰好选择\(n\)个不同元素满足某种条件的方案数,\(g(n)\)表示在\(n\)个不同元素选择任意个满足该条件的方案数。那么对于\(f\)和\(g\)的关系有下式。\[g(n)=\sum\limits_{i=0}^n\dbinom{n}{i}f(i)\]但是现在的问题是我们可以快速......
  • 【算法学习笔记】max-min容斥 极值反演
    max-min容斥(极值反演)即为下式;\[\begin{equation}\max\{S\}=\sum_{T\subseteqS}(-1)^{|T|+1}\min\{T\}\label{aa}\end{equation}\]\[\begin{equation}\min\{S\}=\sum_{T\subseteqS}(-1)^{|T|+1}\max\{T\}\label{ab}\end{equation}\]证明:证明\(\ref......