考试的时候居然睡着了。。。

 T1的60分做法很明显,3^n枚举每个状态并进行验证

(考试剩十分钟结束的时候我开始打,,不到五分钟就写完了?

暴力(60分)

#include<bits/stdc++.h>
#define int long long
#define re register
#define ll long long
#define inc(i,j,k) for(re int i=j;i<=k;++i)
#define dec(i,j,k) for(re int i=j;i>=k;--i)
using namespace std;
const int maxn=;
int n,bit[maxn],anss;
ll x;
inline ll lowbit(ll t) {return (t&(-t));}
inline int count(ll w)
{
int tt=;
while(w)
{
w-=lowbit(w);
tt++;
}
return tt;
}
int p[maxn][];
inline void dfs(int dep,ll sum)
{
if(sum>x) return;
if(dep==n)
{
if(sum==x) anss++;
return;
}
dfs(dep+,sum+p[dep+][]);
dfs(dep+,sum+p[dep+][]);
dfs(dep+,sum+p[dep+][]);
}
signed main()
{
// freopen("123123.in","r",stdin);
scanf("%lld%lld",&n,&x);
bit[]=; bit[]=;
inc(i,,) bit[i]=bit[i-]<<;
inc(i,,n)
{
scanf("%lld",&p[i][]);
p[i][]=bit[count(p[i][])];
p[i][]=;
}
dfs(,);
cout<<anss<<endl;
}

然后说一下正解吧。

既然搜索能够拿到这么高的分数,观察到100%的数据与暴搜数据范围差距不大

考虑对搜索进行优化 (显然 meet-in-the-middle) (俺英语差 别D我)

emm就没了,从状态一暴搜一半 ,从状态n暴搜一半,这样可以大大减小搜索树的大小(减小最少一半吧)

这道题毒瘤出题人竟然放了个n=1的点

真是苟啊..

ACcode:

#include<bits/stdc++.h>
#define int long long
#define re register
#define ll long long
#define inc(i,j,k) for(re int i=j;i<=k;++i)
#define dec(i,j,k) for(re int i=j;i>=k;--i)
using namespace std;
const int maxn=30;
int n,bit[maxn],anss;
ll x;
inline ll lowbit(ll t) {return (t&(-t));}
inline int count(ll w)
{
int tt=0;
while(w)
{
w-=lowbit(w);
tt++;
}
return tt;
}
int p[maxn][4],pp[maxn][4];
map<int,int> cnt1,cnt2;
map<int,int>::iterator it;
inline void dfs1(int dep,ll sum)
{
if(dep==n/2+1)
{
cnt1[sum]++;
return;
}
dfs1(dep+1,sum+p[dep][1]);
dfs1(dep+1,sum+p[dep][2]);
dfs1(dep+1,sum+p[dep][3]);
}
inline void dfs2(int dep,ll sum)
{
if(dep==(n-n/2+1))
{
cnt2[sum]++;
return;
}
dfs2(dep+1,sum+pp[dep][1]);
dfs2(dep+1,sum+pp[dep][2]);
dfs2(dep+1,sum+pp[dep][3]);
}
inline void dfs(int dep,ll sum)
{
if(sum>x) return;
if(dep==n)
{
if(sum==x) anss++;
return;
}
dfs(dep+1,sum+p[dep+1][1]);
dfs(dep+1,sum+p[dep+1][2]);
dfs(dep+1,sum+p[dep+1][3]);
}
signed main()
{
// freopen("123123.in","r",stdin);
scanf("%lld%lld",&n,&x);
if(n==1)
{
bit[0]=0; bit[1]=2;
inc(i,2,27) bit[i]=bit[i-1]<<1;
inc(i,1,n)
{
scanf("%lld",&p[i][1]);
p[i][2]=bit[count(p[i][1])];
p[i][3]=0;
}
dfs(0,0);
cout<<anss<<endl;
return 0;
}
bit[0]=0; bit[1]=2;
inc(i,2,27) bit[i]=bit[i-1]<<1;
inc(i,1,n/2)
{
scanf("%lld",&p[i][1]);
p[i][2]=bit[count(p[i][1])];
p[i][3]=0;
}
inc(i,1,n-n/2)
{
scanf("%lld",&pp[i][1]);
pp[i][2]=bit[count(pp[i][1])];
pp[i][3]=0;
}
dfs1(1,0);
dfs2(1,0);
anss=0;
for(it=cnt2.begin();it!=cnt2.end();it++)
{
ll aa=it->first,bb=it->second;
anss+=bb*cnt1[x-aa];
}
cout<<anss;
}

((      /|_/|
  \\.._.'  , ,\
  /\ | '.__ v /
 (_ .   /   "         
  ) _)._  _ /
 '.\ \|( / (
   '' ''\\ \\

HeRaNO's NOIP CSP Round Day 2 T1 building的更多相关文章

  1. HeRaNO's NOIP CSP Round Day 2 T3 ginkgo

    睡醒后我第一眼:这不主席树裸题吗? 先统计dfs序,把树上问题转化为区间问题 区间大于等于某个数的个数...主席树模板? #include<bits/stdc++.h> #define r ...

  2. HeRaNO's NOIP CSP Round Day 2 T2 PESTC

    对于我这种菜鸡来说还是挺有迷惑性的. 在考场发现答案问的是跟最值有关的数量,想到二分,结果果然具有单调性,考虑二份答案+验证 其实什么反转什么的,可以不用去管他,对于长度小于二分答案mid的道路,不去 ...

  3. NOIP&CSP PJ 难度刷题记录

    前言 本来不想写前言的(>人<:) 这只是 mjl 给我们布置的作业,并不是我自己在刷题! 不保证所有代码的正确性,它们仅仅是通过了所有数据点而已. 1.模拟板块 整体难度:红~黄(模拟不 ...

  4. NOIP&CSP 考前 Dev-cpp 的选项问题和考试心态

    (进入考场后您将获得一个崭新的 \(Dev-cpp\),没有中文,没有编译选项,没有缺省源:我还将获得一个崭新的脑子,没有心态,没有智商,没有调试能力--) 中文 \[Step1 \] \[Step2 ...

  5. 【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计

    1.      素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷 ...

  6. NOIP模拟赛(by hzwer) T1 小奇挖矿

    [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...

  7. 括号树 noip(csp??) 2019 洛谷 P5658

    洛谷AC通道 本题,题目长,但是实际想起来十分简单. 首先,对于树上的每一个后括号,我们很容易知道,他的贡献值等于上一个后括号的贡献值 + 1.(当然,前提是要有人跟他匹配,毕竟题目中要求了,是不同的 ...

  8. [Noip 2018][标题统计 龙湖斗 摆渡车 对称二叉树]普及组题解

    啊喂,都已经9102年了,你还在想去年? 这里是一个Noip2018年PJ第二题打爆的OIer,错失省一 但经过了一年,我学到了很多,也有了很多朋友,水平也提高了很多,现在回看当时: 今年的Noip ...

  9. NOIP 2014 pj & tg

    由于我太弱,去了pj组= = ============================== T1: 傻逼暴力 T2: 傻逼暴力+判断+更新 T3: 手画一下就知道了.算出这个点在第几圈,再使劲yy下在 ...

随机推荐

  1. scikit-learn 中的 KMeans

    语法 sklearn.cluster.KMeans(n_clusters=8, # 簇的个数, 默认为 8 init='k-means++', # 初始簇中心的获取方法 n_init=10, # 初始 ...

  2. Git创建与简单使用

    一. 服务器端 创建空的仓库(以项目tm201为例) 1. git账户登录 2. 新建仓库目录 mkdir tm101.git && cd tm201.git 3. git初始化新的空 ...

  3. SDOI2010选做

    Round1 D1T1外星千足虫 \(BSOJ2793\)--高斯消元解异或方程组 简述 有\(n\)个数\(\{a_i\}\) 给出\(m\)个信息,每个信息给出\(\displaystyle{(\ ...

  4. pytest--运行指定的测试和参数化

    mark pytest提供了标记机制,允许你使用marker对测试函数做标记,一个测试函数可以有多个marker,一个marker也可以用来标记多个测试函数 比如我们需要进行冒烟测试,不可能把所有的用 ...

  5. 关于window PC机的预定义宏win32

    MSDN 里说,VC 有 3 个预处理常量,分别是 _WIN32,_WIN64,WIN32.这三个常量如何使用呢?看起来简单,其实是很困惑的. 在 Win32 配置下,WIN32 在“项目属性-C/C ...

  6. sql语句之union与join的区别

    union查询: 使用 union 可以将多个select语句的查询结果组合起来. 语法: select 字段1,字段2 from table1 union select 字段1,字段2 from t ...

  7. C/C++ 交换两个数,不使用第三个变量, 函数模板来实现

    #include <iostream> template<typename T> void exchangeTwoNumber(T &t1, T &t2): v ...

  8. Java集合详解8:Java集合类细节精讲,细节决定成败

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

  9. MySQL基础概念知多少

    MySQL基础概念相关的名词还是挺多的,比如3大范式.4种隔离界别.ACID.DQL.DML.DDL,还有redo.undo.binlog等,本文就统一整理下MySQL常见的基础概念,方便小伙伴们翻阅 ...

  10. [Gamma]阶段测试报告

    后端测试 我们进行了覆盖性测试,覆盖率达到77%. Beta阶段发现的Bug 项目显示的图片错误 无法使用搜索框 发布实验室项目的按钮点击无法跳转 连续点击发帖按钮可能发出多个相同的帖子 不需要点击我 ...