【NOIP2016练习】T3 subset (分块,状压DP)
3 subset
3.1 题目 述
一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作
- add s
在集合中加入数字 s。
- del s
在集合中删除数字 s。保证 s 存在
- cnt s
查询满足 a&s = a 条件的 a 的个数
3.2 输入
第一行一个整数 Q 接下来 Q 行,每一行都是 3 个操作中的一个
3.3 输出
对于每个 cnt 操作输出答案
3.4 Sample Input
7
add 11 cnt 15 add 4 add 0 cnt 6 del 4 cnt 15
3.5 Sample Output
1
2
2
3.6 数据 定
对于 30% 的数据满足:1 n 1000
对于 100% 的数据满足,1 n 200000 , 0 < s < 216
思路:
分块计算。a[pre][suf],其中 pre < 28,suf < 28,表示前面 8 位是 pre,后面 8 位是 suf 的
子集的数字的个数。
那么对于每个 add 和 del 操作都可以最多 28 时间枚举 suf 更新 a 数组。对于 cnt 操作,最多 28 枚举 pre,计算答案即可时间复杂度 O(n 28)
var dp:array[..,..]of longint;
s1,s2,n,i,x,j:longint;
ch:string; procedure dfs1(var s1,s2:longint;k,s:longint);
begin
if k> then
begin
inc(dp[s1,s]);
exit;
end;
if s2 and (<<k)> then dfs1(s1,s2,k+,s+(<<k))
else
begin
dfs1(s1,s2,k+,s);
dfs1(s1,s2,k+,s+(<<k));
end;
end; procedure dfs2(var s1,s2:longint;k,s:longint);
begin
if k> then
begin
dec(dp[s1,s]);
exit;
end;
if s2 and (<<k)> then dfs2(s1,s2,k+,s+(<<k))
else
begin
dfs2(s1,s2,k+,s);
dfs2(s1,s2,k+,s+(<<k));
end;
end; procedure add(x:longint);
var i:longint;
begin
s1:=; s2:=;
for i:= downto do
if x and (<<i)> then s1:=s1+<<(i-);
for i:= downto do
if x and (<<i)> then s2:=s2+<<i;
dfs1(s1,s2,,);
end; procedure del(x:longint);
var i:longint;
begin
s1:=; s2:=;
for i:= downto do
if x and (<<i)> then s1:=s1+<<(i-);
for i:= downto do
if x and (<<i)> then s2:=s2+<<i;
dfs2(s1,s2,,);
end; function cnt(x:longint):longint;
var ret,i,s:longint;
begin
ret:=;
s1:=; s2:=;
for i:= downto do
if x and (<<i)> then s1:=s1+<<(i-);
for i:= downto do
if x and (<<i)> then s2:=s2+<<i;
s:=s1;
while s> do
begin
ret:=ret+dp[s,s2];
s:=s1 and (s-);
end;
ret:=ret+dp[,s2];
exit(ret);
end; begin
assign(input,'subset.in'); reset(input);
assign(output,'subset.out'); rewrite(output);
readln(n);
for i:= to n do
begin
readln(ch);
x:=;
for j:= to length(ch) do x:=x*+ord(ch[j])-ord('');
if ch[]='a' then add(x);
if ch[]='d' then del(x);
if ch[]='c' then writeln(cnt(x));
end;
close(input);
close(output);
end.
【NOIP2016练习】T3 subset (分块,状压DP)的更多相关文章
- NOIP2016愤怒的小鸟 题解报告 【状压DP】
题目什么大家都清楚 题解 我们知道,三点确定一条抛物线,现在这条抛物线过原点,所以任意两只猪确定一条抛物线.通过运算的出对于两头猪(x1,y1),(x2,y2),他们所在抛物线a=(y1*x2-y2* ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- Noip2016愤怒的小鸟(状压DP)
题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...
- luogu2831 [NOIp2016]愤怒的小鸟 (状压dp)
由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下 ...
- NOIP2016愤怒的小鸟 [状压dp]
愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟, ...
- [Noip2016]愤怒的小鸟(状压DP)
题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...
- 【NOIP2016】愤怒的小鸟(状压DP)
题意: Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如 ...
- NOIp2016 愤怒的小鸟 【状压dp】By cellur925
题目传送门 注:本文中绿鸟==猪! 这道题开始一看数据范围我们就知道是一道状压dp,因为绿鸟仅有18个,但是开始看\(m\)好像没太懂什么意思.既然确定了是状压,那就来设计状态,一般状压的状态肯定是要 ...
- NOIP2016提高A组 A题 礼物—概率状压dp
题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有n种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会 ...
- [noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...
随机推荐
- 汉明码(Hamming Code)原理及实现
汉明码实现原理 汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码.汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误.(要注意的是,汉明码只能发现和修正一位错误,对于两位或 ...
- java中求几个字符串的最大公共子串 使用了比较器Comparator
package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...
- 数据结构C语言实现系列——线性表(单向链表)
#include <stdio.h> #include <stdlib.h> #define NN 12 #define MM 20 typedef int elemType ...
- PEP-8 规范1
代码布局 缩进 每个缩进级别使用4个空格. 延续线应使用Python的隐含线连接在括号,括号和大括号内,或使用悬挂缩进[7],垂直对齐包装元素.使用悬挂式凹痕时,应考虑以下因素;第一行应该没有参数,应 ...
- arm页表在linux中的融合
参考:arm-linux内存页表创建 arm的第一级页表条目数为4096个,对于4K页第二级目录条目个数为256个,一级二级条目都是每个条目4字节. 在linux下二级分页如下:虚拟地址——> ...
- spring+struts2+mybatis框架依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- hdu 3836 tarjain 求强连通分量个数
// 给你一个有向图,问你最少加几条边能使得该图强连通 #include <iostream> #include <cstdio> #include <cstring&g ...
- poj 3669 火星撞地球问题 bfs算法
题意:火星撞地球,你要跑到一个永远安全的地方,求最短时间 思路:bfs+预处理 这题的数据量比较大,所以需要进行预处理 对每个位置设上时间(被撞的最早时间) 未被撞的设为-1 for (int j = ...
- java8新特性:接口的默认方法与静态方法
接口中一共可以定义三种方法: 1.抽象方法,也就是需要实现者必须实现的方法,最常见的那种 2.默认方法,不需要实现者实现 3.静态方法,不需要实现者实现 默认方法: 允许在已有的接口中添加新方法,而同 ...
- SVN 删除所有目录下的“.svn”文件夹,让文件夹脱离SVN控制
SVN 删除所有目录下的“.svn”文件夹,将如下语句拷备到记事本,并保存为 *.reg,双击导入注册表,在文件夹右键中就多了一条“Delete SVN Folders”,点击就可以删处此目录下的所有 ...