首页 > 其他分享 >ARC151D 解题报告

ARC151D 解题报告

时间:2022-10-19 14:11:12浏览次数:46  
标签:xa 报告 int yb sol xb ya 解题 ARC151D

题意:

给定一个序列 \(A_{0, ..., 2^k - 1}\)。
要执行 \(q\) 次如下操作:

  • 给定 \(x_i, y_i\)。对于 \(0,...,2^k-1\) 中的所有数 \(j\),如果 \(j\) 的第 \(x_i\) 位为 \(y_i\),那么令 \(j'\) 为 \(j\) 翻转第 \(x_i\) 位(\(0\) 变 \(1\),\(1\) 变 \(0\))之后的数,将 \(A_{j'}\) 加上 \(A_j\)。

求操作后的序列。

\(k \le 18, q \le 2 \times 10^5,y_i \in \{0,1\}, x_i \in [0,k-1]\)

分析:

首先这个题目暴力做是 \(O(nq)\) 的,并且没有什么突破口,只可能是 \(O(kq)\)。(\(O(n \sqrt q)\) 不是不可能,但是我显然不可能会的)

那么显然考虑能不能把询问拿来排序并按位处理。

要想知道能否排序,关键在于是否能够邻项交换。通过模拟我们发现如果 \(x_i \neq x_{i+1}\),那么是可以交换的。(这个东西我还没有感性理解,只知道模拟之后是这样的)

于是我们只需要按照 \(x_i\) 为关键字,稳定排序所有询问。注意 sort 并不是稳定排序(这个是个坑,会发现小数据上似乎是稳定的,但是其实大数据实现不同)。stable_sort 是。还可以手动稳定,也就是用 ind 作为第二关键字。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f(i, a, b) for(int i = a; i <= b; i++)
const int mod = 998244353;
int n, q; 
int a[300010];
struct query{
    int x, y, ind;
}b[300010];
bool cmp(query ca, query cb) {
    if(ca.x != cb.x) return ca.x < cb.x;
    else return ca.ind < cb.ind;
}
vector<query> sol;
void solve() {
    int bit = sol[0].x;
    int xa = 1, xb = 0, ya = 1, yb = 0;
    for(query now : sol) {
        if(now.y == 0) {
            ya += xb, yb += xa;
            ya %= mod, yb %= mod;
        }
        else {
            xa += yb, xb += ya;
            xa %= mod, xb %= mod;
        }
    }
    f(i, 0, (1 << n) - 1) {
        if(!((i >> bit) & 1)) {
            int nxt = (i | (1 << bit));
            int tx = a[i], ty = a[nxt];
            a[i] = (xa * tx % mod + xb * ty % mod) % mod;
            a[nxt] = (ya * ty % mod + yb * tx % mod) % mod;
        }
    }
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
    cin >> n >> q;
    f(i, 0, (1 << n) - 1) cin >> a[i];
    f(i, 1, q) cin >> b[i].x >> b[i].y;
    f(i, 1, q) b[i].ind = i;
    sort(b + 1, b + q + 1, cmp);
    f(i, 1, q + 1) {
        if(i != 1 && (i == q + 1 || b[i].x != b[i - 1].x)) {
            solve(); sol.clear();
        }
      	if(i == q + 1) break;
        sol.push_back(b[i]);
    }
    f(i, 0, (1 << n) - 1) cout << a[i] << " ";
}

标签:xa,报告,int,yb,sol,xb,ya,解题,ARC151D
From: https://www.cnblogs.com/Zeardoe/p/16806035.html

相关文章

  • 超级干货!如何仅花5步就能写出一篇领导绝对满意的数据分析报告
    一篇完整的数据分析报告可能会让你的求职变得更加容易。为什么会这么说?这源于我之前的求职经历。彼时我虽然在工作中经常用数据赋能业务,但这些案例十分的碎片化,没有形成完整......
  • Python实验报告
                                                         ......
  • 汽车报告丨分析了比亚迪宋全网口碑,我们得出这个结论
    ​​本文是一篇以比亚迪宋系列为研究对象的商业数据分析报告。本报告使用ForeSpider数据采集系统,对比亚迪宋系列汽车的相关数据进行采集挖掘和分析,分别对宋系列销售趋势、......
  • 【个人实验报告】博客网站
    目录​​项目名称​​​​个人实验目标​​​​完成情况​​​​项目主要内容​​​​1.任务完成情况:​​​​2.项目目标实现情况:​​​​3.项目经验总结:​​​​4.存在的不......
  • 报告分享|2022年中国灵活用工市场研究报告
    报告链接:http://tecdat.cn/?p=29474报告回顾了2021年中国网络招聘行业市场发展变化,从多个角度解读市场以及行业的变化。通过分析以上变化,总结如今网络招聘行业存在的问题......
  • 报告分享|2022中国高净值人群消费洞察与中高端冰洗消费趋势报告
    报告链接:http://tecdat.cn/?p=29476家电,作为追求美好生活的重要载体,正不断通过提升其艺术价值、精神内涵,以及个性化使用体验,来满足高净值人群“享受高品质生活”的消费需......
  • 报告分享|腾讯&埃森哲:全真互联白皮书
     报告链接:http://tecdat.cn/?p=29478指出,全真互联是通过多种终端和形式,实现对真实世界全面感知、连接、交互的一系列技术集合与数实融合创新模式,全真体验、无限连接、自......
  • 报告分享|2022全球汽车供应链核心企业竞争力白皮书
    报告链接: http://tecdat.cn/?p=29472趋势一:全球零部件企业盈利水平恢复至疫情前水平,显著回升2021年,“新五化”为零部件企业释放了更广阔的增长空间。同时整体航运和物流......
  • 青少年训练平台--一起下棋解题
    先看题目题目描述:快来和我一起快乐的下棋吧我们下载附件得到414333134421{9913154606-913113-413129-121207-26121211271308021} 直接棋盘密码解flag得flag为qsn......
  • Python第六章实验报告
    一.实验内容:《零基础学Python》第六章实例和实战,以及一道作业题二.实验环境:IDLEShell3.9.7三.实验目的和要求:掌握定义和调用函数、变量的作用域、匿名函数、参数传递、......