洛谷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%的数据1\leq n,m\leq5001n,m500,满足1\leq x-r\leq x+r\leq n,1\leq y-r\leq y+r\leq 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("\n");
    }
    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%的数据,k\leq5,L\leq10k5,L10

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

对于100%的数据1\leq k,L\leq 10^{18},0\leq s\leq L,1\leq w\leq k,1\leq p\leq 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\n",((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\n",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%的数据,1\leq n\leq5,1\leq s\leq 21n5,1s2

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

对于100%的数据,1\leq n,s\leq 1000,1\leq A,B,C,t\leq n,1\leq k\leq 10,1\leq x\leq 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\n",l);
    else puts("-1");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/L-Memory/p/9751068.html