1001 Add More Zero(签到题)

题目链接 HDU6033 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!(贪心)

题目链接 HDU6034 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)

题目链接 HDU6035 Colorful Tree

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(置换)

题目链接 HDU6038 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_{f(a_i)} = b_{b_{f(a_{a_i})}} = \underbrace{b_{\cdots b_{f(i)}}}_{l\text{ times }b}
\]

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

  1. 「2017 Multi-University Training Contest 8」2017多校训练8

    1009 I am your Father! (最小树形图-朱刘算法) 题目链接 HDU6141 I am your Father! 求有向图最大生成树,要求n的父节点尽量小. 我们将所有wi变为-w ...

  2. 「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 ...

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

  4. 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之后不可以再离开. ...

  5. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

  6. 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数

    /** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...

  7. 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!

    D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...

  8. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  9. 2018 Multi-University Training Contest 3 杭电多校第三场

    躺了几天 终于记得来填坑了 1001 Ascending Rating   (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 ...

随机推荐

  1. vue的高阶组件

    探索Vue高阶组件 探索Vue高阶组件的使用 Vue高阶组件的使用方法 高阶组件应用-组件重新实例化 深入理解React 高阶组件 探索Vue高阶组件 2018-01-05 探索Vue高阶组件 Vue ...

  2. jQuery基础语法知识梳理

    一.attr() attr()方法设置或返回元素的属性. attr(属性名):获取元素属性名的值. attr(属性名,属性值):设置元素属性名的值. 例子: <a href=”http://12 ...

  3. 使用VBA进行JS加密的反混淆,还原JS代码。

    本文地址:http://www.cnblogs.com/Charltsing/p/JSEval.html 联系QQ:564955427 类似下面的代码是登陆 全国企业信用信息公示系统(安徽)(网址:h ...

  4. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  5. js判断手机机型,然后进行相对应的操作

    我们通过浏览器内置的userAgent来判断手机机型. 具体代码如下: var u = navigator.userAgent, app = navigator.appVersion; if(/App ...

  6. Velocity ${} 和$!{}、!${}区别

    前言 在使用Velocity时经常会看到三种使用变量的情况 情况一:${name} 情况二:$!{name} 情况三:!${name} 那么三者之间到底有什么区别呢?莫慌!!!哈哈 情况一:${nam ...

  7. Oracle查询数据库编码

    select userenv('language') from dual

  8. drf 之序列化组件

    序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...

  9. JavaScript中forEach与each

    forEach是ES5中操作数组的一种方法,主要功能是遍历数组,例如: var arr = [1,2,3,4]; arr.forEach(alert); 等价于: var arr = [1, 2, 3 ...

  10. Yii2总结

    1. Web访问流程(即在浏览器中输入一个网址至浏览器展现页面结果的过程) a. 将输入的网址提取出域名,在本地hosts文件中查找对应的IP地址(windows为C:/windows/system3 ...