首页 > 其他分享 >CODE FESTIVAL 2016 qual C

CODE FESTIVAL 2016 qual C

时间:2023-05-31 17:46:23浏览次数:42  
标签:cnt 2016 FESTIVAL jc int CODE ans include mod

你说的对,但是我觉得应该先把 qual C 写完再去学什么东西。

CF

codeforces.

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
int n;
char s[110];
int main(){
    scanf("%s",s+1);n=strlen(s+1);
    for(int i=1;i<=n;i++){
        if(s[i]=='C'){
            for(int j=i+1;j<=n;j++){
                if(s[j]=='F'){
                    puts("Yes");return 0;
                }
            }
            puts("No");
            return 0;
        }
    }
    puts("No");
    return 0;
}

K Cakes

对,但为啥要切红题。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
int n,m;
int main(){
    scanf("%d%d",&m,&n);
    int mx=0;
    for(int i=1;i<=n;i++){
        int x;scanf("%d",&x);
        mx=max(mx,x);
    }
    printf("%d\n",max(2*mx-m-1,0));
    return 0;
}

Two Alpinists

每个位置范围区间。对。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
const int mod=1000000007;
int n,a[100010],b[100010],l[100010],r[100010];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)scanf("%d",&b[i]);
    for(int i=1;i<=n;i++){
        if(a[i]==a[i-1])l[i]=1,r[i]=a[i];
        else l[i]=r[i]=a[i];
    }
    for(int i=n;i>=1;i--){
        if(b[i]==b[i+1])l[i]=max(l[i],1),r[i]=min(r[i],b[i]);
        else l[i]=max(l[i],b[i]),r[i]=min(r[i],b[i]);
    }
    int ans=1;
    for(int i=1;i<=n;i++){
        if(l[i]>r[i]){
            puts("0");return 0;
        }
        ans=1ll*ans*(r[i]-l[i]+1)%mod;
    }
    printf("%d\n",ans);
    return 0;
}

Friction

样例有 ccf 子序列。

首先瞪着题面瞪半天发现不同列之间可以独立开,然后就可以枚举相邻两列算。证明不会,感觉是对的就是对的。

那直接 \(dp_{i,j}\) 为一个挪了 \(i\) 一个挪了 \(j\) 的最小代价。代价可以前缀和统计一下。就完了。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
int n,m,ans,dp[310][310],val[310][310];
char s[310][310];
int solve(int x){
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            val[i][j]=0;dp[i][j]=0x3f3f3f3f;
        }
    }
    dp[0][0]=0;
    for(int i=0;i<=n;i++){
        for(int l=n-i,r=n;l>=1;l--,r--){
            if(s[l][x]==s[r][x+1])val[i][0]++;
        }
    }
    for(int i=1;i<=n;i++){
        for(int l=n,r=n-i;r>=1;l--,r--){
            if(s[l][x]==s[r][x+1])val[0][i]++;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            val[i][j]=val[i-1][j-1]-(s[n-i+1][x]==s[n-j+1][x+1]);
        }
    }
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            if(i)dp[i][j]=min(dp[i][j],dp[i-1][j]+val[i-1][j]);
            if(j)dp[i][j]=min(dp[i][j],dp[i][j-1]+val[i][j-1]);
        }
    }
    return dp[n][n];
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
    for(int i=1;i<m;i++)ans+=solve(i);
    printf("%d\n",ans);
    return 0;
}

Encyclopedia of Permutations

看到的时候感觉很典。实际上好像也很典?

看起来就很康托展开,那看看康托展开的式子:每个位置 \(i\) 的贡献是 \(i\) 开头的逆序对个数乘 \((n-i)!\) 最后 \(+1\)。那算个数。

四种情况:(设 \(cnt_i\) 为 \(<i\) 有几个数空着)

  1. \(i\to j\):需要 \(a_i>a_j\),贡献 \(cnt_n!\)。
  2. \(i\to 0\):每个 \(0\) 有贡献 \((cnt_n-1)!cnt_i\)。
  3. \(0\to j\):每个 \(j\) 贡献 \((cnt_n-1)!(cnt_n-cnt_j)\)。
  4. \(0\to 0\):每个 \(0\) 贡献 \(\frac{cnt_n!}2\)。

