zoukankan      html  css  js  c++  java
  • 11.9的一套题

    NOIP2016 模拟赛
    ——那些年,我们学过的文化课
    背单词
    (word.c/cpp/pas)
    【题目描述】
    fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单
    词。 看着满篇的单词非常头疼, 而每次按照相同的顺序背效果并不好,
    于是 fqk 想了一种背单词的好方法!他把单词抄写到一个 n 行 m 列的
    表格里,然后每天背一行或者背一列。他的复习计划一共有 k 天,在
    k 天后, fqk 想知道,这个表格中的每个单词,最后一次背是在哪一
    天呢?
    【输入格式】
    第一行三个整数 k m n , , 。
    接下来 k 行,每行的格式可能如下:
    1. r ,表示当前天 fqk 背了第 r 行的单词。
    . 2 c ,表示当前天 fqk 背了第 c 列的单词。
    【输出格式】
    输出包含 n 行, 每行 m 个整数, 表示每个格子中的单词最后一次背
    是在哪天,如果这个单词没有背过,则输出 0 。
    【输入样例】
    3 3 3
    1 2
    2 3
    1 3
    【输出样例】
    0 0 2
    1 1 2
    3 3 3
    【数据范围】
    对于 % 30 的数据, 1000 , ,  k m n 。
    对于 % 100 的数据, 100000 , 100000 , 5000 ,     k m n m n 。
    【时空限制】
    对于每个测试点,时间限制为 s 1 ,空间限制为 MB 512 。

    #include<iostream>
    #include<cstdio>
    #include<string>
    #define maxn 5010
    using namespace std;
    int n,m,w;
    int hang[maxn],lie[maxn];
    int init()
    {
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int main()
    {
        freopen("word.in","r",stdin);
        freopen("word.out","w",stdout);
        n=init();m=init();w=init();
        for(int i=1;i<=w;i++)
        {
            int x,y;
            y=init();x=init();
            if(y==1)hang[x]=i;
            if(y==2)lie[x]=i;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
              printf("%d ",max(hang[i],lie[j]));
            printf("
    ");
        }
        return 0;
    } 


    脱水缩合
    (merge.c/cpp/pas)
    【题目描述】
    fqk 退役后开始补习文化课啦, 于是他打开了生物必修一开始复习
    蛋白质,他回想起了氨基酸通过脱水缩合生成肽键,具体来说,一个
    氨基和一个羧基会脱去一个水变成一个肽键。于是他脑洞大开,给你
    出了这样一道题:
    fqk 将给你 6 种氨基酸和 m 个脱水缩合的规则,氨基酸用
    ' ' , ' ' , ' ' , ' ' , ' ' , ' ' f e d c b a 表示,每个规则将给出两个字符串 t s, ,其中
    1 | | , 2 | |   t s ,表示 s 代表的两个氨基酸可以通过脱水缩合变成 t 。然后
    请你构建一个长度为 n ,且仅由 ' ' , ' ' , ' ' , ' ' , ' ' , ' ' f e d c b a 构成的氨基酸序列,
    如果这个序列的前两个氨基酸可以进行任意一种脱水缩合, 那么就可
    以脱水缩合,脱水缩合后序列的长度将 1  ,这样如果可以进行 1  n 次
    脱水缩合,最终序列的长度将变为 1 ,我们可以认为这是一个蛋白质,
    如果最后的蛋白质为 ' 'a , 那么初始的序列就被称为一个好的氨基酸序
    列。 fqk 想让你求出有多少好的氨基酸序列。
    注:题目描述可能与生物学知识有部分偏差(即氨基酸进行脱水
    缩合后应该是肽链而不是新的氨基酸),请以题目描述为准。
    【输入格式】
    第一行两个整数 q n, 。
    接下来 q 行,每行两个字符串 t s, ,表示一个脱水缩合的规则。
    【输出格式】
    一行,一个整数表示有多少好的氨基酸序列。
    【输入样例】
    3 5
    ab a
    cc c
    ca a
    ee c
    ff d
    【输出样例】
    4
    【样例解释】
    一共有四种好的氨基酸序列,其脱水缩合过程如下:
    "abb" "ab" "a"
    "cab" "ab" "a"
    "cca" "ca" "a"
    "eea" "ca" "a"
    【数据范围】
    对于 % 100 的数据, 36 , 6 2    q n 。数据存在梯度。
    【时空限制】
    对于每个测试点,时间限制为 s 2 ,空间限制为 MB 512 。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    using namespace std;
    LL n,q,tot,ans;
    LL first[1010],next[1010],a[50];
    char s[50][5],r[50][5];
    bool f[12000010];
    void dfs(LL x,LL now)
    {
        if(x==n)
        {
            int sum=0;
            for(int i=1;i<=n-1;i++)
              sum=sum*6+a[i];
            sum=sum*6+now;
            if(!f[sum])f[sum]=1,ans++;
            return ;
        }
        for(LL i=first[now];i;i=next[i])
        {
            LL to=s[i][1]-'a';
            tot++;a[tot]=s[i][2]-'a';
            dfs(x+1,to);tot--;
        }
    }
    int main()
    {
        freopen("merge.in","r",stdin);
        freopen("merge.out","w",stdout);
        scanf("%d%d",&n,&q);
        for(LL i=1;i<=q;i++)
        {
            scanf("%s%s",s[i]+1,r[i]+1);
            LL now=r[i][1]-'a';
            next[i]=first[now];
            first[now]=i;
        }
        dfs(1,0);
        cout<<ans<<endl;
        return 0;
    }

    一次函数
    (fx.c/cpp/pas)
    【题目描述】
    fqk 退役后开始补习文化课啦, 于是他打开了数学必修一开始复习
    函数, 他回想起了一次函数都是 b kx x f   ) ( 的形式, 现在他给了你 n 个
    一次函数
    i i i
    b x k x f   ) ( , 然后将给你 m 个操作, 操作将以如下格式给出:
    M . 1 i k b ,把第 i 个函数改为 b kx x f i   ) ( 。
    Q . 2 l r x ,询问 ))) ( (... (
    1
    x f f f
    l r r 
    mod 1000000007 的值。
    【输入格式】
    第一行两个整数 n , m ,代表一次函数的数量和操作的数量。
    接下来 n 行,每行两个整数,表示i,k ,i,b 。
    接下来 m 行,每行的格式为 M i k b 或 Q l r x 。
    【输出格式】
    对于每个操作 Q ,输出一行表示答案。
    【输入样例】
    5 5
    4 2
    3 6
    5 7
    2 6
    7 5
    Q 1 5 1
    Q 3 3 2
    M 3 10 6
    Q 1 4 3
    Q 3 4 4

    【输出样例】
    1825
    17
    978
    98
    【数据范围】
    对于 % 30 的数据, 1000 ,  m n 。
    对于 % 100 的数据, 1000000007 , , , 200000 ,   x b k m n 。
    【时空限制】
    对于每个测试点,时间限制为 s 2 ,空间限制为 MB 512 。

     

    /*
    线段树 维护k,b
    对于合并两个两者的k,b
    设前为k1,b1 后为 k2,b2
    则合并k2*(k1*x+b1)+b2
    则转化为
    k2*k1*x+k2*b1+b2
    现在的k为k2*k1,b为k2*b1+b2
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    #define mod 1000000007
    #define maxn 200010
    #define lc t<<1
    #define rc (t<<1)+1
    using namespace std;
    int n,m;
    LL k[maxn*4],b[maxn*4];
    int init()
    {
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    void change(int t,int l,int r,int pos,int x,int y)
    {
        if(l==r)
        {
            k[t]=x%mod;
            b[t]=y%mod;
        }
        else
        {
            LL mid=(l+r)/2;
            if(pos<= mid )change(lc,l, mid ,pos,x,y);
            if(pos>=mid+1)change(rc,mid+1,r,pos,x,y);
            k[t]=k[lc]*k[rc]%mod;
            b[t]=(k[rc]*b[lc]%mod+b[rc])%mod;
        }
    }
    LL query_k(int t,int l,int r,int x,int y)
    {
        if(x<=l&&y>=r) return k[t];
        else
        {
            int mid=(l+r)/2;
            LL ret=1;
            if(x<= mid )ret=ret*query_k(lc,l, mid ,x,y)%mod;
            if(y>=mid+1)ret=ret*query_k(rc,mid+1,r,x,y)%mod;
            return ret;
        }
    }
    LL query_b(int t,int l,int r,int x,int y)
    {
        if(x<=l&&y>=r) return b[t];
        else
        {
            int mid=(l+r)/2;
            LL he=0,ha=0;
            if(x<= mid )ha=query_b(lc,l, mid ,x,y);
            if(y>=mid+1)
            {
                he=query_b(rc,mid+1,r,x,y);
                ha=ha*query_k(rc,mid+1,r,x,y)%mod;
            }
            return (ha+he)%mod;
        }
    }
    int main()
    {
        freopen("fx.in","r",stdin);
        freopen("fx.out","w",stdout);
        n=init();m=init();
        for(int i=1;i<=n;i++)
        {
            LL x,y;
            x=init();y=init();
            change(1,1,n,i,x,y);
        }
        for(int i=1;i<=m;i++)
        {
            int x,y,z;char s[10];
            scanf("%s",s);
            if(s[0]=='M')
            {
                z=init();x=init();y=init();
                change(1,1,n,z,x,y);
            }
            else
            {
                x=init();y=init();z=init();
                LL ha=query_k(1,1,n,x,y);
                LL he=query_b(1,1,n,x,y);
                LL ans=(ha*z%mod+he)%mod;
                cout<<ans<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Java.io.outputstream.PrintStream:打印流
    Codeforces 732F. Tourist Reform (Tarjan缩点)
    退役了
    POJ 3281 Dining (最大流)
    Light oj 1233
    Light oj 1125
    HDU 5521 Meeting (最短路)
    Light oj 1095
    Light oj 1044
    HDU 3549 Flow Problem (dinic模版 && isap模版)
  • 原文地址:https://www.cnblogs.com/dingmenghao/p/6048251.html
Copyright © 2011-2022 走看看