【UOJ Round #1】
枚举/DP+排列组合
缩进优化
QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$
然而并不会做啊……一点思路也没有……主要是后面那个取模非常难受……
其实正解有点逆向思维的感觉:$ans=\sum_{i=1}^n a[i] - max\{ \sum_{i=1}^n \lfloor \frac{a[i]}{x}\rfloor *(x-1) \} $
也就是先将a[i]全部加起来,然后再使得被缩掉的部分最大。
然后……枚举x,枚举x的倍数,数一下除以x为 i 的有多少个就可以了……$O(nlogn)$
//UOJ Round #1 A
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e6+,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/ int a[N],c[N],n;
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
n=getint();
LL sum=,ans=;
int mx=;
F(i,,n) a[i]=getint(),c[a[i]]++,sum+=a[i],mx=max(mx,a[i]);
D(i,mx,) c[i]+=c[i+]; F(x,,mx){
LL tmp=; int i;
for(i=;(i+)*x<=mx;i++)
tmp+=(c[i*x]-c[(i+)*x])*i;
tmp+=c[i*x]*i;
ans=max(ans,tmp*(x-));
}
printf("%lld\n",sum-ans);
return ;
}
外星人
Orz 题解
我只想到如果 x<a[i] ,那么a[i]之后放到哪里都不会有影响了……
对,我们只需要$f[i]$作为状态就够了。用$f[i]$表示$x=i$且只考虑手指数小于等于$i$的外星人的情况下的最优解与方案数。
怎么转移呢?我们在手指数小于等于$i$的外星人中选一个$a_k$作为下一个发送信息的外星人,显然这个外星人一定是有效外星人。那么考虑手指数介于$(i\ mod\ a_k , i]$的外星人,我们发现只要把他们随便插入到$f[i \ mod\ a_k]$的最优解排列中去就可以了。这个显然可以用最简单的组合数学解决。方案数即$\frac{(N_i -1)!}{N_{i\ mod\ a_k}!}$。其中$N_c$表示手指数不超过$c$的外星人个数。
//UOJ Round #1 B
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>,P=;
typedef long long LL;
/******************tamplate*********************/ int n,m,a[N],c[N],f[N][],fac[N],inv[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
n=getint(); m=getint();
int mx=m;
F(i,,n) a[i]=getint(),c[a[i]]++,mx=max(mx,a[i]);
sort(a+,a+n+);
F(i,,mx) c[i]+=c[i-]; fac[]=;
F(i,,mx) fac[i]=(LL)fac[i-]*i%P;
inv[]=inv[]=;
F(i,,mx) inv[i]=P-(LL)(P/i)*inv[P%i]%P;
F(i,,mx) inv[i]=(LL)inv[i]*inv[i-]%P; F(i,,m){
if (c[i]==) {f[i][]=i,f[i][]=;continue;}
for(int j=;a[j]<=i && j<=n;j++)
if (f[i%a[j]][]>f[i][]){
f[i][]=f[i%a[j]][];
f[i][]=(LL)fac[c[i]-]*inv[c[i%a[j]]]%P*f[i%a[j]][]%P;
}else if (f[i%a[j]][]==f[i][]){
f[i][]=(f[i][]+(LL)fac[c[i]-]*inv[c[i%a[j]]]%P*f[i%a[j]][]%P)%P;
}
}
f[m][]=(LL)f[m][]*fac[c[mx]]%P*inv[c[m]]%P;
printf("%d\n%d\n",f[m][],f[m][]);
return ;
}
【UOJ Round #1】的更多相关文章
- 【UOJ Round #5】
构造+贪心/数论 为什么只有两个标题呢……因为第二题我不会…… 怎样提高智商 构造题……然而一开始半天我都yy不出来…… 后来我想:这题应该不会特别麻烦,而且既然样例只给了1,可能再给大一点就让人发现 ...
- 【UOJ Round #8】
A 一道不错的题,虽然大家都觉得是水题,然而蒟蒻我想出来的好慢……Orz alpq 发现其实就是一个网格图,每一个大块都是同一颜色……横纵坐标互不干扰…… //UOJ Round #8 A #incl ...
- 【UOJ Round #3】
枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...
- 【CS round 34】Minimize Max Diff
[题目链接]:https://csacademy.com/contest/round-34/task/minimize-max-diff/ [题意] 给你n个数字; 数组按顺序不下降; 让你删掉k个数 ...
- 【CS Round 34】Max Or Subarray
[题目链接]:https://csacademy.com/contest/round-34/summary/ [题意] 让你找一个最短的连续子串; 使得这个子串里面所有数字or起来最大; [题解] 对 ...
- UOJ #30【CF Round #278】Tourists
求从$ x$走到$ y$的路径上可能经过的最小点权,带修改 UOJ #30 $ Solution:$ 如果两个点经过了某个连通分量,一定可以走到这个连通分量的最小值 直接构建圆方树,圆点存原点的点权 ...
- UOJ #30. 【CF Round #278】Tourists
Description Cyberland 有 n 座城市,编号从 1 到 n,有 m 条双向道路连接这些城市.第 j 条路连接城市 aj 和 bj.每天,都有成千上万的游客来到 Cyberland ...
- 【57.97%】【codeforces Round #380A】Interview with Oleg
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【42.86%】【Codeforces Round #380D】Sea Battle
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
随机推荐
- 黑苹果 之 神舟战神Z7M-SL7D2
黑苹果引导工具 Clover 配置详解:http://www.jianshu.com/p/b156b0177a24 神舟Z7m UEFI+GPT安装WIN10+MAC OS X Yosemite双系统 ...
- Java参数传值?or传引用?
O'Reilly's Javain a Nutshell by David Flanagan (see Resources) puts it best: "javamanipulates o ...
- Git 版本控制管理(一)
Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git —— The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...
- vue-router填坑之路
1.在结构化css时,习惯将不同的css文件通过一个入口文件打包,而入口文件在引入其他css文件时,需要强烈注意,要在单行末尾加分号: 少分号的,单行相对应的css文件会引用无效 @import '. ...
- Web服务器指纹识别工具httprint
Web服务器指纹识别工具httprint 在Web渗透测试中,准确判断服务器的类型直接影响后期渗透测试的成功率.Kali Linux提供了专门的Web服务器指纹识别工具Httprint.该工具根据 ...
- iml文件
iml是 intellij idea的工程配置文件,里面是当前projec的一些配置信息 ==== android studio svn 汉化 常规. 描述.网络.安全的shell 壳. 用命令行 ...
- BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)
题目链接 序列上的Hash和前缀和差不多,二维Hash也和二维前缀和差不多了. 预处理大矩阵所有r*c的小矩阵hash值,再对询问的矩阵Hash. 类比于序列上\(s[r]-s[l-1]*pow[r- ...
- hihoCoder.1457.后缀自动机四 重复旋律7(广义后缀自动机)
题目链接 假设我们知道一个节点表示的子串的和sum,表示的串的个数cnt,那么它会给向数字x转移的节点p贡献 \(sum\times 10+c\times cnt\) 的和. 建广义SAM,按拓扑序正 ...
- [POI2013]Morskie opowieści
[POI2013]Morskie opowieści 题目大意: 一个\(n(n\le5000)\)点\(m(m\le5000)\)边无向图,边权均为\(1\),有\(k(k\le10^6)\)个询问 ...
- hdu 4169 二分匹配最大独立集 ***
题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 #inclu ...