首页 > 其他分享 >2024-04-08

2024-04-08

时间:2024-04-08 21:45:07浏览次数:21  
标签:tmp bas 04 08 t00 2024 t11 ans nw

2024-04-08

为了改昨天的 T1 ,学一下线性基

线性基

线性基:
找到一堆向量的一组基底,由原先所有向量组合出的数也可以由这组基底组合出来,且保证基底内含有的向量个数最少(极大线性无关组)

不难发现一组线性基的向量数量为向量的维数

主要用到异或线性基

构建方法是扫描每个向量 \(x\) 的所有维

如果当前第 \(i\) 维 \(x_i\) 是 1:

  • 若 \(b_i\) 不存在,\(b_i=x\) 并结束扫描

  • 若 \(b_i\) 存在,\(x^=b_i\) 并继续扫描

然后就可以做这道题了

因为 \(3^x>\sum_{i=0}^{n-1}3^i\) 所以我们可以贪心
按照 \(b\) 从大到小考虑
贪心的用线性基求出来 当 \(a=1\) 时尽量为 \(1\) 否则尽量为 \(0\) 这时能达到的最优结果
(这题数据太水了,小样例没过都 AC 了
这其实是个乱搞做法,但是数据太水就过了

为什么是错的呢?

看样例:
排完序之后是

\[1 1 0 1\newline 0 0 1 0 \]

线性基中存的是

\[x_1: 1 1 0 1 \newline x_2: 0 0 0 0 \newline x_3: 0 0 1 0 \newline x_4: 0 0 0 0 \]

2,4 位置是空的

我们在 1,3 处想要这一位尽可能是 1

所以会异或上 \(x_1,x_3\)

ans 变为 \(1,1,1,1\)

而 2,4 刚好 a 是 -1

这导致我们身不由己得选上了 -1

错误答案是 0

实际上可以选择 ans=\(0,0,1,0\),答案为 3

正解是这个

当前后两项得 b 相同时,当能达到 1,0 ,贡献为 \(3^b\)

否则可以证明一定不能到达 0,1

而能到达的 0,0 和 1,1 两种情况的贡献都是 0
我们直接删掉

这样就对了

(感觉写的好乱……

Code: 正解

#include <iostream>
#include <cstring>
#include <algorithm>
#include <bitset>

typedef long long ll;
using namespace std;

const int N=2e5+10,M=75;

int n,m;
char str[N][M];

ll pwr3[40];

bitset<M> x[N];
bitset<M> ans;
bitset<M> bas[M];

void insert(bitset<M> w) {
    for(int i=1;i<=m;i++) {
        if(!w[i]) continue;
        if(bas[i].none()) {
            bas[i]=w;
            break;
        }
        w^=bas[i];
    }
}

struct Data {
    int id;
    int a,b;
    bool operator< (const Data &t)const {
        if(b==t.b) return a>t.a;
        return b>t.b;
    }
}q[N];

int main() {
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
    pwr3[0]=1;
    for(int i=1;i<=36;i++) pwr3[i]=pwr3[i-1]*3ll; 
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",str[i]+1);
    for(int i=1;i<=m;i++) scanf("%d%d",&q[i].a,&q[i].b),q[i].id=i;
    sort(q+1,q+m+1);
    for(int j=1;j<=m;j++) {
        int k=q[j].id;
        for(int i=1;i<=n;i++) {
            if(str[i][k]=='1') x[i][j]=1;
            else x[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++) insert(x[i]);
    int nw=1;
    while(nw<=m) {
        if(nw==m||q[nw].b!=q[nw+1].b) {
            if(q[nw].a>0&&!ans[nw]) ans^=bas[nw];
            if(q[nw].a<0&&ans[nw]) ans^=bas[nw];
            nw++;
        }
        else {
            bool f11=false,f00=false;
            bitset<M> tmp=ans;
            if(!tmp[nw]) tmp^=bas[nw];
            if(tmp[nw+1]) tmp^=bas[nw+1];
            if(tmp[nw]&&!tmp[nw+1]) {
                ans=tmp;
                nw+=2;
                continue;
            }
            bitset<M> t11=ans,t00=ans;
            if(!t11[nw]) t11^=bas[nw];
            if(!t11[nw+1]) t11^=bas[nw+1];
            if(t11[nw]&&t11[nw+1]) f11=true;
            if(t00[nw]) t00^=bas[nw];
            if(t00[nw+1]) t00^=bas[nw+1];
            if(!t00[nw]&&!t00[nw+1]) f00=true;
            if(f11&&f00) {
                bas[nw][nw]=bas[nw][nw+1]=bas[nw+1][nw+1]=0;
                ans=t11;
                insert(bas[nw]),insert(bas[nw+1]);
            }
            else if(f11) ans=t11;
            else if(f00) ans=t00;
            nw+=2;
        }
    }
    ll res=0;
    for(int i=1;i<=m;i++) if(ans[i]) res=res+q[i].a*pwr3[q[i].b];
    printf("%lld\n",res);

    return 0;
}

poker

逆天题想了一晚上想不明白我太废物了快崩溃了马滴

标签:tmp,bas,04,08,t00,2024,t11,ans,nw
From: https://www.cnblogs.com/Orange-Star/p/18121174

相关文章

  • 2024年4月 杂题记录
    P10322高洁(Purity)设\(d=\prodp_i^{c_i}\),容易发现当\(d\midi^k\)时,\(i^k\)的所有质因子的幂次都不小于\(d\)的所有所有质因子的幂次,即\(i^k\)含有的质因子的幂次至少为\(\lceilc_i/k\rceil\),因此我们设\[f_k(d)=\prodp_i^{\lceilc_i/k\rceil}\]那么就有\(d\mid......
  • 2024.3.25(周一)总结
    完成python作业6-1使用函数输出指定范围内Fibonacci数的个数本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,fib(0......
  • 2024.3.26(周二)进度
    完成python作业6-2计算素数和本题要求计算输入两个正整数x,y(x<=y,包括x,y)素数和。函数isPrime用以判断一个数是否素数,primeSum函数返回素数和importmathdefprimeSum(x,y):MAX_INT=yMIN_INT=xmarks_bool=[True]*(MAX_INT+1)foriinrange(2,in......
  • python画信封 2024年3月青少年电子学会等级考试 中小学生python编程等级考试一级真题
    目录python画信封一、题目要求二、算法分析三、程序代码四、程序说明五、运行结果六、考点分析七、推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python画信封2024年3月python考级一级真题一、题目要求龙年到了,我们要给远方的亲人写一封新年贺信,请用turtle......
  • 2024年4月8日-UE5-开始菜单、事件分发器、UI预构造
    做个简单的菜单在主页面这里新建一个地图,按CTRL+N 把地面复制过来在开始关卡新建一个摄像机 打开关卡蓝图,先左键选中摄像机,然后在关卡蓝图里点右键,把摄像机拖下来   在UI里新建一个用户控件 再新建一个通用按钮 打开按钮的控件蓝图拖一个按钮进来 然......
  • Apr.8.2024 汇编中in&out的用法 显卡的初步探索
    为了读取/写入io,我们可以使用in指令和out指令in指令可以读取数据inax,dxinal,dx只能使用ax寄存器和dx寄存器,其中ax/al用来存储数据,dx指定端口同样还有out指令outdx,aloutdx,axout0x1234,alout0x1234,axout指令中,dx/立即数是端口号,al是数据——————————......
  • Yolov8-pose关键点检测:特征融合 | CAMixing:卷积-注意融合模块和多尺度提取能力 | 202
     ......
  • NCI SEER breast cancer美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型(202
    ​作者Toby,来源公众号:python生物信息学,美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型NCI美国国立癌症研究所(NationalCancerInstitute,NCI)美国国立癌症研究所(NCI)是美国国家卫生研究院(NIH)的一个组成部分,致力于癌症研究和预防。以下是NCI的一些重要信息和职责:......
  • 04_Vue Router
    官网:VueRouter|Vue.js的官方路由(vuejs.org)安装命令:npminstallvue-router@41.添加两个页面\vuedemo\src\views\index.vue、\vuedemo\src\views\content.vue2.添加\vuedemo\src\router\index.js文件用来定义路由规则import{createRouter,createWebHashHistory,cre......
  • 20240408打卡
    第七周第一天第二天第三天第四天第五天第六天第七天所花时间5h代码量(行)469博客量(篇)1知识点了解完成了python大作业,花费两天完成音频处理工具......