zoukankan      html  css  js  c++  java
  • 洛谷10月月赛(100+40+70+0)代码

    T48748 [1007]魔法少女小Scarlet

    题目描述

    Scarlet最近学会了一个数组魔法,她会在n*nnn二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90°,

    首先,Scarlet会把11到n^2n2的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。

    Scarlet既不会什么分块特技,也不会什么Splay套Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。

    输入输出格式

    输入格式:

    第一行两个整数n,mn,m,表示方阵大小和魔法施放次数。

    接下来mm行,每行44个整数x,y,r,zx,y,r,z,表示在这次魔法中,Scarlet会把以第xx行第yy列为中心的2r+12r+1阶矩阵按照某种时针方向旋转,其中z=0z=0表示顺时针,z=1z=1表示逆时针。

    输出格式:

    输出nn行,每行nn个用空格隔开的数,表示最终所得的矩阵

    输入输出样例

    输入样例#1: 复制
    5 4
    2 2 1 0
    3 3 1 1
    4 4 1 0
    3 3 2 1
    输出样例#1: 复制
    5 10 3 18 15
    4 19 8 17 20
    1 14 23 24 25
    6 9 2 7 22
    11 12 13 16 21

    说明

    对于50%的数据,满足r=1r=1

    对于100%的数据1leq n,mleq5001n,m500,满足1leq x-rleq x+rleq n,1leq y-rleq y+rleq n1xrx+rn,1yry+rn

    /*
    可以想象为对每个中心都建立一个坐标系
    然后旋转,横纵坐标分情况交换取反 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define N 507
    
    using namespace std;
    int a[N][N], b[N][N];
    int n,m;
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    void solve1(int x, int y, int r, int opt)
    {
        memcpy(b, a, sizeof(b));
        for(int i=x-r;i<=x+r;i++)
        {
            for(int j=y-r;j<=y+r;j++)
            {
                int dx=j-y,dy=x-i;swap(dx,dy);
                dy=-dy;b[x-dy][y+dx]=a[i][j];
            }
        }
        memcpy(a, b, sizeof(b));
    }
    void solve2(int x, int y, int r, int opt)
    {
        memcpy(b, a, sizeof(b));
        for(int i=x-r;i<=x+r;i++)
        {
            for(int j=y-r;j<=y+r;j++)
            {
                int dx=j-y,dy=x-i;swap(dx,dy);
                dx=-dx;b[x-dy][y+dx]=a[i][j];
            }
        }
        memcpy(a, b, sizeof(b));
    }
    int main()
    {
        n=read();m=read();
        int tot = 0;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j] = ++tot;
        for(int i=1;i<=m;i++)
        {
            int x = read(), y=read(),r=read(),opt=read();
            if(opt == 0) solve1(x, y, r, opt);
            else solve2(x, y, r, opt);        
        }
        for(int i=1;i<=n;i++)  for(int j=1;j<=n;j++)
        {
            printf("%d ",a[i][j]);
            if(j==n) printf("
    ");
        }
        return 0;
    }

    T48749 [1007]Scarlet的字符串不可能这么可爱

    题目描述

    Scarlet妄图构造字符集为kk,长度为LL的字符串,满足没有任何一个长度超过11的回文连续子串。

    看起来这样的字符串太多了,Scarlet随手加了个限制:她指定了字符串的第ss位为ww。

    这下Scarlet不会做了,请你来帮她计算究竟有多少满足条件的字符串。按照套路,你只要求出答案对pp取模后的结果。

    输入输出格式

    输入格式:

    第一行三个整数k,Lk,L和pp,分别表示构造的字符串的的字符集、长度和模数。

    第二行两个整数s,ws,w,描述Scarlet给的限制。

    注意:s=0s=0表示该数据点中Scarlet十分良心地没有添加限制

    输出格式:

    一行一个整数,表示答案对pp的取模后的结果。

    输入输出样例

    输入样例#1: 复制
    3 3 233
    1 1
    输出样例#1: 复制
    2

    说明

    字符集:一个字符串中不同字符的数量。例如,字符集是3的话,你可以认为字符串仅由“A”、“B”、“C”三个字母组成。

    样例解释:第一个字符固定A,那么符合要求的字符串是ABC,ACB。而AAB字符串包括AA这个回文子串,ACA本身就是回文串,一次类推。

    对于50%的数据,kleq5,Lleq10k5,L10

    对于另30%的数据,s=0s=0

    对于100%的数据1leq k,Lleq 10^{18},0leq sleq L,1leq wleq k,1leq pleq 10^91k,L1018,0sL,1wk,1p109

    /*
    40分 
    dfs map判重 
    开O2都跑不过第五个点 ...
    */ 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    
    #define N 107
    #define ll long long
    
    using namespace std;
    int n,ans,k,l,p,s,w;
    int vis[N],str[N];
    map<ll,bool>v;
    
    bool judge()
    {
        for(int i=1;i<l;i++) 
        if(str[i]==str[i+1]) return false;
        for(int i=2;i<l;i++)
        {
            int tmp=1;
            if(str[i-tmp]==str[i+tmp]) return false;
        }
        return true;
    }
    
    void dfs(int now,int c)
    {
        if(now==l) 
        {
            ll res=0;
            for(int i=1;i<=l;i++)
            {
                res+=str[i];res*=10;
            }res/=10;
            if(!v[res] && judge()) 
            {
                v[res]=1,ans++;
            }
            return;
        }
        for(int j=1;j<=k;j++) 
        {
            if(!vis[now+1])str[now+1]=j;
            dfs(now+1,j);    
        }
    }
    
    int A(int k)
    {
        ll tmp=1;
        for(int i=1;i<=k;i++)
          tmp=((tmp%p)*i)%p;
        return tmp%p;
    }
    
    int main()
    {
        cin>>k>>l>>p>>s>>w;
        if(l<=k && s!=0) 
        {
            k--;l--;
            printf("%d
    ",((A(k)%p)*(l-k+1))%p);
            return 0;
        }
        else
        {
            for(int i=1;i<=k;i++) 
            {
                memset(vis,0,sizeof v);memset(str,0,sizeof str);
                vis[s]=1;str[s]=w;
                if(s!=1)str[1]=i;vis[1]=1;dfs(1,i);
            }
            ans%=p;
            cout<<ans<<endl;
        }
        return 0;
    }
    /*
    貌似计算时每一个位置都只跟它上一个和上上个有关
    */
    #include <bits/stdc++.h>
    #define maxn 2000
    using namespace std;
    typedef long long LL;
    #define G c=getchar()
    inline LL read()
    {
        LL x=0,f=1;char G;
        while(c>57||c<48){if(c=='-')f=-1;G;}
        while(c>47&&c<58)x=x*10+c-48,G;
        return x*f;
    }
    LL Pow(LL a,LL b,LL p)
    {
        LL r=1;
        for(;b;b>>=1,a=a*a%p)
            if(b&1)r=r*a%p;
        return r;
    }
    LL k,L,p,s,w;
    LL work()
    {
        if(s==0)
            if(L==1)
                return k;
            else if(L==2)
                return k*(k-1)%p;
            else
                return k*(k-1)%p*Pow(k-2,L-2,p)%p;
        else
            if(L==1)
                return 1;
            else if(L==2)
                return k-1;
            else
                return (k-1)*Pow(k-2,L-2,p)%p;
    }
    int main()
    {
        k=read(),L=read(),p=read(),s=read(),w=read();
        k%=p;
        printf("%lld
    ",work());
        return 0;
    }
    std

    T48750 [1007]倍杀测量者

    题目描述

    今天Scarlet在机房有幸目睹了一场别开生面的OI训练。因为一些奇妙的SPJ,比赛中所有选手的得分都是正实数(甚至没有上限)。

    当一位选手A的分数不小于选手B的分数kk(k>0k>0)倍时,我们称选手A“kk倍杀”了选手B,选手B被选手A“kk倍杀”了

    更奇妙也更激动人心的是,训练前有不少选手立下了诸如“我没kk倍杀选手X,我就女装”,“选手Y把我kk倍杀,我就女装”的Flag。

    知道真相的良心教练Patchouli为了维持机房秩序,放宽了选手们的Flag限制。Patchouli设定了一个正常数TT,立下“我没kk倍杀选手X就女装”的选手只要成功k-TkT倍杀了选手X,就不需要女装。同样的,立下“选手Y把我kk倍杀我就女装”的选手只要没有成功被选手Yk+Tk+T倍杀,也不需要女装。

    提前知道了某些选手分数和具体Flag的Scarlet实在不忍心看到这么一次精彩比赛却没人女装,为了方便和Patchouli交易,Scarlet想要确定最大的实数TT使得赛后一定有选手收Flag女装。

    输入输出格式

    输入格式:

    第一行三个整数n,s,tn,s,t,分别表示机房内选手人数,选手立下的Flag总数和Scarlet已知的选手分数的数量。nn位选手从11开始编号至nn,编号为kk的选手被称为选手kk。

    接下来ss行,每行四个整数o,A,B,ko,A,B,k。其中o=1o=1表示选手A立下了“我没kk倍杀选手B就女装”的Flag,o=2o=2表示选手A立下了“选手B把我kk倍杀我就女装”的Flag。

    接下来tt行,每行两个整数C,xC,x,表示Scarlet已知选手C的分数为xx

    输出格式:

    若存在能保证赛后有选手女装的最大的T,则输出T,只有当输出与答案的绝对误差不超过10^{-4}104时才被视作正确输出。

    若不存在,输出"-1"(去掉引号)

    输入输出样例

    输入样例#1: 复制
    3 5 1
    1 2 1 2
    1 3 2 2
    1 3 1 4
    2 1 2 2
    2 1 3 4
    1 1
    输出样例#1: 复制
    -1
    输入样例#2: 复制
    3 2 3
    1 2 1 10
    2 2 3 6
    1 1
    2 6
    3 9
    输出样例#2: 复制
    3.9999993984

    说明

    对于30%的数据,1leq nleq5,1leq sleq 21n5,1s2

    对于另40%的数据,保证t=nt=n

    对于100%的数据,1leq n,sleq 1000,1leq A,B,C,tleq n,1leq kleq 10,1leq xleq 10^91n,s1000,1A,B,C,tn,1k10,1x109。保证输入中的CC两两不同。

    /*
    70分 
    询问离线
    二分答案
    不清楚为什么挂掉30 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define N 1007
    #define ll long long
    
    using namespace std;
    ll n,s,t,x,y,ans,cnt,flag;
    ll point[N];
    struct ask{
        int o,A,B,k;
    }a[N];
    
    bool judge(double T)
    {
        for(int i=1;i<=n;i++)
        {
            if(!point[a[i].A] || !point[a[i].B]) continue;
            if(a[i].o==1)
            {
                if(a[i].k-T<0) continue;
                if(point[a[i].A]<point[a[i].B]*(a[i].k-T)){flag=1;return true;}
            }
            else
            {
                if(point[a[i].A]*(a[i].k+T)<point[a[i].B]){flag=1;return true;}
            }
        }return false;
    }
    
    int main()
    {
        cin>>n>>s>>t;
        for(int i=1;i<=s;i++)
        cin>>a[i].o>>a[i].A>>a[i].B>>a[i].k;
        for(int i=1;i<=t;i++)
        {
            cin>>x>>y;
            point[x]=y;
        }
        double l=0,r=10000000000,eps=0.00000000001;
        while(r-l>=eps)
        {
            double mid=(l+r)/2;
            if(judge(mid)) l=mid;
            else r=mid;
        }
        if(flag) printf("%.11lf
    ",l);
        else puts("-1");
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    Java基础加强-内部类及代理
    金额货币转换函数
    SAP ABAP exporting list to memory ...SUBMIT 程序传输屏幕参数
    得到时间戳的函数
    alv行可编辑时带出描述
    ALV编辑行内容有改变时候操作
    ALV判断修改后是否有不合法数据,有则选中错误行,高亮度显示。
    数据字典的QUAN DEC类型与ABAP P型转换
    屏幕编程 F4的帮组用法
    read table 时关键字TRANSPORTING NO FIELDS的用法
  • 原文地址:https://www.cnblogs.com/L-Memory/p/9751068.html
Copyright © 2011-2022 走看看