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. ES6 Promise 详解

    一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...

  2. c++入门之命名空间存在的意义

    看过鸡啄米的C++编程入门系列教程的朋友,应该能注意到,在其中的很多实例中,都有这么一条语句:using namespace std;,即使用命名空间std,其作用就是规定该文件中使用的标准库函数都是 ...

  3. iOS基于B站的IJKPlayer框架的流媒体探究

    阅读数:6555 学习交流及技术讨论可新浪微博关注:极客James 一.流媒体 流媒体技术从传输形式上可以分为:渐进式下载和实施流媒体. 1.渐进式下载 它是介于实时播放和本地播放之间的一种播放方式, ...

  4. Hadoop01的主要总结

    Hadoop (离线) 分布式的计算框架 scala---spark(实时计算框架)

  5. Java Core - 创建对象的两种方式

    一.通过new关键字创建对象 Hello hello = null;  //  声明一个引用 hello = new Hello();  //  创建对象 以上两行代码相当于 Hello hello ...

  6. Tomcat v7.0 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

    十二月 , :: 下午 org.apache.coyote.http11.AbstractHttp11Processor process 信息: Error parsing HTTP request ...

  7. Linux下设置MySql自动启动

    https://www.cnblogs.com/sunny3096/p/7954146.html

  8. pip ipython启动错误 Fatal error in launcher: Unable to create process using

    完整的错误提示: C:\Users\yyy>ipython3Fatal error in launcher: Unable to create process using '"c:\u ...

  9. 使用jmeter来发送json/gzip格式数据 --------笔记

    一.使用jmeter来发送gzip数据 有时候我们需要模拟在客户端将数据压缩后, 发送(post)到服务器端. 通常这种情况,会发生在移动终端上. 这样做的好处, 是可以节省流量.  当然, 服务器返 ...

  10. HTML中的几种空格

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(       ‌‍)在不同浏览器中宽度各异.     ...