首页 > 其他分享 >20231017模拟赛

20231017模拟赛

时间:2023-10-17 20:15:02浏览次数:37  
标签:20231017 200005 int mid sum1 sum2 ull 模拟

异或帽子(hat)

显然,

\[B_i = (\oplus_{j=1}^{n} A_j) \oplus A_i \]

因为 \(2 | n\),所以:

\[S = \oplus_{i=1}^{n}B_i = \oplus_{i=1}^{n}A_i \]

那么

\[A_i = S \oplus B_i \]

#include<bits/stdc++.h>
using namespace std;
int n;
int s;
int a[200005];
signed main()
{
    freopen("hat.in","r",stdin);
    freopen("hat.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        s ^= a[i];
    }
    for(int i=1;i<=n;i++)
    {
        int tp = s ^ a[i];
        printf("%d ",tp);
    }
}

传话游戏(string)

令 \(f_i\) 表示 \([1,i]\) 中的所有数按规则交换的方案数。

显然,对于单词 \(i\) 来说,仅当单词 \(i-1\) 不同于 \(i\) 时交换才有意义。

故:

\[f_i = f_{i-1} + [S_i \not= S_{i-1}]f_{i-2} \]

#include<bits/stdc++.h>
#define ll long long
const int mod = 1e9 + 7;
using namespace std;
int n;
string a[100005];
int cnt;
ll f[100005];
signed main()
{
    
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    f[1] = 1;
    f[2] = 2 - (a[1] == a[2]);
    for(int i=3;i<=n;i++)
    {
        f[i] = f[i-1];
        if(a[i] != a[i-1])
        {
            f[i] = (f[i] + f[i-2]) % mod;
        }
    }
    printf("%lld",f[n]);
    return 0;
}

全球覆盖(globe)

发现两个维度间相互独立,考虑分开处理。

考虑若干线段,令线段 \(i\) 的权为 \(2^i\)(即在线段首尾位置附上 \(2_i\)),则区间异或和相同的地方为同种方案。

但线段数过大,考虑随机化算法随机赋权,第 \(i\) 条线段权为 \(2^{rnd}\)。

考虑生日悖论,正确概率为

\[\prod_{k=0}^{2n-1}(1-\frac{k}{2^{64}})^2 \]

运气别太烂应该都能过。

