• A. Superhero Transformation
  • 题意:
  • 元音和元音,辅音和辅音字母之间可以互相转换,问两个字符串是否想同;
  • 题解:直接判断即可;
  •  #include<bits/stdc++.h>
    using namespace std;
    const int N=;
    char s[N];
    int n,m,vis1[N],vis2[N];
    int judge(char x){return x=='a'||x=='e'||x=='i'||x=='o'||x=='u';}
    int main(){
    // freopen("A.in","r",stdin);
    // freopen("A.out","w",stdout);
    scanf("%s",s+);
    n=strlen(s+);
    for(int i=;i<=n;++i)vis1[i]=judge(s[i]);
    scanf("%s",s+);
    m=strlen(s+);
    for(int i=;i<=m;++i)vis2[i]=judge(s[i]);
    int fg=;
    if(n!=m){
    puts("No");
    return ;
    }
    for(int i=;i<=n;++i){
    if(vis1[i]^vis2[i]){fg=;break;}
    }
    puts(fg?"No":"Yes");
    return ;
    }
  • B. Average Superhero Gang Power
  • 题意:
  • 长度为$n$的数组$a$,最多执行$m$次操作,每次1.将一个数+1;2.删除一个数。其中操作2对每个数最多做$k$次
  • 题解:
  • 枚举2做了多少次,贪心删除最小的值,尽量将剩下的次数全部用到1;
  •  #include<bits/stdc++.h>
    #define ll long long
    #define ld double
    #define Run(i,l,r) for(int i=l;i<=r;++i)
    using namespace std;
    const int N=;
    int n,m,k;
    ll sum[N],a[N];
    int main(){
    // freopen("B.in","r",stdin);
    // freopen("B.out","w",stdout);
    scanf("%d%d%d",&n,&k,&m);
    for(int i=;i<=n;++i)scanf("%d",&a[i]);
    sort(a+,a+n+);
    for(int i=;i<=n;++i)sum[i]=sum[i-]+a[i];
    ld ans=;
    for(int i=;i<=min(n-,m);++i){
    ans=max(ans , (ld) ( sum[n]-sum[i]+min(1ll*k*(n-i) , (ll)m-i) ) / (n-i) );
    }
    printf("%.20lf\n",ans);
    return ;
    }
  • C. Creative Snap
  • 题意:
  • [1,2^n]的区间,每次直接删除一个区间,如果区间没有数存在代价是$A$,否则代价是$l*B*n_{a}$,$l$为区间长度,$n_{a}$为数的个数
  • 题解:
  • 直接做$dp$,复杂度相当于所有点的查询线段并:$O(n logn)$
  •  #include<bits/stdc++.h>
    #define ll long long
    #define ls (k<<1)
    #define rs (k<<1|1)
    using namespace std;
    const int N=;
    int n,k,A,B,a[N];
    inline int find(int l,int r){
    return lower_bound(a+,a+k+,r+)-lower_bound(a+,a+k+,l);
    }
    ll dfs(int l,int r){
    int t=find(l,r);
    if(!t)return A;
    if(l==r)return !t?A:(ll)t*B;
    int mid=(l+r)>>;
    return min(1ll*t*B*(r-l+),dfs(l,mid)+dfs(mid+,r));
    }
    int main(){
    // #ifndef ONLINE_JUDGE
    // freopen("C.in","r",stdin);
    // freopen("C.out","w",stdout);
    // #endif
    scanf("%d%d%d%d",&n,&k,&A,&B);
    for(int i=;i<=k;++i)scanf("%d",&a[i]);
    sort(a+,a+k+);
    printf("%I64d\n",dfs(,<<n));
    return ;
    }
  • D. Destroy the Colony
  • 题意:
  • 给定一个由大小写字符组成的长度为偶数的字符串,好的串定义为想同字符都出现在想同的半边,询问给出两个位置$x,y$约定$x$和$y$的字符也必须在同一边问方案数;
  • 题解:
  • 统计每个字符的个数做背包,乘以一个可重元素的排列数就是答案,每次询问的话删除物品再加入即可;
  •  #include<bits/stdc++.h>
    #define ll long long
    #define mod 1000000007
    #define rg register
    #define il inline
    using namespace std;
    const int N=;
    char s[N];
    int n,q,vis[],fac[N],tot,v[N],f[N],g[N],ans[][],iv;
    char gc(){
    static char*p1,*p2,s[];
    if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    char c=gc();int x=;
    while(!isdigit(c))c=gc();
    while(isdigit(c))x=x*+c-'',c=gc();
    return x;
    }
    char gt(){
    char c=gc();
    while(!isalpha(c))c=gc();
    return c;
    }
    int inv(int x){
    int re=;
    for(int y=mod-;y;y>>=,x=(ll)x*x%mod){
    if(y&)re=(ll)re*x%mod;
    }
    return re;
    }
    int solve(int x,int y){
    if(!vis[x]||!vis[y])return ;
    for(rg int i=;i<=n>>;++i)g[i]=f[i];
    if(x!=y){
    int v1=vis[x];
    for(rg int i=;i+v1<=n>>;++i)f[i+v1]=(f[i+v1]-f[i]+mod)%mod;
    v1=vis[y];
    for(rg int i=;i+v1<=n>>;++i)f[i+v1]=(f[i+v1]-f[i]+mod)%mod;
    v1=vis[x]+vis[y];
    for(rg int i=(n>>)-v1;i>=;--i)f[i+v1]=(f[i+v1]+f[i])%mod;
    }
    int re = 1ll * iv * f[n>>] %mod;
    for(int i=;i<=n>>;++i)f[i]=g[i];
    return re;
    }
    int main(){
    // freopen("D.in","r",stdin);
    // freopen("D.out","w",stdout);
    scanf("%s",s+);n=strlen(s+);
    for(rg int i=;i<=n;++i)vis[s[i]]++;
    for(rg int i=fac[]=;i<=n;++i)fac[i]=(ll)fac[i-]*i%mod;
    iv = 1ll * fac[n>>] * fac[n>>] %mod;
    for(rg int i='A';i<='z';++i)if(vis[i])v[++tot]=vis[i],iv=1ll*iv*inv(fac[v[tot]])%mod;
    f[]=;
    for(rg int i=;i<=tot;++i)
    for(rg int j=(n>>)-v[i];j>=;--j){
    f[j+v[i]] = (f[j+v[i]]+f[j])%mod;
    }
    for(rg int x='A';x<='z';++x)
    for(rg int y=x;y<='z';++y)
    ans[x][y] = solve(x,y);
    scanf("%d",&q);
    for(rg int i=,x,y;i<=q;++i){
    scanf("%d%d",&x,&y);
    if(s[x]>s[y])swap(x,y);
    printf("%d\n",ans[s[x]][s[y]]);
    }
    /*
    {
    for(rg int i=0;i<=n>>1;++i)printf("%d\n",f[i]);
    }*/
    return ;
    }
  • E. Tree
  • 题意:
  • 给定一棵树,$q$次询问,每次$k$个询问点$a_{i}$,分成至多$m$组,同组之间以$r$为根不存在祖先关系,问方案数;$n \le 1e5 \ ,  \ \sum k \le 1e5$
  • 题解:
  • 按深度排序之后假设$h[i]$为i的祖先个数,f[i][j]表示前$i$个点分成$j$组的方案;
  • $$f[i][j] = f[i-1][j] * (j-h[i]) + f[i-1][j-1]  $$
  • 其实不一定要深度,只需要按照$h[]$排序即可;
  • $h$可以在$dfs$序上维护一下;
  •  #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=,mod=;
    int n,q,k,m,r,a[N],fa[N][],dep[N],hd[N],o=,bin[],h[N],f[N][],st[N],ed[N],c[N],vis[N],idx;
    struct Edge{int v,nt;}E[N<<];
    char gc(){
    static char*p1,*p2,s[];
    if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=;char c=gc();
    while(c<''||c>'')c=gc();
    while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
    return x;
    }
    void adde(int u,int v){
    E[o]=(Edge){v,hd[u]};hd[u]=o++;
    E[o]=(Edge){u,hd[v]};hd[v]=o++;
    }
    void dfs(int u,int F){
    st[u]=++idx;
    fa[u][]=F;
    dep[u]=dep[F]+;
    for(int i=;bin[i]<dep[u];++i)fa[u][i]=fa[fa[u][i-]][i-];
    for(int i=hd[u];i;i=E[i].nt){
    int v=E[i].v;
    if(v==F)continue;
    dfs(v,u);
    }
    ed[u]=idx;
    }
    int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    for(int i=;i<;++i)if(bin[i]&(dep[u]-dep[v]))u=fa[u][i];
    if(u==v)return u;
    for(int i=;~i;--i)if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i];
    return fa[u][];
    }
    void add(int x,int y){for(;x<=n;x+=x&-x)c[x]+=y;}
    int ask(int x){int re=;for(;x;x-=x&-x)re+=c[x];return re;}
    void update(int u,int x){
    vis[u]+=x;
    add(st[u],x);
    add(ed[u]+,-x);
    }
    int query(int u){
    int t=lca(u,r);
    return ask(st[u])+ask(st[r])-ask(st[t])*+vis[t];
    }
    int main(){
    #ifndef ONLINE_JUDGE
    freopen("E.in","r",stdin);
    freopen("E.out","w",stdout);
    #endif
    n=rd();q=rd();
    for(int i=bin[]=;i<=;++i)bin[i]=bin[i-]<<;
    for(int i=;i<n;++i)adde(rd(),rd());
    dfs(,);
    f[][]=;
    for(int i=;i<=q;++i){
    k=rd();m=rd();r=rd();
    for(int j=;j<=k;++j)a[j]=rd(),update(a[j],);
    for(int j=;j<=k;++j)h[j]=query(a[j])-;
    sort(h+,h+k+);
    for(int j=;j<=k;++j)
    for(int l=;l<=m;++l){
    f[j][l] = ((ll)f[j-][l]*max(,l-h[j])%mod+f[j-][l-])%mod;
    }
    int ans=;
    for(int l=;l<=m;++l)ans=(ans+f[k][l])%mod;
    printf("%d\n",ans);
    for(int j=;j<=k;++j)update(a[j],-);
    }
    return ;
    }

