首页 > 其他分享 >【UNR #7】比特迷宫

【UNR #7】比特迷宫

时间:2023-07-18 20:45:42浏览次数:53  
标签:UNR le 比特 青鱼 机器人 迷宫 include

Description

小青鱼来到了重 (zhòng) 庆市的一个迷宫,名为比特迷宫。听说只有最聪明的人才能从里面走出。

这个迷宫看似容易,但在小青鱼即将走出迷宫的时候,却被 \(n=2^k\) 个比特机器人拦住了去路。这些机器人从左到右显示着 \(a_{0,}, a_1, \cdots, a_{n-1} ,\) 表示一个 \(n-1\) 次的多项式 \(P(x)=a_0+a_1 x+\cdots+a_{n-1} x^{n-1}\) 的系数。比特机器人喜欢比特,所以每个系数只可能是 0 或者 1 。

小青鱼是无法单独修改某一个比特机器人显示的系数的,但是这个迷宫提供了一个批量修改的操作: 输入两个非负整数 \(a, b(a+b \leq n-1)\) ,显示第 \(i\) 次项系数的比特机器人会算出 \(x^a(1+x)^b\) 的第 \(i\) 次项系数 \(c_i\) ,然后将自己显示的值 \(a_i\) 修改为 \(\left(a_i+c_i\right) \bmod 2\) ,其中 \(\bmod 2\) 表示对 2 取模。

整体来看,这个操作的作用是将这个多项式 \(P(x)\) 在 \(\bmod 2\) 意义上加上 \(x^a(1+x)^b\) 。

由于这个迷宫是困难模式,小青鱼只能操作不超过 \(T\) 次。当多项式弯为 0 的时候,也即所有比特机器人都显示 0 的时候,他就通关了。

小青鱼左思右想没有想到通关的方式,于是他找到了你来帮忙。

\(1\le k\le 20\),\(a_i\in\{0,1\}\),\(1.6\times 10^5\le T\le 10^6\)。

Solution

首先,\(\dbinom{n}{m}\mod 2=[n\&m==m]\)。也就是说,当 \(m\subset n\) 时,\(\dbinom{n}{m}\) 是奇数,反之为偶数。

现在我们需要步数最小,根据贪心的思路,每次操作都要清掉尽可能多的 1。

将 \(A\) 分成一段段区间(\(1\sim len,2\sim len+1,\cdots\)),每次处理其中一个,找到一个合适的 \(a,b\) 清掉尽可能多的 1。

设 \(A'_i\) 表示当 \(A_i=1\) 时,\(A'_i=1\);当 \(A_i=0\) 时,\(A'_i =-1\)。设 \(S_i=\sum_{j\subset i} A'_j\),表示在这个区间中,使用 \((1+x)^i\) 会造成多少贡献。1 变成 0 是正贡献,0 变成 1 是负贡献。每次更新 \(A_i\) 后都重新求一遍 \(S_i\),然后选择最大的 \(S_i\) 去更新 \(A_i\)。

\(S_i\) 的计算是经典的 FWT,直接套版子就好。

最后,这个算法的正确性并没有被严格的保证,存在被构造数据导致 WA 的情况,对此我们可以在一开始随机的进行几次操作,打乱原本的序列,减小被卡的可能性。

Code

#include<cstdio>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
#define N 1100000
#define len 1024
using namespace std;
int n,T,mx,ans1,a[N],ans[N][2],b[2000];
void FWT()
{
    for (int k=1;k<len;k<<=1)
        for (int i=0;i<len;i+=(k<<1))
            for (int j=0;j<k;++j)
                b[i+j+k]+=b[i+j];
}
int main()
{
    srand(time(NULL));
    scanf("%d%d%d",&n,&T,&mx);
    for (int i=1;i<=n;++i)
        scanf("%d",&a[i]);
    for (int t=0;t<=n/500;++t)
    {
        ++ans1;
        ans[ans1][0]=t*500;
        ans[ans1][1]=rand()%(n-ans[ans1][0]-1)+1;
        for (int i=0;i<=ans[ans1][1];++i)
            if ((i&ans[ans1][1])==i) a[ans[ans1][0]+i+1]^=1;
    }
    for (int i=1;i<=n-len+1;++i)
        if (a[i])
        {
            for (int j=0;j<len;++j)
                b[j]=a[i+j]?1:-1;
            FWT();
            int mx=0;
            for (int j=1;j<len;++j)
                if (b[j]>b[mx]) mx=j;
            ++ans1;
            ans[ans1][0]=i-1;
            ans[ans1][1]=mx;
            for (int j=0;j<=mx;++j)
                if ((mx|j)==mx) a[i+j]^=1;
        }
    for (int i=max(n-len,1);i<=n;++i)
    {
        if (a[i])
        {
            ans[++ans1][0]=i-1;
            ans[ans1][1]=0;
        }
    }
    printf("%d\n",ans1);
    for (int i=1;i<=ans1;++i)
        printf("%d %d\n",ans[i][0],ans[i][1]);
    return 0;
}