#include<bits/stdc++.h>
#define int unsigned long long
#define pii pair<unsigned long long,unsigned long long>
#define mp make_pair
using namespace std;
mt19937_64 rng(random_device{}());
int n,X,Y;
pii xx[500005],yy[500005];
int solve(pii *a,int up)
{
    vector<pii> x,y;
    x.clear();
    y.clear();
    for(int i=1,tmp=rng();i<=n;i++,tmp=rng())
    {
        x.push_back(mp(a[i].first,tmp));
        x.push_back(mp(a[i].second,tmp));
    }
    x.push_back(mp(0,0));
    x.push_back(mp(up,0));
    sort(x.begin(),x.end());
    for(int i=0,sz=x.size()-1,tmp=0;i<sz;i++)
    {
        tmp ^= x[i].second;
        y.push_back(mp(tmp,x[i+1].first - x[i].first));
    }
    sort(y.begin(),y.end());
    int res = 0;
    for(int i=0,sz=y.size(),tmp=0;i<sz;i++)
    {
        if(i == 0 || y[i].first == y[i-1].first)
        {
            tmp += y[i].second;
        }
        else tmp = y[i].second;
        res = max(res,tmp);
    }
    return res;
}
signed main()
{
    freopen("globe.in", "r", stdin);
    freopen("globe.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>X>>Y;
    for(int i=1;i<=n;i++)
    {
        cin>>xx[i].first>>yy[i].first>>xx[i].second>>yy[i].second;
    }
    cout<<solve(xx,X) * solve(yy,Y);

}

幂次序列(sequence)

求的是区间贡献。

暴力时间复杂度太高,考虑 CDQ 分治。

显然,区间 \([i,i]\) 的贡献为 \(1\)。

考虑已经完成区间 \([l,mid]\) 与 \([mid+1,r]\) 的贡献统计。

发现性质:若区间最值为 \(2^x\),则区间和不超过 \(2^{x + \log{n}}\)。

扫描区间最值,另一侧使用哈希储存后缀(或前缀),统计即可。

得卡卡常。

#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize("inline")
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt")
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
ull fpow(ull b, ull mod) {
    ull r = 1, a = 2;
    while (b) {
        if (b & 1)
            r = r * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return r;
}
int n, a[200005];
ull pw1[200005], pw2[200005];
int ans;
ull sum1[200005], sum2[200005];
const ull mod1 = 1e9 + 7, mod2 = 998244353;
ull hsh(int w, int k, int idx) {
    return (((ull)pw1[w] << k) - sum1[idx] + mod1) % mod1 * ((((ull)pw2[w] << k) - sum2[idx] + mod2) % mod2);
}
unordered_map<ull, int> mp;

void cdq(int l, int r) {
    if (l == r) {
        ans++;
        return;
    }
    int mid = (l + r) >> 1;
    cdq(l, mid);
    cdq(mid + 1, r);
    sum1[mid] = pw1[mid];
    sum1[mid + 1] = pw1[mid + 1];
    sum2[mid] = pw2[mid];
    sum2[mid + 1] = pw2[mid + 1];
    for (int i = mid + 2; i <= r; i++) {
        sum1[i] = (sum1[i - 1] + pw1[i]) % mod1;
        sum2[i] = (sum2[i - 1] + pw2[i]) % mod2;
    }
    for (int i = mid - 1; i >= l; i--) {
        sum1[i] = (sum1[i + 1] + pw1[i]) % mod1;
        sum2[i] = (sum2[i + 1] + pw2[i]) % mod2;
    }
    mp.clear();
    for (int i = mid + 1, mx = mid + 1, p = mid; i <= r; i++) {
        if (a[i] > a[mx])
            mx = i;
        while (p >= l && a[p] < a[i]) ++mp[sum1[p] * sum2[p]], p--;
        for (int j = 0; j <= 20; j++) {
            if (mp.count(hsh(mx, j, i)))
                ans += mp[hsh(mx, j, i)];
        }
    }
    mp.clear();
    for (int i = mid, mx = mid, p = mid + 1; i >= l; i--) {
        if (a[i] > a[mx])
            mx = i;
        while (p <= r && a[p] <= a[i]) ++mp[sum1[p] * sum2[p]], p++;
        for (int j = 0; j <= 20; j++) {
            if (mp.count(hsh(mx, j, i)))
                ans += mp[hsh(mx, j, i)];
        }
    }
}
signed main() {
    freopen("sequence.in", "r", stdin);
    freopen("sequence.out", "w", stdout);
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) {
        pw1[i] = fpow(a[i], mod1);
        pw2[i] = fpow(a[i], mod2);
    }
    cdq(1, n);
    cout << ans;
    return 0;
}

标签:20231017,200005,int,mid,sum1,sum2,ull,模拟
From: https://www.cnblogs.com/2021cjx-akioi/p/17770538.html

相关文章

  • CSP 赛前模拟赛出现的问题集合
    主要是自己的一些脑瘫行为。不太好调。1.忘记写取地址符。2.还没输入数据就开始数据处理。3.输入输出类型不正确,比如longlong类型写成"%d"。4.数据范围\(1<=n<=12\),我写成:constintN=12且下标从1开始。5.数组开小:指整个题目的代码开的空间只是部分数据的。6.计......
  • 题解——2023年码谷提高组模拟赛1016
    题解——2023年码谷提高组模拟赛1016一套被各种转来转去的题;参考:https://blog.csdn.net/liuziha/article/details/127353981、https://www.luogu.com.cn/blog/Chen5201314/xiao-nei-bi-sai-1025-zong-jie-ti-xie和https://www.cnblogs.com/Clyfort/articles/0927-test-solutio......
  • 2023年石门中学NOIP模拟测试(2023.10.17)
    原题大战,还是\(4\)道计数...放个头图:一蓝一紫两黑,简单且原题0.o?出模拟赛搬原题演都不演了,他真的我哭死。那这总结不写也罢T1\(n\leq10^3\)。简单来说,要选出子序列满足相同颜色连续的方案数。签到题,但写了\(\text{1h}\)的我是sb。直接大力状压,设\(dp_{i,s,c}\)表......
  • 模拟地和数字地的处理 磁珠和电感
    数字地和模拟地处理的基本原则如下:1模拟地和数字地之间链接(1)模拟地和数字地间串接电感一般取值多大?一般用几uH到数十uH。(2)用0欧电阻是最佳选择(a)可保证直流电位相等、(b)单点接地(限制噪声)、(c)对所有频率的噪声都有衰减作用(0欧也有阻抗,而且电流路径_模拟地和数字地通......
  • 10-16 NOIP模拟赛
    10-16NOIP模拟赛这周末就要去考CSP-S啦!!!所以改变答题策略,放弃之前死磕第一题正解的做题方法,以暴力为主,得分为主,思考出正解认为能得分后才写。然后发现把第一题暴力打了以后,正解也浮出水面了。明天继续尝试,然后注意休息,一定要保持良好睡眠。T1购买饮料(buy)题目描述你要......
  • NOIP2023-div2模拟赛20 D. 数星星
    妙妙+经典题。难度:Hard。题意给定一棵\(n\)个结点的树,点有点权。树上有一些简单路径,编号分别为\(1,2,\cdots,m\)。有\(q\)次询问,每次询问查询编号在\([l,r]\)中的路径的并的点权和。题解考虑一个经典题:定一个数列,每次询问一个区间不同元素的和。这个问题是简单的,你......
  • 模拟集成电路设计系列博客——2.4.5 共模反馈
    2.4.5共模反馈典型情况下,将全差分放大器用在反馈应用中时,反馈决定了差分信号的电压,但是不能影响共模电压。因此必须要增加一个额外的电路来决定输出共模电压并控制器等于某个固定的电压,一般是电源电压的一半。这个电路就称为共模反馈电路(common-modefeedback,CMFB)一般是全差分......
  • 「解题报告」2023-10-17 模拟赛
    1、取石子游戏(nim.pas/c/cpp)【题目描述】小林和亮亮正在玩一个取石子的游戏。石子一共有\(n\)堆,其中第\(i\)堆恰好有\(i\)粒石子。小林先取,亮亮后取,并且两人依次轮流取石。每一次取石子的人可以选择任意一堆还未被取完的石子,并取走这一堆中任意多粒石子(注意,不能一粒石......
  • 《流畅的Python》 读书笔记 第三章字典和集合 20231017
    第3章字典和集合dict类型是Python语言的基石模块的命名空间、实例的属性和函数的关键字参数中都可以看到字典的身影跟它有关的内置函数都在__builtins__.__dict__模块中模块的命名空间:我的理解是sys.modules实例的属性:我的理解是实例.__dict__classA:def_......
  • 10 月 16 日模拟赛总结
    Before本文章在洛谷博客同步发布Contest-Link预期\(30+0+0+20=50\)。实际\(30+0+100+60=190\)。挂分\(-140\)。rk2/totrk7,行。看T1,单调栈,不会,写暴力溜。看T2,挺线段树的,但好像维护不了,写暴力溜。看T3,不会怎么还不会啊,挺K的一个树形DP,没拿暴力30分......