Codeforces 525E Anya and Cubes
http://codeforces.com/contest/525/problem/E
题意:
有n个方块,上面写着一些自然数,还有k个感叹号可用。k<=n
你可以选任意个方块,然后选一些贴上感叹号使上面的数值变成阶乘,然后把方块上的值加起来会得到一个和。
求和等于S的选择方法数。
思路:折半搜索,然后把所有状态按权值排序,然后统计
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#define ll long long
struct node{
ll v,st;
int id,y;
}b[],c[];
int tot1,tot2;
int n,K,flag,a[],d[];
ll S,bin[],jc[],ans;
bool cmp(node a,node b){
return a.v<b.v;
}
ll read(){
ll t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int lowbit(int x){
return (x)&(-x);
}
bool pd(ll st1,ll st2){
int cnt=;
while (st1){
ll t=st1%;
if (t==) cnt++;
st1/=;
}
while (st2){
ll t=st2%;
if (t==) cnt++;
st2/=;
}
return cnt<=K;
}
void dfs(int k,ll st,ll res,int cnt,int lim){
if (k>lim){
if (flag==){
tot1++;
b[tot1].v=res;
b[tot1].st=st;
b[tot1].id=;
b[tot1].y=cnt;
}else{
tot2++;
c[tot2].v=res;
c[tot2].st=st;
c[tot2].id=;
c[tot2].y=cnt;
}
return;
}
dfs(k+,st+bin[k-]*,res,cnt,lim);
dfs(k+,st+bin[k-]*,res+a[k],cnt,lim);
if (a[k]<=&&res+jc[a[k]]<=S&&cnt+<=K)
dfs(k+,st+bin[k-]*,res+jc[a[k]],cnt+,lim);
}
int num(ll x){
int cnt=;
while (x){
ll t=x%;
if (t==) cnt++;
x/=;
}
return cnt;
}
void up(int x,int v){
for (int i=x;i<=K;i++)
d[i]+=v;
}
int ask(int x){
return d[x];
}
int main(){
n=read();K=read();S=read();
bin[]=;
for (int i=;i<=;i++)
bin[i]=bin[i-]*;
jc[]=;
for (int i=;i<=;i++)
jc[i]=jc[i-]*i;
for (int i=;i<=n;i++)
a[i]=read();
flag=;
dfs(,,,,(n+)>>);
flag=;
dfs(((n+)>>)+,,,,n);
std::sort(b+,b++tot1,cmp);
std::sort(c+,c++tot2,cmp);
int j=tot2;
for (int i=;i<=tot1&&j;){
for (;j&&b[i].v+c[j].v>S;j--);
if (b[i].v+c[j].v==S){
for (int y=;y<=K;y++) d[y]=;
for (;i<=tot1&&b[i].v+c[j].v==S;i++) d[b[i].y]++;
for (int y=;y<=K;y++) d[y]+=d[y-];
for (;j&&b[i-].v+c[j].v==S;j--) ans+=d[K-c[j].y];
}else i++;
}
printf("%I64d\n",ans);
return ;
}
Codeforces 525E Anya and Cubes的更多相关文章
- Codeforces 525E Anya and Cubes 中途相遇法
题目链接:点击打开链接 题意: 给定n个数.k个感叹号,常数S 以下给出这n个数. 目标: 随意给当中一些数变成阶乘.至多变k个. 再随意取一些数,使得这些数和恰好为S 问有多少方法. 思路: 三进制 ...
- codeforces E - Anya and Cubes 分块处理 暴力搜索
说的是给了n个立方体,立方体从1标号到n,每个立方体上有一个数字, 你有 k 个机会 使得其中 k个数位他们自己的阶乘,(自然使用可以少于k次机会,每个立方体最多被使用1次) ,那么求出你从这n个立方 ...
- Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索
Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec Memory Limit: 512 MBSubmit: xxx ...
- Anya and Cubes CodeForces - 525E (双端搜索)
大意: 给定$n$元素序列$a$, 可以任选不超过$k$个$a_i$变换为$a_i!$, 求变换后任选若干元素和为S的方案数. 分成两块暴搜, 复杂度$O(3^{\frac{n}{2}})$ #inc ...
- [Codeforces Round #297 Div. 2] E. Anya and Cubes
http://codeforces.com/contest/525/problem/E 学习了传说中的折半DFS/双向DFS 先搜前一半数,记录结果,然后再搜后一半数,匹配之前结果. #include ...
- Codeforces525E Anya and Cubes(双向搜索)
题目 Source http://codeforces.com/contest/525/problem/E Description Anya loves to fold and stick. Toda ...
- CodeForces 508C Anya and Ghosts
Anya and Ghosts Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u S ...
- Anya and Cubes 搜索+map映射
Anya loves to fold and stick. Today she decided to do just that. Anya has n cubes lying in a line an ...
- codeforces 518C. Anya and Smartphone
C. Anya and Smartphone time limit per test 1 second memory limit per test 256 megabytes input standa ...
随机推荐
- Scala-循环
package com.mengyao.scala.function /** * Scala中循环的声明和使用(while和for) * * @author mengyao */object Tes ...
- 控制反转(IOC)/依赖注入(DI)理解
个人学习笔记,来自Acode. 1.术语 控制反转/反向控制,英文全称“Inversion of Control”,简称IoC. 依赖注入,英文全称“Dependency Injection”,简称D ...
- 关于ThinkPHP控制器的方法失效的问题
今天发现控制器的方法失效了,用了排除法,找了长时间的原因,都没有找出来,后来干脆把home模块中的控制器和视图文件都复制到bbs模块下,竟然也不行. 这说明了控制器和视图没有问题,一定是模块的配置有问 ...
- 听说每天都要写随笔,word哥~
今天主要学习了html的基本知识,进制的转换,无序列表,有序列表和表格,都是很基本的东西,然后自己自习了表单. <!DOCTYPE html PUBLIC "-//W3C//DTD X ...
- [转]Android-网络通信框架Volley使用详解
1 Volley发送get请求: public void getJson() { String url = "http://"+host+":8080/web/json. ...
- oracle触发器实例
8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INS ...
- Weka算法Clusterers-DBSCAN源代码分析
假设说世界上仅仅能存在一种基于密度的聚类算法的话.那么它必须是DBSCAN(Density-based spatial clustering of applications with noise).D ...
- 浅谈C++中的那些内存泄露
尽管学过C语言.可是C++里面的一些基础还是不太懂,还须要再掌握. 老范也開始要讲C++设计模式了,必须快点看了.不然就要白花窝滴钱了. 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间 ...
- Windows下用Caffe跑自己的数据(遥感影像)
1 前言 Caffe对于像我这样的初学者来说是一款非常容易上手的深度学习框架.关于用Caffe跑自己的数据这样的博客已经非常多,感谢前辈们为我们提供的这么好的学习资源.这里我主要结合我所在的行业,说下 ...
- css float父元素高度塌陷
css float父元素高度塌陷 float 使父元素高度塌陷不是BUG,反而是标准. float 原本是为了解决文字环绕才出现的. 当然有的时候要解决高度塌陷的问题 以下几个方法可以解决float ...