那只需要统计 \(cnt_n-cnt_i\) 的后缀和和 \(0\) 的后缀个数和,再树状数组算个逆序对。最后要加上 \(cnt_n!\)。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
const int mod=1000000007,inv2=(mod+1)>>1;
int n,ans,a[500010],cnt[500010],jc[500010];
struct BIT{
    int c[500010];
    #define lowbit(x) (x&-x)
    void update(int x,int val){
        while(x<=n)c[x]+=val,x+=lowbit(x);
    }
    int query(int x){
        int sum=0;
        while(x)sum+=c[x],x-=lowbit(x);
        return sum;
    }
}c;
int main(){
    scanf("%d",&n);jc[0]=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i])cnt[a[i]]--;
        jc[i]=1ll*jc[i-1]*i%mod;
    }
    for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1]+1;
    int num=0,pre=0,suf=0;
    for(int i=n;i>=1;i--){
        if(a[i]==0){
            ans=(ans+1ll*jc[n-i]*inv2%mod*jc[cnt[n]]%mod*num)%mod;
            num++;
            ans=(ans+1ll*jc[n-i]*jc[cnt[n]-1]%mod*suf)%mod;
        }
        else{
            ans=(ans+1ll*jc[n-i]*jc[cnt[n]-1]%mod*cnt[a[i]]%mod*num)%mod;
            suf=(suf+cnt[n]-cnt[a[i]])%mod;
            ans=(ans+1ll*jc[n-i]*jc[cnt[n]]%mod*c.query(a[i]))%mod;
            c.update(a[i],1);
        }
    }
    ans=(ans+jc[cnt[n]])%mod;
    printf("%d\n",ans);
    return 0;
}

标签:cnt,2016,FESTIVAL,jc,int,CODE,ans,include,mod
From: https://www.cnblogs.com/gtm1514/p/17446876.html

相关文章

  • Codeforces Beta Round #2--B题 (DP)
    题目:Theleastroundway 1000*1000的方阵,每个格子有一个非负整数,现在要从左上走到右下,每次只能向下或者向右走。目标是使得所有走的格子里的数的乘积里,末尾0的个数最少,要求输出最有解和走法。不用怎么想也知道基本是个dp了,可以发现其实只有2和5的因子是有用的,但是如果状态同时记......
  • 浅谈字符集GB18030, GBK, GB2312, Unicode的适应性范围
    目前在中文世界里,计算机系统发展非常快速,传统的Windows已经逐渐跟不上国产化,如国产安卓系统,华为欧拉鸿蒙等系列,国产Linux系统等。国产化普遍支持GB18030!注:GB18030标准符合性认证一度属于国家强制性标准,由中国电子技术标准化研究所(CESI)认证中心进行授权认证。那么这些字符集......
  • 细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4
    1.Unicode与ISO10646全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言字符编码值相同却代表不同的符号(例如:韩文编码EUC-KR中“한국어”的编码值正好是汉字编码GBK中的“茄惫绢”)。因此,同一份文档,拷贝至不同语言的机器,就可能成了乱码,于是人们就想:我们能不能定义一......
  • vue使用qrcodejs2生成二维码且底部带文字描述,支持下载(日常记录)
    使用qrcodejs2生成二维码的方法:/***二维码生成*@paramcontent生成二维码内容*@paramdesc二维码底部描述*@paramqrcodeDom挂在dom*@returns{*|HTMLDivElement}*/exportfunctiongeneratorQrcode(content,desc,qrcodeDom=null){constqrcodeCo......
  • [leetcode每日一题]5.31
    1130. 叶值的最小代价生成树提示中等324相关企业给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:每个节点都有 0 个或是 2 个子节点。数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。在所有这......
  • 二刷Leetcode-Days08
    栈与队列:/***20.有效的括号*@params*@return*/publicbooleanisValid(Strings){Deque<Character>deque=newLinkedList<>();for(inti=0;i<s.length();i++){charch=s.charAt......
  • Codeforces Round 875 (Div. 2)B-D
    原题链接:https://codeforces.com/contest/1831原文:https://www.cnblogs.com/edgrass/p/17440602.html(B)Arraymerging主体思想是找到ab数组的最长相同字串(c中操作可实现连续)1#include<bits/stdc++.h>2usingnamespacestd;3intmain(){4intt;5cin>>......
  • SpringBoot 设置HTTP Status Code
    1HTTPStatusCodeHTTP请求响应的内容有很多,包括Body、Cookies、Headers和Status。我们最常用的是Body、其次Headers、Cookies。而HTTPStatusCode关注得最少。1.1HTTPStatusCode分类分类描述1**信息,服务器收到请求,需要请求者继续执行操作2**成功,操作被成功接......
  • 图解LeetCode——146. LRU 缓存
    一、题目请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intva......
  • selenium-some code
     ======================================fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("http://selenium.dev")#driver.quit() fromseleniumimportwebdriveroption=webdriver.ChromeOptions()option.add_experimental......