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

 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. antd快速开发(Form篇)

    antd快速开发(Form篇) 前言 由于一直在做中台业务,后台项目特别多,但是后台项目的特点是:大量的列表和大量表单,重复开发会降低效率,所以我这边总结了一下使用antd组件搭建form的快捷方法. ...

  2. 借助模板类自动实现COM连接点接收器(Sink)更新

    之前在借助模板类自动实现COM连接点接收器(Sink)中对原作者的代码进一步封装,弄清了连接点使用的原理,在看ATL代码的过程中,发现ATL本身就提供了AtlAdvise/AtlUnadvise这样的 ...

  3. excel隔行选中内容如何操作

    查看log日志是站长经常要做的事,从日志中可以发现很多问题,spider最近有没来爬,爬了哪些url,哪些页面不存在了等等,这些都可以看得到.然后你要根据不同的情况采取相应的措施.ytkah喜欢把这些 ...

  4. Linux 命令 mv

    mv 命令 --no-target-directory 参数确保对目录进行重命名而不是移动 https://www.gnu.org/software/coreutils/manual/html_nod ...

  5. js数组详解,js数组操作

    转自 http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930499.html 1.数组的创建 var arrayObj = new A ...

  6. js闭包理解与使用场景

    要理解闭包首先要知道什么是函数的作用域链 因为有函数的作用域链存在,所以函数无论在哪里调用,函数都可以使用函数外部作用域的变量. 当一个函数被调用时,会创建一个执行环境及相应的作用域链.然后使用arg ...

  7. SPA项目开发之动态树+数据表格+分页

    SPA项目开发之动态树+数据表格+分页 动态生成NavMenu导航菜单(只支持2级菜单) <el-menu key="" index=""> < ...

  8. 爬虫之selenium模块chrome版本映射表

    驱动及版本对应关系如下: 驱动下载路径见底部: chromedriver版本 支持的Chrome版本v2.43 v69-71v2.42 v68-70v2.41 v67-69v2.40 v66-68v2 ...

  9. 网络编程——sockaddr 与 sockaddr_in

    struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind.connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的. 在实际编程 ...

  10. Android Studio 之 控件基础知识

    1. TextView 和 EditText 控件常用属性  android:layout_width="match_parent" 宽度与父控件一样宽 android:layou ...