首页 > 其他分享 >『模拟赛』多校A层冲刺NOIP2024模拟赛05

『模拟赛』多校A层冲刺NOIP2024模拟赛05

时间:2024-10-11 20:22:47浏览次数:1  
标签:fo ch 05 int 模拟 freopen define NOIP2024 mod

Rank

烂。

image

A. 好数(number)

签,唐,没签上。

考虑之前几次类似的题方法都是选 \(k-1\) 的方案存起来以使总复杂度除以一个 \(n\),故考虑记共 \(n^2\) 个两两组合之和,枚举当前点 \(i\) 前面的点,找是否有值为它们的差的组合,复杂度 \(\mathcal{O(n^2)}\),用 map 记再挂个 \(\log n\)。

赛时唐氏枚举反了,使复杂度成为 \(\mathcal{O(n^3\log n)}\),然后被 hack 10pts。

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
	char ch = getchar();lx x = 0 , f = 1;
	for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;
	for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);
	return x*f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define pil pair<int, ll>
#define fi first
#define se second
const int Ratio = 0;
const int N = 2e4 + 5, M = 3e7 + 5;
int n, ans;
int a[N], nc[M], tot;
unordered_map<int,int> st;
namespace Wisadel
{
    short main()
    {
        // freopen(".in", "r", stdin) , freopen(".out", "w", stdout);
        // freopen(".err", "w", stderr);
        freopen("number.in", "r", stdin) , freopen("number.out", "w", stdout);
        n = qr;
        fo(i, 1, n) a[i] = qr;
        st[2 * a[1]] = 1;
        fo(i, 2, n)
        {
            fo(j, 1, i - 1)
                if(st[a[i] - a[j]]){ans++; break;}
            fo(j, 1, i) st[a[i] + a[j]] = 1;
        }
        printf("%d\n", ans);
        return Ratio;
    }
}
int main(){return Wisadel::main();}

B. SOS字符串(sos)

不难想的分讨型 dp,但赛时脑子被卡住了一点没想 dp。

发现转移只用到后串的最后几个字符,且只用到两种状态:

  1. \(S\rightarrow SO\)
  2. \(SO\rightarrow SOS\)

故 dp 数组设为 \(f_{i,0/1/2}\),0/1 对应上面两种,2 表示除上述两种以外的状态,SOS 也计入状态 2。题目要求 SOS 出现三次及以上数量,我们再开一维 0/1/2/3 表示目前已经出现了几次 SOS,超过 3 次计入 3 状态内。然后就可以开始分讨状态转移方程了。

  • 对于 \(f_{i,0,j}\),\(i-1\) 为 S,第 \(i\) 位仍为 S;\(i-1\) 为状态 2,第 \(i\) 位也可放 S,故有:

\[f_{i,0,j}=f_{i-1,0,j}+f_{i-1,2,j} \]

  • 对于 \(f_{i,0,j}\),\(i-1\) 为 S,\(i\) 位放 O,故有:

\[f_{i,1,j}=f_{i-1,0,j} \]

  • 对于 \(f_{i,2,j}\),\(i-1\) 为 S,\(i\) 位放除 S、O 以外的 24 种字母;\(i-1\) 为 SO,\(i\) 位放除 S、O 以外的 24 种字母;\(i-1\) 为状态 2,\(i\) 位放除 S 以外的 25 种字母,故有:

\[f_{i,2,j}=f_{i-1,0,j}\times 24+f_{i-1,1,j}\times 24+f_{i-1,2,j}\times 25 \]

  • 考虑当 \(j\gt 0\) 时,SOS 可由 SO 加 S 转移而来,故有:

\[f_{i,2,j}=f_{i-1,1,j-1} \]

  • 考虑当 \(j= 3\) 时,由于 3 次及以上都计入 3 内,SOS 可由 SO 加 S 转移而来,故有:

\[f_{i,2,j}=f_{i-1,1,j} \]

最终答案为 \(\sum_{i=0}^2\ f_{n,i,3}\)。复杂度线性,有 4 的常数。

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
	char ch = getchar();lx x = 0 , f = 1;
	for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;
	for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);
	return x*f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define pil pair<int, ll>
#define fi first
#define se second
const int Ratio = 0;
const int N = 1e6 + 5;
const int mod = 1e9 + 7;
int n;
ll f[N][3][4];
namespace Wisadel
{
    short main()
    {
        // freopen(".in", "r", stdin) , freopen(".out", "w", stdout);
        // freopen(".err", "w", stderr);
        freopen("sos.in", "r", stdin) , freopen("sos.out", "w", stdout);
        n = qr;
        f[0][2][0] = 1;
        fo(i, 1, n)
        {
            fo(j, 0, 3)
            {
                f[i][0][j] = (f[i][0][j] + f[i - 1][2][j] + f[i - 1][0][j]) % mod;
                f[i][1][j] = (f[i][1][j] + f[i - 1][0][j]) % mod;
                f[i][2][j] = (f[i][2][j] + f[i - 1][0][j] * 24 + f[i - 1][1][j] * 25 + f[i - 1][2][j] * 25) % mod;
                if(j > 0) f[i][2][j] = (f[i][2][j] + f[i - 1][1][j - 1]) % mod;
                if(j == 3) f[i][2][j] = (f[i][2][j] + f[i - 1][1][j]) % mod;
            }
        }
        printf("%lld\n", (f[n][0][3] + f[n][1][3] + f[n][2][3]) % mod);
        return Ratio;
    }
}
int main(){return Wisadel::main();}

