【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接:
http://codeforces.com/gym/100526
http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11674&courseid=0
题目大意:
N个学生M道题(1<=N<=12,1<=M<=30),每道题只有正误两种选项(0 1),每个学生的答题情况和正确题数已知,求标准答案可能有多少种。
如果标准答案只有一种则输出标准答案,否则输出解的个数。
题目思路:
【中途相遇法】【STL】
如果枚举每道题的正误时间复杂度是O(N*2M),肯定T了。所以考虑中途相遇法。
首先枚举前M/2道题的标准答案的正误,统计出每个状态每个学生的正确题数。
(答案的状态用二进制压缩,学生的正确题数用31进制压缩)先把每个学生答对题数的状态存进ss里
之后用一个map存下当前学生正确题数状态有几种符合条件的,并且存下任意一种答案的状态。
接下来枚举剩下的M-M/2道题目,统计学生正确题数的状态x,判断ss-x是否出现过(即前M/2道题有没有能够与现在匹配的状态),出现过则ans加上出现次数。
最后根据ans数量输出即可。
//
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-8)
#define J 10
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 14
#define M 34
using namespace std;
typedef long long LL;
int cas,cass;
int n,m,lll,ans;
char s[N][M];
int a[N],l[N],r[N];
int f[];
int z;
LL ss;
map<LL,int>num,t;
void init()
{
int i,j;
for(i=;i<=(<<);i++)
for(j=i;j;j>>=)
f[i]+=(j&);
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
LL x;
init();//统计每个数字2进制下有几个1
for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s+1))
// while(~scanf("%d",&n))
{
scanf("%d%d",&n,&m);
ans=;mem(l,);mem(r,);num.clear();t.clear();
for(i=;i<=n;i++)
scanf("%s%d",s[i],&a[i]);
for(i=,ss=;i<=n;i++)
ss=ss*+a[i];
cas=m/;
for(i=;i<=n;i++)
{
for(j=;j<cas;j++)
l[i]=l[i]*+s[i][j]-'';//前m/2道题
for(j=cas;j<m;j++)
r[i]=r[i]*+s[i][j]-'';//后m-m/2道题
}
for(j=;j<(<<cas);j++)
{
for(i=,x=;i<=n;i++)
{
x=x*+cas-f[l[i]^j];//31进制,前m/2道题状态为j的n个人的答对题数,f[l[i]^j]为错误题数
if(cas-f[l[i]^j]>a[i])break;
}
if(i<=n)continue;
num[x]++;t[x]=j<<(m-cas);//学生的状态数num和这个状态下题目答案的状态t
}
cas=m-cas;
for(j=;j<(<<cas);j++)
{
for(i=,x=;i<=n;i++)
{
x=x*+cas-f[r[i]^j];//f[r[i]^j]为错误题数
if(cas-f[r[i]^j]>a[i])break;
}
if(i<=n)continue;
if(num[ss-x])//与前面的状态匹配
{
ans+=num[ss-x];
z=t[ss-x]+j;
}
}
if(ans==)
{
for(i=(<<(m-));i;i>>=)
printf("%d",((i&z)==i));
puts("");
}
else printf("%d solutions\n",ans);
}
return ;
}
/*
// //
*/
【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)的更多相关文章
- 【最大流】BAPC2014 A Avoiding the Apocalypse (Codeforces GYM 100526)
		题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ... 
- 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)
		题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ... 
- uva 6757 Cup of Cowards(中途相遇法,貌似)
		uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ... 
- LA 2965 Jurassic Remains (中途相遇法)
		Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ... 
- HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))
		Difference Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ... 
- uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)
		用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ... 
- 紫书 例题8-3 UVa 1152(中途相遇法)
		这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ... 
- 高效算法——J 中途相遇法,求和
		---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ... 
- 【UVALive】2965 Jurassic Remains(中途相遇法)
		题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ... 
随机推荐
- JavaScript 使用
			HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 <head> 部分 ... 
- Java_Activiti5_菜鸟也来学Activiti5工作流_之入门简单例子(一)
			// VacationRequest.java /** * author : 冯孟活 ^_^ * dates : 2015年9月1日 下午10:32:58 * class : 演示简单的公司请假流程 ... 
- Mysql表复制及备份还原
			1.复制表结构 1.1 含有主键等信息的完整表结构 CREATE table 新表名 LIKE book; 1.2 只有表结构,没有主键等信息 create table 新表名 s ... 
- jdbc - Insert 'Date' value in PreparedStatement
			“preparedStatement.setDate()”方法接受的是 'java.sql.Date' 类型的参数,而我们一般格式化日期所使用的是'java.util.Date'中的'SimpleDa ... 
- iOS中MVVM的架构设计与团队协作
			对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架,之前用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人 ... 
- IIS7.5 去除 index.php web.config配置文件
			论坛里有很多关于去掉index.php的教程和代码,但是悲剧的是都是自己能配置服务器,并且服务器要么是 Apache,就是IIS 6- ...没有IIS7.5下是如何配置的. 我想大家应该有很多都是用 ... 
- 实现Bootstrap Carousel Fade Transition 淡入淡出效果
			html代码: <div id="carousel" class="carousel slide carousel-fade" data-ride=&qu ... 
- Codeforces 527E Data Center Drama(欧拉回路)
			题意: 给定一个无向图连通图,把这个的无向边变成有向边,并添加最少的有向边使这个图每个结点的出度为偶数. Solution: 题目很长,并且很多条件说的不太直接,确实不太好懂. 首先先看得到的无向图, ... 
- Struts2中的链接标签 <s:url>和<s:a>---在action中获取jsp表单提交的参数(转)
			转自:http://sgl124764903.iteye.com/blog/444183 1.普通链接 Web程序中最普通的应用是链接到其他页面,下面看Welcome.jsp. <%@ page ... 
- Bootstrap_网格系统
			首先添加CSS样式: [class *= col-]{ background-color: #eee; border: 1px solid #ccc; } [class *= col-] [class ... 
