首页 > 其他分享 >LOJ #2351. 「JOI 2018 Final」毒蛇越狱

LOJ #2351. 「JOI 2018 Final」毒蛇越狱

时间:2022-10-21 17:55:17浏览次数:81  
标签:cnt LOJ 复杂度 long 子集 2018 using JOI define

题面传送门

奇妙的看上去不能过的题目。

首先有一个非常sb的暴力,大概就是枚举?的子集,然后统计,时间复杂度\(O(2^{cnt_1})\)单次。

直接算没有优化空间,考虑子集容斥,先FWT预处理出\(f_i\)表示\(i\)的子集的和,然后枚举当前串\(1\)的子集算答案。时间复杂度\(O(2^{cnt_2})\)。平衡后复杂度\(O(2^{\frac{n}{2}})\)。

还是不能过,再考虑超集容斥,预处理\(g_i\)表示\(i\)的超集的和,然后枚举当前串的\(0\)算答案。时间复杂度\(O(2^{cnt_3})\),平衡后复杂度\(O(2^{\frac{n}{3}})\)。

code:

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n))
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=20+5,M=(1<<20)+5,K=1e5+5,mod=1e9+7,Mod=mod-1,INF=2e9+7;const db eps=1e-5;
int n,m,k,C1,C2,C3,x,y,z,f[M],g[M],H[M],Ans;char s[N],c[M];
int main(){
	freopen("1.in","r",stdin);
	int i,j,h;scanf("%d%d",&n,&m);k=(1<<n);scanf("%s",c);for(i=0;i<k;i++) g[i]=f[i]=c[i]-='0';
	for(i=2;i<=k;i<<=1) for(j=0;j<k;j+=i) for(h=j;h<j+i/2;h++) f[h]+=f[h+i/2],g[h+i/2]+=g[h];H[0]=1;for(i=1;i<k;i++) H[i]=H[i>>1]*(i&1?-1:1);
	while(m--){Ans=x=y=0;scanf("%s",s);C1=C2=C3=0;for(i=0;i<n;i++) C1+=(s[i]=='0'),C2+=(s[i]=='1'),C2+=(s[i]=='?');
		if(C2<=7){
			for(i=0;i<n;i++) s[i]=='1'&&(x|=(1<<n-i-1)),s[i]=='?'&&(y|=(1<<n-i-1));
			Ans=c[x];for(i=y;i;i=(i-1)&y) Ans+=c[x|i];
		}else if(C1<=7){
			for(i=0;i<n;i++) s[i]=='0'&&(x|=(1<<n-i-1)),s[i]=='1'&&(y|=(1<<n-i-1));
			Ans=H[0]*f[y];for(j=x;j;j=(j-1)&x) Ans+=H[j]*f[j|y];
		}else {
			for(i=0;i<n;i++) s[i]=='?'&&(x|=(1<<n-i-1)),s[i]=='1'&&(y|=(1<<n-i-1));
			Ans=H[0]*g[x];for(j=y;j;j=(j-1)&y) Ans+=H[j]*g[j|x];Ans=abs(Ans);
		}
		printf("%d\n",Ans);
	}
}

标签:cnt,LOJ,复杂度,long,子集,2018,using,JOI,define
From: https://www.cnblogs.com/275307894a/p/16814358.html

相关文章

  • [loj2846]量子隐形传态
    假设当前位于$A(x,y)$,将坐标系按上下左右、(左/右)(上/下)分为八块引理:存在一组最优解,每次均移动到某一块中距离$(x,y)$最近的某点记$d(A,B)$为$A$到$B$的切比雪夫距离,......
  • .net core -利用 BsonDocumentProjectionDefinition 和Lookup 进行 join 关联 MongoDB
    前序   前段时间由于项目需要用到MongoDB,但是MongoDB不建议Collectionjoin 查询,网上很多例子查询都是基于linq进行关联查询。但是在stackoverflow找到一个例子,程......
  • Fork-join框架
    Fork-join框架forkjoin特点:工作密取,平衡可用线程的工作负载。分支并行每个工作线程都有一个双端队列(一个工作线程将子任务压入其双端队列队头,一个工作线程空闲时,它会从......
  • 做题记录整理图论/tarjan P5058 [ZJOI2004]嗅探器(2022/10/19)
    P5058[ZJOI2004]嗅探器首先,我们应该马上发现它求的和割点非常像,但是是对于两个点而言的割点这时候就需要对tarjan有着比较深入的理解(也可能是我太拉了)如果我们以其中一......
  • 做2018微积分期中考试题......
    我TM就是个废物!还好意思说因为是竞赛生所以微积分学着没压力?一做题现原形力!2018年的九个题,三个都遇到困难了。。。。学的是个啥啊,看来不做题还是不行啊。一些总结一、......
  • 2018农大校赛(dp大法)
    0&1DescriptionInput第一行是一个不超过100的整数t,代表了样例的组数接下来有多行,每行两个整数n和k,Output对于每组输入样例,先输出它的序号标识(‘CASE1:’,‘CASE2:’,......
  • 做题记录整理图论/dfs P5022 [NOIP2018 提高组] 旅行(2022/10/19)
    P5022[NOIP2018提高组]旅行我只想出了部分分的解法。。。https://fzy.blog.luogu.org/solution-p5022#include<bits/stdc++.h>#definefor1(i,a,b)for(inti=a;i......
  • Macrobrew: Clojure macros distilled
    原文地址:https://www.abhinavomprakash.com/posts/macrobrew/Macrobrew:ClojuremacrosdistilledNovember10,2021·23min·AbhinavOmprakashIfirstreadabo......
  • Python报AttributeError: module 'string' has no attribute 'join'解决方法
     报:AttributeError:module'string'hasnoattribute'join' 属性错误:模块“string”没有属性“join” 解决方法:因为python版本升级,函数名称已有改变,只需要将strin......
  • P4588 [TJOI2018]数学计算
    线段树板子题。#include<iostream>#include<cstring>usingnamespacestd;#defineintlonglongconstintN=8e5+1;intmod;intq,m;namespacest{inttree[......