C. 集训营的气球(balloon)

很好的 trick:退背包。

先考虑部分分,发现存在修改与查询,故考虑线段树。发现 \(c\le 20\),我们可以求出每一个子段内不同 \(c\) 的方案数,超过 \(c\) 计入 \(c\) 内。

证明

证:\(f_{rt,k}=\sum_{i+j=k}f_{ls,i}\times f_{rs,j} (k\lt c)\),\(f_{rt,c}=\sum_{i+j\ge c} f_{ls,i}\times f_{rs,j}\)。

对于前一个式子是比较显然的:左选 \(i\) 个,右选 \(j\) 个得出共选 \(i+j\) 个的方案数。主要考虑第二个式子。

已知 \(i+j\ge c\),即左中所有子方案都选 \(i\) 个,右中所有子方案都选 \(j\) 个,依据乘法原理,得出左右子方案两两相乘得到总方案的所有子方案,每个子方案都选 \(i+j\ge c\) 个,显然计入 \(c\) 中不重不漏。

这样做时间复杂度是 \(\mathcal{O(nc^2\log n+q)}\) 的,空间复杂度按四倍空间算是 \(\mathcal{O(4nc^2)}\) 的,无论时间还是空间都过不去 \(n=10^6\) 的点。这样算上前三个 Subtask 的背包得分,最高可获得 80pts。

考虑正解。正解需要由前三个 Subtask 所推的 01 背包做法优化得来,考虑怎么背包。将题目视为容量为 \(c\),每个人体积为 1 并将 \(a_i\),\(b_i\) 看作权重计入,发现需要算大于 \(c\) 的所有容量的方案数,复杂度是 \(\mathcal{O(n^2)}\) 的,显然不可行。

发现容量不超过 \(c\) 的情况很小,故正难则反考虑容斥,用总方案数减去容量小于 \(c\) 的方案数求解。这样在不带修的情况下,我们的复杂度就降到 \(\mathcal{O(nc)}\) 了。

考虑带修改怎么做。我们将修改操作视为删除与添加,删除时直接在 dp 数组中删去该需求的全部贡献,其实就是反着做 01 背包,然后在插入一个新需求,即给它单独做一个 01 背包。这就是退背包。这样我们的总复杂度就是 \(\mathcal{O(nc+qc)}\) 了。

点击查看代码
#include<bits/stdc++.h>
#define fo(x, y, z) for(register int (x) = (y); (x) <= (z); (x)++)
#define fu(x, y, z) for(register int (x) = (y); (x) >= (z); (x)--)
using namespace std;
typedef long long ll;
#define lx ll
inline lx qr()
{
	char ch = getchar();lx x = 0 , f = 1;
	for(;ch<'0'||ch>'9';ch = getchar()) if(ch == '-') f = -1;
	for(;ch>= '0' && ch<= '9';ch = getchar()) x = (x<<3) + (x<<1) + (ch^48);
	return x*f;
}
#undef lx
#define qr qr()
#define pii pair<int, int>
#define pil pair<int, ll>
#define fi first
#define se second
const int Ratio = 0;
const int N = 1e6 + 1, M = 1e6;
const int mod = 1e9 + 7;
int n, c, m;
ll a[N], b[N];
ll f[21], tot;
namespace Wisadel
{
    ll Wqp(ll x, int y)
    {
        ll res = 1;
        while(y){if(y & 1) res = res * x % mod; x = x * x % mod; y >>= 1;}
        return res;
    }
    void Wjin(int x)
    {
        fu(i, c - 1, 1) f[i] = (f[i - 1] * a[x] % mod + f[i] * b[x] % mod) % mod;
        f[0] = f[0] * b[x] % mod;
        tot = tot * (a[x] + b[x]) % mod;
    }
    void Wtui(int x)
    {
        ll ny = Wqp(b[x], mod - 2);
        f[0] = f[0] * ny % mod;
        fo(i, 1, c - 1) f[i] = (f[i] - f[i - 1] * a[x] % mod + mod) % mod * ny % mod;
        tot = tot * Wqp(a[x] + b[x], mod - 2) % mod;
    }
    short main()
    {
        // freopen(".in", "r", stdin) , freopen("a.out", "w", stdout);
        // freopen(".err", "w", stderr);
        freopen("balloon.in", "r", stdin) , freopen("balloon.out", "w", stdout);
        n = qr, c = qr;
        fo(i, 1, n) a[i] = qr;
        fo(i, 1, n) b[i] = qr;
        f[0] = tot = 1;
        fo(i, 1, n) Wjin(i);
        m = qr;
        fo(i, 1, m)
        {
            int x = qr, aa = qr, bb = qr;
            Wtui(x);
            a[x] = aa, b[x] = bb;
            Wjin(x);
            ll ans = tot;
            fo(j, 0, c - 1) ans = (ans - f[j] + mod) % mod;
            printf("%lld\n", ans);
        }
        return Ratio;
    }
}
int main(){return Wisadel::main();}