标签:UNR,le,比特,青鱼,机器人,迷宫,include
From: https://www.cnblogs.com/Livingston/p/17564074.html

相关文章

  • unraid配置设置开启vpη WireGuard隧道peer
    unraid6.12版本自带WireGuard,在外访问家庭设备iosiPhone第一步,路由器打开51820端口,并添加端口转发到unraid第二步,设置-vpη管理器添加,填写名称和本地端点即可,需要当前公网ip或者ddns的域名,还没有ddns的博主推荐namesilo-ddns接着添加peer,只需填写名称和类型即可点击应......
  • java用栈解决迷宫问题
    用栈解决迷宫问题迷宫问题是计算机科学中一个经典的问题,它可以通过使用栈来解决。在本文中,我们将使用Java语言来介绍如何使用栈来解决迷宫问题。迷宫问题简介迷宫问题是一个寻找从起点到终点的路径的问题,其中起点和终点被围在一个迷宫中的墙壁之间。迷宫由一个二维矩阵表示,其中0......
  • UNR2023 退役记
    全真模拟.jpg由于全程校内所以没啥太多的有意思的。更新中......Day0按照惯例是要打UNR的。但是有一个很大的问题。UNR的时间安排和NOI是一致的。这也就意味着不得不牺牲一下午休时间了。另外,午饭也需要自行解决。目前的安排是教练统一安排泡面。然后征集口味。......
  • UNR#7游记
    考前两天是联考的NOI模拟赛。Day\(-3\)背笔试。https://duck.ac/beibishi。Day\(-2\)背笔试。VP了UNR#6的笔试。第一题AB看反扣了\(1\rmpts\)。Day\(-1\)联考模拟赛Day\(1\)。开T1。太困难,不会做。欸我会\(60\rmpts\)暴力!开T2。太困难,不会做。欸我会......
  • UNR #5 提问系统
    用栈思考稍显困难,不难发现我们可以建出一棵树出来,相当于对树进行二染色,对从根到任何点的路径上颜色数有要求,然后求愤怒值总和。考虑一个简单的DP,我们设\(f_{u,p,x}\)表示考虑点\(u\)内的子树,点\(u\)到根的路径上有\(p\)个R,子树内一共有\(x\)个R,每次合并。在根处稍微......
  • GIS系统想要实现Cesium For Unreal的视觉效果是否有捷径可走?
    对于大多数GIS开发人员来说,CesiumJS都是比较熟悉的引擎,但是相比较CesiumForUnreal而言,CesiumJS的视觉效果就显得差强人意了,因此一些GIS开发人员对CesiumForUnreal是存在需求的。但是,想要用好东西总是存在代价。由于CesiumForUnreal本身是虚幻引擎的一个插件,这就意味着如果......
  • R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达
    全文下载链接:http://tecdat.cn/?p=25880 最近我们被客户要求撰写关于泊松过程的研究报告,包括一些图形和统计输出。本文描述了一个模型,该模型解释了交易的聚集到达,并展示了如何将其应用于比特币交易数据。这是很有趣的,原因很多。例如,对于交易来说,能够预测在短期内是否有更多的买......
  • Unreal Engine4 GPU崩溃或3D设备丢失的解决方案
    起因:UnrealEngine4在渲染时报错GPU崩溃或3D设备丢失解决办法:regedit 打开注册表在以下2个路径下新建 DWORD(32-bit)Value命名为  TdrDelay,并修改数值为:60(十进制)Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDriversComput......
  • 电脑迷宫鼠----功能实现
    电脑迷宫鼠功能实现1.迷宫的生成自动生成迷宫算法介绍:网上有着各种各样的迷宫生成算法,我只是用了一种迷宫的生成算法-->prim算法该算法并不复杂,请自行到哔哩哔哩上找讲解视频进行学习,在这里展示一下java语言的实现方式 //迷宫的行数和列数privatevoidprim(introw,......
  • 电脑迷宫鼠(Java语言实现)
    电脑迷宫鼠基础要求1.概述:用java面向对象程序设计语言,设计和实现一电脑鼠走迷宫的软件程序,即一个假想的小车能在图示的迷宫中根据设定的起始点和终点自主寻找路径。本综合实践分成两部分:第一部分为算法设计和实现部分,第二部分为界面展现部分。2.第一部......