「2017 Multi-University Training Contest 1」2017多校训练1
1001 Add More Zero(签到题)
找出最大的k,使得\(2^m-1\ge 10^k\)。
直接取log,-1可以忽略不计。
#include <cstdio>
#include <cmath>
int cas,m;
int main(){
while(~scanf("%d",&m)){
printf("Case #%d: %d\n",++cas,(int)(m*log(2)/log(10)));
}
return 0;
}
1002 Balala Power!(贪心)
26个字母可以映射到0~25。问给定的n个字符串代表的26进制数的和的最大值是多少。注意不能有前导零。
将系数提出来就是\(a(k_{a0}\cdot 26^0+k_{a1}\cdot 26^1+...)+b(k_{b0}\cdot 26^0+k_{b1}+...)+...\)。
所以可以统计出 \(k[i ][j]\),然后根据k数组给字母们排序,注意如果某个\(k[i][j]\ge 26\),需要进位到\(k[i][j+1]\)。
然后就是从小到大依次赋值0~25。但是这样可能有前导零。
所以如果第一个不能为零,就找最小的可以为0放到最前面,它前面的都往后移一位。
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 100005
#define M 26
using namespace std;
typedef long long ll;
const ll MOD=(1e9+7);
struct Node{
int id;
int big;
bool zero;
}zm[M];
ll p[N];
ll k[M][N];
char s[N];
int cas,n;
void init(){
p[0]=1;
for(int i=1;i<N;++i)p[i]=p[i-1]*M%MOD;
}
bool cmp(const Node& a,const Node& b){
if(a.big==b.big){
int i;
for(i=a.big;i&&k[a.id][i]==k[b.id][i];--i);
return k[a.id][i]<k[b.id][i];
}
return a.big<b.big;
}
ll solve(){
for(int i=0;i<M;++i){
for(int j=0;j<=zm[i].big;++j){
if(k[i][j]>=M){
k[i][j+1]+=k[i][j]/M;
k[i][j]%=M;
if(j==zm[i].big)++zm[i].big;//!!!
}
}
}
sort(zm,zm+M,cmp);
ll ans=0;
int i;
for(i=0;i<M&&!zm[i].zero;++i);
rotate(zm,zm+i,zm+i+1);
for(int i=0;i<M;++i){
for(int j=0;j<=zm[i].big;++j){
ans+=k[zm[i].id][j]*p[j]*i;
if(ans>=MOD)ans%=MOD;
}
}
return ans;
}
int main(){
init();
while(~scanf("%d",&n)){
for(int i=0;i<M;++i){
zm[i].id=i;
zm[i].big=0;
zm[i].zero=true;
memset(k[i],0,sizeof(k[i]));
}
for(int i=0;i<n;++i){
scanf("%s",s);
int len=strlen(s);
if(len>1)zm[s[0]-'a'].zero=false;
for(int j=0;s[j];++j){
int d=s[j]-'a';
++k[d][len-j-1];
zm[d].big=max(zm[d].big,len-j-1);
}
}
printf("Case #%d: %lld\n",++cas,solve());
}
return 0;
}
1003 Colorful Tree(dfs)
n(1e5)个节点的树,已知每个节点颜色,求每条路径的不同颜色数之和。
直接计算每条路径上不同颜色会超时,那就计算每个节点的贡献。每个节点对所有经过它的路径有可能有贡献,因为一条路径上有多个相同颜色的点,所以计算起来就麻烦了。正难则反,全集是所有颜色对所有路径都有贡献,也就是\(n\cdot(n-1)/2\)。补集是每个节点因为不经过它的路径而减少的贡献。然后用 sum[x] 记录以颜色 x 为根的子树有多少个节点。prev 记录访问当前节点 u 时,访问子节点 v 之前的sum[x],那么访问完 v 后,sumv=sum[x]-prev 就是 v 节点为根的子树里 x颜色为根的节点数量。siz[v] 记录子树 v 的总节点数,那么othr=siz[v]-sumv 就是子树 v 里不在x为根的子树里的节点的数量。所以子树 v 对颜色col[u] 减少的路径就是 所有othr个节点里任意两个之间的路径。还要考虑每个颜色最上面的点的上面的节点任意两个的路径,也是不经过该颜色的。
官方题解说这是虚树的思想。
#include <bits/stdc++.h>
#define N 200001
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
int n;
vector<int> e[N];
int siz[N];
int col[N];
ll sum[N];
ll ans;
void dfs(int u,int f){
siz[u]=1;
ll tot=0;
for(auto v:e[u]){
if(v!=f){
ll prev = sum[col[u]];
dfs(v,u);
siz[u] += siz[v];
ll sumv = sum[col[u]] - prev;
ll othr = siz[v] - sumv;
tot += sumv;
ans -= (othr-1)*othr/2;
}
}
sum[col[u]]+=siz[u]-tot;
}
int cas;
int cnt;
bool mark[N];
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;++i){
e[i].clear();
mark[i]=0;
sum[i]=0;
cnt=0;
}
for(int i=1;i<=n;++i){
scanf("%d",&col[i]);
if(!mark[col[i]]){
mark[col[i]]=1;
++cnt;
}
}
for(int i=1;i<n;++i){
int u,v;
scanf("%d%d",&u,&v);
e[u].pb(v);
e[v].pb(u);
}
ans=(ll)n*(n-1)/2*cnt;
dfs(1,0);
for(int i=1;i<=n;++i)
if(sum[i]){
ll up=n-sum[i];
ans-=(up-1)*up/2;
}
printf("Case #%d: %lld\n",++cas,ans);
}
return 0;
}
1006 Function(置换)
a 是0~n-1的排列,b 是0~m-1 的排列,\(f\) 是定义域为0~n-1,值域为0~m-1 的函数。求有多少符合\(f(i)=b_{f(a_i)}\)的函数\(f\)。
官方题解搬运:
考虑置换 a 的一个循环节,长度为 l,
\]
那么 f(i) 的值在置换 b 中所在的循环节的长度必须为 l 的因数。
而如果 f(i)的值确定下来了,这个循环节的另外 l - 1 个数的函数值也都确定下来了。
答案就是 \(\prod_{i = 1}^{k} \sum_{j | l_i} {j \cdot cal_j}\) ,其中 k 是置换 a 中循环节的个数,\(l_i\) 表示置换 a 中第 i 个循环节的长度, \(cal_j\) 表示置换 b 中长度为 j 的循环节的个数。
——————分割线——————
「2017 Multi-University Training Contest 1」2017多校训练1的更多相关文章
- 「2017 Multi-University Training Contest 8」2017多校训练8
1009 I am your Father! (最小树形图-朱刘算法) 题目链接 HDU6141 I am your Father! 求有向图最大生成树,要求n的父节点尽量小. 我们将所有wi变为-w ...
- 「2017 Multi-University Training Contest 7」2017多校训练7
1002 Build a tree(递归) 题目链接 HDU6121 Build a tree 有一棵n个点的有根树,标号为0到n-1,i号点的父亲是\(\lfloor\frac{i-1}{k}\rf ...
- 「2017 Multi-University Training Contest 2」2017多校训练2
1001 Is Derek lying 题目链接 HDU6045 Is Derek lying? 给出两个人选择题的回答,问得分分别为x和y是否可能.(\(1\le N \le 80000,0\le ...
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
/** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
- 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数
/** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...
- 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!
D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...
- 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)
咕咕咕了太久 多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...
- 2018 Multi-University Training Contest 3 杭电多校第三场
躺了几天 终于记得来填坑了 1001 Ascending Rating (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 ...
随机推荐
- Rimworld单人生存记
开局什么也没有,第一天按原来的墙造了个卧室差不多就完了,可见工作效率之低.花了三四天才种好水稻+草莓,做了短弓,挖了一些钢铁,造了燃料炉灶和屠宰台.第五天来了个人,我用短弓和他打,问题是远程最多打一下 ...
- STL queue用法
先进先出 #include<iostream> #include<algorithm> #include<cstdio> #include<stack> ...
- Array Queries CodeForces - 797E
题目链接 非常好的一道题目, 分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时 如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间. 那么分析一下,如果k>sqrt(n)的话, ...
- Python_面向对象基础
概念 类 一类抽象的事物,是描述了一类事物有哪些属性或者行为,但不是具体——模子. 实例 一个依托于类的规范存在的,被赋予了具体属性值的实际存在的物体. 对象 就是实例,实例的另外一个名称,相当于别名 ...
- 软件工程(FZU2015) 赛季得分榜,第9回合
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...
- Nginx负载均衡各种配置方式
Nginx负载均衡 - 小刚qq - 博客园http://www.cnblogs.com/xiaogangqq123/archive/2011/03/04/1971002.html Module ng ...
- xmanager 乱码
xmanager连接后中文显示乱码 - 程序员CC - 博客园http://www.cnblogs.com/aomidata/p/3445075.html Xshell 为什么会出现中文乱码?-Xma ...
- jmeter 连接数据库测试笔记
JDBC 常用mysql和oracal的jar包下载地址.jdbc driver class配置参考我的博客https://www.cnblogs.com/jackzz/p/9998975.html ...
- Spring boot 将配置文件属性注入到一个bean中
现在要做的就是将如下配置文件中的内容注入到一个bean 名为Properties中. Redis.properties配置文件中的内容如下: Properties java bean中代码如下,注意注 ...
- html 引入页面公共部分(header、footer)
html引入页面的公共部分,比如导航栏啊,页头页脚之类的. 1.将需要引入的公共html部分转换为js文件,这里推荐一个转换工具地址 http://tool.chinaz.com/Tools/Html ...