D. 连通子树与树的重心(tree)

别急

标签:fo,ch,05,int,模拟,freopen,define,NOIP2024,mod
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18459018

相关文章

  • 多校A层冲刺NOIP2024模拟赛05
    T1、好数(number)签到题把选三个数相加拆为选择一个数,然后看前面有没有能用两个数组合出答案。$O(n^2)$。码(#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefpair<int,int>pii;#definemkmake_pair#de......
  • [10.11]CSP-S模拟赛
    宝贵经验:写题的时候想出时间正确的方法后千万注意计算空间,能不用数组的地方就不要用,否则可能会像我一样:\(35\to15\to0\)赛前小L说比上次简单。赛时T1一开始没有思路,但是注意到了两个关键条件:询问数\(\le300\)\(n,m\le10^9\)然后想到正解绝对不是去直接修改。注......
  • c语言模拟实现库函数 strlen strcpy strcat strcmp strstr
    一、模拟实现库函数strlen解释:strlen是求字符串长度的,求出的长度是不可能为负数所以返回类型设置为size_t也是合情合理的 typedefunsignedintsize_t\注意字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')。size_......
  • coduck 复赛模拟赛三 补题报告 侯锦呈
    自测160分第一题30分第二题100分第三题30分(后来100分 自己改的)第四题0分第一题十五的月亮题目描述假设一个每个月都是30天,用0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1表示一个月30天中的月亮......
  • 10.11 模拟赛(云智计划 模拟测#26)
    S---【云智计划】---6月23日---模拟测#26div1【补题】-比赛-梦熊联盟(mna.wang)S---【云智计划】---6月23日---模拟测#26div2【补题】-比赛-梦熊联盟(mna.wang)复盘A。看到\(n\)为偶数思路秒出。10min过样例。B。好像不太会做啊。模拟了样例2,猜出了一个很优的......
  • [45] (多校联训) A层冲刺NOIP2024模拟赛05
    这是什么午休,大黄突然走进来大黄:闪电特效!其他人:?大黄:5k!其他人:???大黄:【闪电特效】【闪电特效】男人中的男人【闪电特效】【闪电特效】雄性中的雄性【闪电特效】【闪电特效】巅峰!【闪电特效】【闪电特效】A.好数简单变形一下\[f_i+f_j+f_k=c\]\[f_j+f_k=c-f_i\]然......
  • 多校A层冲刺NOIP2024模拟赛05
    咋是计数专场啊,讨厌计数!就会一个签到题,恼了。rank21,T1100pts,T20pts,T320pts,T40ptsdp设计状态不行。T3典型的背包没看出来,T2简单dp不会设计状态。有一些套路还是要学好数(number)签到题。假设一个数\(a_i\)是好数,那么一定有\(a_i=a_x+a_y+a_z(x\ley\lez)\)用一个b......
  • 多校A层冲刺NOIP2024模拟赛05
    多校A层冲刺NOIP2024模拟赛05\(T1\)A.好数(number)\(100pts/100pts\)枚举两数之和,开个桶维护即可。点击查看代码inta[5010];unordered_map<int,bool>s;intmain(){ freopen("number.in","r",stdin); freopen("number.out","w",stdout)......
  • 多校 A 层冲刺 NOIP2024 模拟赛 05
    多校A层冲刺NOIP2024模拟赛05T1好数(number)签到题首先\(O(nV)\)的背包暴力是显然的,注意到本题只需要合法性,状态只有\(0/1\),上\(bitset\)优化转移即可。时间复杂度\(O(\frac{nV}{w})\)。T2SOS字符串(sos)签到题计数题难点在不重不漏,而本题则主要是不重。考虑一种好的......
  • ETA6005Q3Q 2.5A带动态路径管理的单节锂电开关型充电器
    2.5A带动态路径管理的单节锂电开关型充电器  ETA6005是一款充电电流达2.5A的单节锂电开关型充电。其集成了动态路径管理功能,内部路径的开关内阻仅50mohm,允许系统在没有电池的情况下,仍然可以在适配器存在是维持系统正常工作。ETA6005有特有的2级充电设定可通过引脚的0,1来设......