codeforces contest 1111的更多相关文章

  1. [codeforces contest 1119 F] Niyaz and Small Degrees 解题报告 (树形DP+堆)

    interlinkage: http://codeforces.com/contest/1119/problem/F description: 有一颗$n$个节点的树,每条边有一个边权 对于一个$x$ ...

  2. CodeForces contest/776 A+B+C题解

    ICM Technex 2017 and Codeforces Round #400 (Div. 1 +Div.2,combined) A. A Serial Killer 谜一样的题意:每天从两个人 ...

  3. codeforces/contest/803/problem C

    题目:C. Maximal GCD 题意:输入n,k.将n拆成k个数的序列,使得这k个数的gcd最大.(且序列严格递增).1 ≤ n, k ≤ 1010 . 分析:假设k个数的gcd为d,则一定有d| ...

  4. 【codeforces contest 1119 F】Niyaz and Small Degrees

    题目 描述 \(n\) 个点的树,每条边有一个边权: 对于一个 \(X\) ,求删去一些边后使得每个点的度数 \(d_i\) 均不超过 \(X\) 的最小代价: 你需要依次输出 \(X=0 \to n ...

  5. CodeForces Contest #1137: Round #545 (Div. 1)

    比赛传送门:CF #1137. 比赛记录:点我. 每次都自闭的 div1 啊,什么时候才能上 IM 呢. [A]Skyscrapers 题意简述: 有一个 \(n\times m\) 的矩阵 \(a_ ...

  6. Codeforces round 1111

    CF Div 2 537 比赛链接 感觉题目难度OK,五个题都能做,后俩题考察人的翻译水平... 另外,$Claris$太强了... A 直接按照题意模拟,不知道为啥有人会被× 代码: #includ ...

  7. CodeForces Contest #1114: Round #538 (Div. 2)

    比赛传送门:CF #1114. 比赛记录:点我. 又 FST 了. [A]Got Any Grapes? 题意简述: 有三个人,第一个人需要吃绿色葡萄至少 \(a\) 个,第二个人需要吃绿色和紫色葡萄 ...

  8. CodeForces Contest #1110: Global Round 1

    比赛传送门:CF #1110. 比赛记录:点我. 涨了挺多分,希望下次还能涨. [A]Parity 题意简述: 问 \(k\) 位 \(b\) 进制数 \(\overline{a_1a_2\cdots ...

  9. Codeforces Contest 870 前三题KEY

    A. Search for Pretty Integers: 题目传送门 题目大意:给定N和M个数,从前一个数列和后一个数列中各取一个数,求最小值,相同算一位数. 一道水题,读入A.B数组后枚举i.j ...

随机推荐

  1. 绝对干货!初学者也能看懂的DPDK解析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...

  2. Scrum Meeting 10 -2014.11.16

    开始进入大项目的整合阶段,平时和其他两个小组交流较少,整合难度还是存在的. 在具体整合前,让开发人员添加了些必要的注释,优化代码结构,方便阅读. Member Today’s task Next ta ...

  3. 奔跑吧DKY——团队Scrum冲刺阶段博客汇总

    第一周:团队展示 团队选题 需求规格说明书 第二周:完善需求规格说明书.制定团队编码规范.通过团队项目数据库设计 奔跑吧DKY--团队Scrum冲刺阶段-Day 1-领航 奔跑吧DKY--团队Scru ...

  4. PAT 1001 A+B Fotmat

    源码 1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calcula ...

  5. Leetcode题库——31.下一个排列

    @author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...

  6. ubuntu16.04+pycharm+默认文件头注释

    安装 1.sudo gedit /etc/hosts 2.最后一行添加 0.0.0.0 account.jetbrains.com 3.从 http://idea.lanyus.com/ 中获取激活码 ...

  7. Codeforces Round #196 (Div. 2) D. Book of Evil 树形dp

    题目链接: http://codeforces.com/problemset/problem/337/D D. Book of Evil time limit per test2 secondsmem ...

  8. 第三次作业---excel导入数据库及显示(2)

    发现第一次做的功能有点复杂,不能理解.而且第一次的想法是在页面上上传文件,连接并导入到数据库,并在页面上显示.后来才看到要求是直接在本地将数据导入数据库就行了,然后显示.所以才出现了一堆看不懂也解决不 ...

  9. angularJS1笔记-(8)-内置指令

    index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. Enterprise Library 2.0 参考源码索引

    http://www.projky.com/entlib/2.0/Microsoft/Practices/EnterpriseLibrary/Caching/BackgroundScheduler.c ...