码迷,mamicode.com
首页 > 其他好文 > 详细

Hello 2020

时间:2020-02-17 12:41:14      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:time   str   ++   nod   代码   math   clu   asc   span   

Link

Solutions


A.New Year and Naming

题意:

思路:
输出 \(s[(y-1)\%n]+t[(y-1)\%m]\) 即可
代码:


[View Code]

#include<bits/stdc++.h>
 
using namespace std;
 
const int N=22;
 
int n,m;
string s[N],t[N];
int q;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>s[i];
    for(int i=0;i<m;i++) cin>>t[i];
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        int x;
        cin>>x;
        x--;
        cout<<s[x%n]<<t[x%m]<<endl;
    }
    return 0;
}

B. New Year and Ascent Sequence

题意:

思路:
定义一个长度为 \(l\) 的序列中 \(a\) 存在 \(a_i<a_j(1\le i\le j\le l)\)\(Ascent\,Sequence\)
对于序列 \(p\) 和序列 \(q\),若 \(p+q\)\(Ascent\,Sequence\) 则为有效组合
\(n\) 个序列中有多少种有效组合
\(p+q\) 为无效组合只有一种情况:\(p\)\(q\) 本身都不是 \(Ascent\,Sequence\)\(p_{min}>q_{max}\)
因此对于每个序列只要找出有多少本身不是 \(Ascent\,Sequence\) 的序列的最大值 \(\le\) 该序列最小值的个数
最后答案为 \(n^2-\) 无效组合数
代码:


[View Code]

#include<bits/stdc++.h>
 
using namespace std;
  
typedef long long ll;
 
typedef vector<int> vi;
 
const int N=1e5+5;
 
int n;
struct node
{
    int minn=INT_MAX;
    int maxn=-1;
}state[N];
int vis[N];
int cnt_max[N*10];
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l;
        cin>>l;
        for(int j=0;j<l;j++)
        {
            int t;
            cin>>t;
            if(vis[i]==0)
            {
                if(t>state[i].minn) vis[i]=1;
                state[i].maxn=max(state[i].maxn,t);
                state[i].minn=min(state[i].minn,t);
            }
        }
        if(vis[i]==0) cnt_max[state[i].maxn]++;
    }
    for(int i=1;i<=1000000;i++) cnt_max[i]+=cnt_max[i-1];
    ll ans=(ll)n*n;
    for(int i=0;i<n;i++) if(vis[i]==0) ans-=cnt_max[state[i].minn];
    cout<<ans<<endl;
    return 0;
}

C. New Year and Permutation

题意:

思路:
对于一个有 \(n\) 个不重复数的序列的排列中有多少个区间使 \(max\{ pl,pl+1,…,pr\}?min\{ pl,pl+1,…,pr\}=r?l\)
假设 \([l,r]\) 满足上述等式,设 \(len=r-l+1\),对于此区间,其所有排列均满足上述等式,即有 \(len!\) 种排列
将此区间看成一个数放入原序列,则原序列中有 \(n-len+1\) 个数,有 \((n-len+1)!\) 种排列
而对于区间长度 \(len\) 满足 \(max\{ pl,pl+1,…,pr\}?min\{ pl,pl+1,…,pr\}=r?l\) 的共有 \(n-len+1\) 种情况
所以对于区间长度 \(len\) 共有 \((n-len+1)\times{len!}\times{(n-len+1)!}\),\(O(n)\) 即可算出结果
代码:


[View Code]

#include<bits/stdc++.h>
 
using namespace std;
  
typedef long long ll;
 
const int N=250005;
 
int n,m;
ll fac[N];
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    fac[1]=1;
    for(int i=2;i<=n;i++) fac[i]=fac[i-1]*i%m;
    ll ans=0;
    for(int i=1;i<=n;i++) ans=(ans+fac[i]*fac[n-i+1]%m*(n-i+1)%m)%m;
    cout<<ans<<endl; 
    return 0;
}

Hello 2020

标签:time   str   ++   nod   代码   math   clu   asc   span   

原文地址:https://www.cnblogs.com/c4Lnn/p/12320897.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!