noip模拟测试30
考试总结:这次考试,不是很顺利,首先看了一眼题目,觉得先做T1,想了一会觉得没什么好思路,就去打暴力,结果我不会枚举子集,码了半天发现不对,就随便交了一份代码上去,结果CE了,然后去打T3,20min打了个暴搜,结果最后全TLE,T2读了10多分钟才理解题义,但是没什么时间码了,就把T1的程序该了该交了,也不对,最后保龄了......

T1 毛一琛
思路:这题正解就是个暴搜,加上一个meet in the middle ,首先,我在考场上想到的是枚举子集,但是问题就是复杂度太高,而题解中运用到了一个状压的思想,在暴搜的过程中存储当前选择的数和当前的和,这样就可以很容易地找到所有的情况,同时,利用一个meet in the middle的思想,采用折半搜索,将前半段信息存储起来,用后半段去匹配。注意的是,暴搜的过程中要搜索三种情况,代码片段如下:
iv dfs1(int x,int w)
{
if(x>n/2)
{
int zz=0;
for(re i=1;i<=n/2;i++)
zz=(zz<<1)|v[i];
T.insert(zz,w);
return;
}
v[x]=0,dfs1(x+1,w);//situation 1
v[x]=1,dfs1(x+1,w+a[x]);//situation 2
v[x]=1,dfs1(x+1,w-a[x]);//situation 3
}
前两种情况很好理解,对于第三种情况,首先明确一个事情就是我们保存前半段信息,利用后半段去匹配,但是当前半段区间内部出现合法方案时,我们就要利用这第三个,因为当两边差值相同的时候必定是一种合法情况。代码如下:
AC_Code
#include<bits/stdc++.h>
#define re register int
#define ii inline int
#define iv inline void
#define next neeet
#define head heeead
using namespace std;
const int N=3e8+20;
const int M=3e5+10;
bool vis[1030][1030];
unordered_map<int,int>head;
int to[M],next[M],val[M];
int n,tot,ans;
int a[30],v[30];
ii read()
{
int x=0;
bool f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=0;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f?x:(-x);
}
struct Segment_cz
{
iv insert(int zz,int w)
{
int key=w;
for(re i=head[key];i;i=next[i])
{
int p=to[i];
if(p==zz&&val[i]==w)
return;
}
to[++tot]=zz;
val[tot]=w;
next[tot]=head[key];
head[key]=tot;
}
iv query(int zz,int w)
{
int key=w;
for(re i=head[key];i;i=next[i])
{
if(val[i]==w&&(!vis[to[i]][zz]))
{
++ans;
vis[to[i]][zz]=1;
}
}
return;
}
}T;
iv dfs1(int x,int w)
{
if(x>n/2)
{
int zz=0;
for(re i=1;i<=n/2;i++)
zz=(zz<<1)|v[i];
T.insert(zz,w);
return;
}
v[x]=0,dfs1(x+1,w);
v[x]=1,dfs1(x+1,w+a[x]);
v[x]=1,dfs1(x+1,w-a[x]);
}
iv dfs2(int x,int w)
{
if(x>n)
{
int zz=0;
for(re i=n/2+1;i<=n;i++)
zz=zz<<1|v[i];
T.query(zz,w);
return;
}
v[x]=0,dfs2(x+1,w);
v[x]=1,dfs2(x+1,w+a[x]);
v[x]=1,dfs2(x+1,w-a[x]);
}
signed main()
{
n=read();
for(re i=1;i<=n;i++)
a[i]=read();
dfs1(1,0);
dfs2(n/2+1,0);
printf("%d",ans-1);
return 0;
}
noip模拟测试30的更多相关文章
- [NOIP模拟测试30]题解
A.Return 出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面.可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清.(鬼知道"那么输出-1&q ...
- NOIP模拟测试30「return·one·magic」
magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 2019.7.29 NOIP模拟测试10 反思总结【T2补全】
这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...
随机推荐
- zookeeper集群及kafka集群搭建
1.zookeeper集群搭建 1.1 上传安装包 官网推荐至少3个节点,我们这里也用三个节点192.169.2.18 192.169.1.82 192.169.1.95 准备好安装包,zooke ...
- 通过UnityWebRequest得到的纹理转精灵
private IEnumerator GetImage(string url, Image fileImage) { UnityWebRequest WebRequest = new UnityWe ...
- Keepalive介绍及工作原理
注:keepalive和Nginx和高可用没有关联. 1.什么是高可用,为什么要设计高可用? 1.两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将国称之为高可用.2.系统可用率算法 ...
- 限流神器Sentinel,不了解一下吗?
概述 书接上回:你来说说什么是限流? ,限流的整体概述中,描述了 限流是什么,限流方式和限流的实现.在文章尾部的 分布式限流,没有做过多的介绍,选择了放到这篇文章中.给大伙细细讲解一下 Sentine ...
- 2.15、Centos7找回root密码
1. 2. 3. 4.补充: centos7如何进入单用户模式:
- 27、Tomcat服务的安装与配置
服务器名称 ip地址 slave-node1 172.16.1.91 27.1. Tomcat简介: Tomcat是Apache软件基金会(Apache Software Foundation)的Ja ...
- Gym 101334A Area 51 数学
大致题意: 给出n个建筑的二维坐标,每个建筑名称为一个字母,不同坐标的建筑可以有同一名称,并保证这些坐标都是在y轴上半轴.给出一串建筑名称的字符串,在X轴上找出一个或多个区间,使Nick在这个区间上从 ...
- POJ 3761:Bubble Sort——组合数学
题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍.现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713.注意,不同于真正的冒泡排序算法 ...
- 使用IDEA配置Maven
IDEA中配置Maven File --> settings 推荐配置:设置maven在不联网的情况下使用本地插件 一般使用maven为我们提供好的骨架时,是需要联网的,配置这个,可以在没有网络 ...
- JavaScript模块化的演变
自执行函数(IIFE): 作用:马上执行这个函数,自执行函数(IIFE),不易读 (function(x){console.log(x);})(3); 易读版本: (function(x){ retu ...