• 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. python—索引与切片总结

    python中索引与切片的熟练掌握对于字符串的操作很有帮助,梳理如下: (1)索引 S = 'hello world' 1)正向索引 正向索引从0开始,向右依次递增. 2)反向索引 反向索引从-1开始 ...

  2. python 拾遗

    三引号 可以当做多行字符串使用.在类或者方法中用的时候,可以当做docstrings来使用.具体的规则为: 该文档字符串所约定的是一串多行字符串,其中第一行以某一大写字母开始,以句号结束.第二行为空行 ...

  3. netcore如何引用package?

    netcore项目引用dll包,分如下三种: 1.引用网络包 从nuget获取,然后引入,使用命令:dotnet add package 包名 然后:dotnet restore 2.引用同解决方案的 ...

  4. (二)Hyperledger Fabric 1.1安装部署-Fabric Samples

    Hyperledger Fabric Samples是官方推荐的First Network,对于熟悉fabric和测试基础环境很有好处. Fabric Samples源码下载:使用git下载源码,进入 ...

  5. virtualbox命令行启动虚拟机和关闭虚拟机

    C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm 虚拟机名字 --type headlessC:\Program Files\Orac ...

  6. IIS 无法加载 CSS,JS的问题

    IIS 能加载 aspx,但不能加载里面的 js,css ,感觉有点坑. 解决方案如下:http://www.pageadmin.net/article/20121001/479.html 原来是没有 ...

  7. host命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/xin_y/article/details/53924763 分析域名查询工具,测试域名系统工作是否正常 语法: host ...

  8. iOS静默推送(Silent Remote Notifications)

    此功能是iOS7新增加的功能,允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新. 普通推送:收到推送后(有文字有声音),点开通知,进入APP后,才执行-- ...

  9. Linux下oracle启动/关闭监听(bash:lsnrctl:command not found)

    打开终端 切换帐户 # su - Oracle 启动监听 $ lsnrctl start 关闭监听 $ lsnrctl stop 切换帐户一定要加 "-" 否则会出现:   bas ...

  10. OO最后一次总结

    测试与正确性论证 Dijkstra说过:“程序测试只能证明程序有错,不能证明程序正确.”所谓程序测试,实际上是测试者特意挑出一批检查数据,通过运行程序,检查每个输入数据所对应的运行结果是否符合预期要求 ...