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 ...
随机推荐
- 设计模式(十):Decorator装饰者模式 -- 结构型模式
1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...
- 【转】s3c2440 按键驱动 — 字符设备
原文网址:http://www.xuebuyuan.com/632893.html 主机:VM - redhat 9.0 开发板:FL2440,linux-2.6.12 arm-linux-gcc:3 ...
- 【转】Beagleboard:BeagleBoneBlack
原文网址:http://elinux.org/Beagleboard:BeagleBoneBlack Did you know that elinux.org has Mailing Lists? P ...
- Jquery伪选择器学习笔记
对于我这个半路出家的前端,使用jquery已经很长时间了,对于选择器,一直都局限在id,class,element选择器.每次写一个元素都得想一个id,一个页面写下来想id名都想的累的慌.最近手头项目 ...
- Windows 注册表操作
经常操作注册表,然后得到一份操作注册表函数实现.这里备份下. #ifndef _REGEDIT_H #define _REGEDIT_H int RegRead_S (struct HKEY__*Re ...
- linux0.12 链接过程
终于编译OK了..可链接就是一大堆错误 问题1: boot/head.o: In function `startup_32': (.text+0x10): undefined reference to ...
- JS浏览器对象-Screen对象
代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- Android两种 旋转Bitmap方法
方法1. 利用Bitmap.createBitmap Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { ...
- java中不常见的keyword:strictfp,transient
1.strictfp, 即 strict float point (精确浮点). strictfp keyword可应用于类.接口或方法.使用 strictfp keyword声明一个方法时,该方法中 ...
- C++11 : variadic templates(可变参数模板)
Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...