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的更多相关文章

  1. Codeforces 525E Anya and Cubes 中途相遇法

    题目链接:点击打开链接 题意: 给定n个数.k个感叹号,常数S 以下给出这n个数. 目标: 随意给当中一些数变成阶乘.至多变k个. 再随意取一些数,使得这些数和恰好为S 问有多少方法. 思路: 三进制 ...

  2. codeforces E - Anya and Cubes 分块处理 暴力搜索

    说的是给了n个立方体,立方体从1标号到n,每个立方体上有一个数字, 你有 k 个机会 使得其中 k个数位他们自己的阶乘,(自然使用可以少于k次机会,每个立方体最多被使用1次) ,那么求出你从这n个立方 ...

  3. 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  ...

  4. Anya and Cubes CodeForces - 525E (双端搜索)

    大意: 给定$n$元素序列$a$, 可以任选不超过$k$个$a_i$变换为$a_i!$, 求变换后任选若干元素和为S的方案数. 分成两块暴搜, 复杂度$O(3^{\frac{n}{2}})$ #inc ...

  5. [Codeforces Round #297 Div. 2] E. Anya and Cubes

    http://codeforces.com/contest/525/problem/E 学习了传说中的折半DFS/双向DFS 先搜前一半数,记录结果,然后再搜后一半数,匹配之前结果. #include ...

  6. Codeforces525E Anya and Cubes(双向搜索)

    题目 Source http://codeforces.com/contest/525/problem/E Description Anya loves to fold and stick. Toda ...

  7. CodeForces 508C Anya and Ghosts

     Anya and Ghosts Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...

  8. 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 ...

  9. codeforces 518C. Anya and Smartphone

    C. Anya and Smartphone time limit per test 1 second memory limit per test 256 megabytes input standa ...

随机推荐

  1. 设计模式(十):Decorator装饰者模式 -- 结构型模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  2. 【转】s3c2440 按键驱动 — 字符设备

    原文网址:http://www.xuebuyuan.com/632893.html 主机:VM - redhat 9.0 开发板:FL2440,linux-2.6.12 arm-linux-gcc:3 ...

  3. 【转】Beagleboard:BeagleBoneBlack

    原文网址:http://elinux.org/Beagleboard:BeagleBoneBlack Did you know that elinux.org has Mailing Lists? P ...

  4. Jquery伪选择器学习笔记

    对于我这个半路出家的前端,使用jquery已经很长时间了,对于选择器,一直都局限在id,class,element选择器.每次写一个元素都得想一个id,一个页面写下来想id名都想的累的慌.最近手头项目 ...

  5. Windows 注册表操作

    经常操作注册表,然后得到一份操作注册表函数实现.这里备份下. #ifndef _REGEDIT_H #define _REGEDIT_H int RegRead_S (struct HKEY__*Re ...

  6. linux0.12 链接过程

    终于编译OK了..可链接就是一大堆错误 问题1: boot/head.o: In function `startup_32': (.text+0x10): undefined reference to ...

  7. JS浏览器对象-Screen对象

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  8. Android两种 旋转Bitmap方法

    方法1. 利用Bitmap.createBitmap Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) {      ...

  9. java中不常见的keyword:strictfp,transient

    1.strictfp, 即 strict float point (精确浮点). strictfp keyword可应用于类.接口或方法.使用 strictfp keyword声明一个方法时,该方法中 ...

  10. C++11 : variadic templates(可变参数模板)

      Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...