【2017 Multi-University Training Contest - Team 1】小结
啊人生第一次打多校被虐
紧随yql的脚步做题。
1001:
可以发现我们平时表示的数都是$x*log_{10}{10}$,所以类似于做一个换底公式就可以了。
-1是一个烟雾弹,因为小学生都知道2^n不可能是整十的数。
#include<bits/stdc++.h>
#define N 100005
using namespace std;
double x,y;
int m;
int main(){
int cnt=;
while(scanf("%d",&m)==){
x=(double)m;
x*=log10();
printf("Case #%d: %d\n",++cnt,(int)x);
}
}
1002:
这题先把字符串拆成26进制,然后贪心做就可以了。
#include<bits/stdc++.h>
const int N=1e6+;
const int M=1e5+;
const int yql=1e9+;
using namespace std;
int f[][N],p[N],vis[],n;
char s[N],ss[N];
inline bool cmp(int a,int b){
for(int i=M;i>=;i--)if(f[a][i]!=f[b][i])return f[a][i]>f[b][i];
return a<b;
}
int main(){
int cas=;
while(scanf("%d",&n)==){
memset(f,,sizeof(f));memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){
scanf("%s",ss);int len=strlen(ss);
for(int j=;j<len;j++)f[ss[j]-'a'][len-j-]++;
if(len>)vis[ss[]-'a']=;
}
for(int i=;i<;i++){
for(int j=;j<M;j++){
f[i][j+]+=f[i][j]/;
f[i][j]%=;
}
p[i]=i;
}
sort(p,p+,cmp);int r=;
while(!vis[p[r]])r--;
int tmp=p[r];
for(int i=r;i<;i++)p[i]+=p[i+];
int ans=;p[]=tmp;int sum=;
for(int i=;i<;i++){
int val=-i,sum=;
for(int j=M-;j>=;j--){
sum=(1LL*sum*+f[p[i]][j])%yql;
f[p[i]][j]=;
}
ans+=1LL*val*sum%yql;
if(ans>=yql)ans-=yql;
}
printf("Case #%d: %d\n",++cas,ans);
}
}
1003:
有点像雅礼集训的某道题,洛谷以前某模拟赛原题。
如果是洛谷做法是点分治带log,肯定要被卡常
然后有神奇的On做法一遍dfs统计答案
可以看成是矩形面积并,这就类似与那道雅礼题了,就可以树状数组维护一维就可以了。
也是一个log,但是常数优越。
#include<bits/stdc++.h>
const int N=;
using namespace std;
typedef long long ll;
struct Edge{int u,v,next;}G[N<<];
int tot=,head[N],a[N],d[N],lpos[N],rpos[N],cnt=,q[N],fa[N],n;
int c[N*];
ll w[N],ans;
inline int lowbit(int x){return x&(-x);}
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
bool cmp(int x,int y){
if(a[x]==a[y])return d[x]>d[y];
return a[x]<a[y];
}
inline void add(int x,int val){
if(!x)return;
for(int i=lpos[x];i<=n;i+=lowbit(i))c[i]+=val;
}
inline int ask(int x){
int ans=;
for(int i=x;i;i-=lowbit(i))ans+=c[i];
return ans;
}
void dfs(int u,int f){
lpos[u]=++cnt;
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==f)continue;
fa[v]=u;d[v]=d[u]+;
dfs(v,u);
}
rpos[u]=cnt;
}
inline int size(int x){return ask(rpos[x])-ask(lpos[x]-);}
inline void solve(int l,int r,int val){
ans+=w[n];
for(int i=l;i<=r;i++){
int u=q[i];
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==fa[u]||a[v]==val)continue;
ans-=w[size(v)];
}
add(fa[u],-size(u));
}
if(a[]!=val)ans-=w[size()];
for(int i=r;i>=l;i--){
int u=q[i];
add(fa[u],size(u));
}
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
int cas=;
for(int i=;i<N;i++)w[i]=1LL*i*i;
while(scanf("%d",&n)==){
for(int i=;i<=n;i++)a[i]=read();
ans=;cnt=;tot=;memset(head,,sizeof(head));
for(int i=;i<n;i++){
int u=read(),v=read();
addedge(u,v);
}
for(int i=;i<=n;i++)q[i]=i,c[i]=;
dfs(,);
sort(q+,q+n+,cmp);
for(int i=;i<=n;i++)add(i,);
int j=;
for(int i=;i<=n;i=j){
for(j=i;j<=n&&a[q[i]]==a[q[j]];j++);solve(i,j-,a[q[i]]);
}
ans-=n;ans>>=;
printf("Case #%d: %I64d\n",++cas,ans);
}
}
1006:
找循环节,先确定一个出现次数以及因数
然后在另一个里面找
具体可以参考题解公式。
#include<bits/stdc++.h>
const int N=;
const int yql=1e9+;
using namespace std;
int n,m,cnt,cas,a[N],b[N],c[N],vis[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
inline void dfsa(int u){
if(vis[u])return;vis[u]=;++cnt;
if(!vis[a[u]])dfsa(a[u]);
}
inline void dfsb(int u){
if(vis[u])return;vis[u]=;++cnt;
if(!vis[b[u]])dfsb(b[u]);
} int main(){
while(scanf("%d%d",&n,&m)==){
memset(vis,,sizeof(vis));memset(c,,sizeof(c));
for(int i=;i<n;i++)a[i]=read();for(int i=;i<m;i++)b[i]=read();
for(int i=;i<m;i++)if(!vis[i]){
cnt=;dfsb(i);c[cnt]++;
}
for(int i=;i<=m;i++)c[i]=1LL*i*c[i]%yql;
int lim=max(n,m);
for(int i=lim;i;i--)for(int j=i+i;j<=lim;j+=i)c[j]=(c[j]+c[i])%yql;
for(int i=;i<=n;i++)vis[i]=;int ans=;
for(int i=;i<n;i++)if(!vis[i]){
cnt=;dfsa(i);ans=1LL*ans*c[cnt]%yql;
}
printf("Case #%d: %d\n",++cas,ans);
}
}
1011:
找规律。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll m;int cnt,n;
int main(){
while(scanf("%d%lld",&n,&m)==){
printf("Case #%d: ",++cnt);
if(m<=n){printf("%lld\n",m);continue;}
m-=n;m=(m-)%(n*-)+;
if(m<=n-){printf("%lld\n",m);continue;}
m-=n-;
if(m<=n-){printf("%lld\n",m);continue;}
else printf("%d\n",n);
}
}
以上是考场完成的……
剩下的能补几题是几题吧。
【2017 Multi-University Training Contest - Team 1】小结的更多相关文章
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1001&&HDU 6033 Add More Zero【签到题,数学,水】
Add More Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- BZOJ4765 普通计算姬(分块+树状数组)
对节点按编号分块.设f[i][j]为修改j号点对第i块的影响,计算f[i][]时dfs一遍即可.记录每一整块的sum.修改时对每一块直接更新sum,同时用dfs序上的树状数组维护子树和.查询时累加整块 ...
- NOIP1998 提高组
[NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12 121 应该组成12121而非121 ...
- P1278 单词游戏
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...
- Python高级数据类型模块collections
collections模块提供更加高级的容器数据类型,替代Python的内置dict,list, set,和tuple Counter对象 提供计数器,支持方便和快速的计数.返回的是一个以元素为键, ...
- 【题解】CF#855 G-Harry Vs Voldemort
个人感觉挺有意思的,然而被颜神D无聊惹(- ̄▽ ̄)- 这题我们可以首先试图去统计以每一个点作为 w 点所能对答案造成的贡献是多少.不难发现,当且仅当 u 和 v 都在 w 所在边双的一侧的时候不能构成 ...
- [WC2005]友好的生物
description 洛谷 求 \[max_{1\le i<j\le n}\{\sum_{s=1}^{k-1}(C_s-|D_{is}-D_{js}|)-(C_k-|D_{ik}-D_{jk} ...
- [洛谷P4822][BJWC2012]冻结
题目大意:有一张$n(n\leqslant50)$个点$m(m\leqslant1000)$条边的无向图,可以使得$k$条边使得边权减半,求最短路 题解:分层图最短路 卡点:无 C++ Code: # ...
- POI 10.28
[POI2015]KUR 不考虑构造原串再匹配 考虑开始位置满足什么条件才能匹配. 显然,开始位置确定,后面的字符都确定了. 而且,a,n互质,所以必然能遍历n的剩余系,从不同位置开始,初始的a*s+ ...
- [LOJ10186]任务安排
link 试题分析 一道斜率优化的dp 易得方程$f[j]=(S+t[i])\times c[j]+f[i]-t[i]\times c[i]+s\times c[n]$,为什么要写成这要,因为这样其实 ...
- purfer序列题表
purfer序列是对于带编号(互不相同)的无根树进行编码得到的,对于同样的n个顶点,其有n-2项,有n^(n-2)种,而且每种都合法(如果只要求他是一棵树的话)(可以通过证明翻译过程维持了各部分的树的 ...