XJOI CSP-S2 2019开放模拟训练题1 赛后总结

比赛链接

友好数对

暴力枚举\([L,R]\)之间的所有数,将每个数进行"旋转",看是否符合题意.

注意"旋转"的次数,并不一定是数字位数.只要旋转回到了初始数就应该跳出,否则会重复计算.

#include<bits/stdc++.h>
int T,L,R;

int F(int x)
{
    int Len=0;
    while(x){x/=10;Len++;}
    return Len;
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&L,&R);
        int Len=F(L),p=1,Ans=0;
        for(int i=1;i<Len;i++)p*=10;
        for(register int A=L;A<=R;A++)
        {
            int B=A;
            while(1)
            {
                B=B/10+p*(B%10);
                if(A<B&&B<=R)++Ans;
                if(A==B)break;
            }
        }
        printf("%d\n",Ans);
    }
    return 0;
} 

路径数

因为Euphemia对于美的追求,"她走过的路径是关于左下 - 右上对角线对称的",我们可以把把右下方一半的图对称到左上方,然后对于每个格子,向它可达的格子连边,再把左上 - 右下对角线上的格子向超级汇点连边,跑一边Dijkstra同时计算最短路条数即可.

但是开始的时候,我把对称那里写成了中心对称,导致爆0.??

菜是原罪

#include<bits/stdc++.h>
const int SIZE=105,N_MAX=10005,M_MAX=80005,Mod=1000000009;
int n,G[SIZE][SIZE],P[SIZE][SIZE],R[N_MAX];
int head[N_MAX],nex[M_MAX],to[M_MAX],Tot;
void Link(int u,int v){nex[++Tot]=head[u];head[u]=Tot;to[Tot]=v;}
int OFFX[]={0,-1,0,0,1},OFFY[]={0,0,-1,1,0};
bool E(int X,int Y){return (X<1||Y<1||X>n||Y>n||X+Y>n+1)? 0 : 1;}

struct node
{
    int pos,D;
    bool operator <(const node &x)const
    {
        return D>x.D;
    }
};
std::priority_queue<node>q;
bool mk[N_MAX];
int D[N_MAX],F[N_MAX];
void Dijkstra()
{
    memset(D,0x3F,sizeof(D));
    memset(F,0,sizeof(F));
    memset(mk,0,sizeof(mk));
    D[1]=R[1];
    F[1]=1;
    q.push((node){1,D[1]});
    while(q.size())
    {
        int u=q.top().pos;
        q.pop();
        if(mk[u])continue;
        mk[u]=1;
        for(int i=head[u];i;i=nex[i])
        {
            int v=to[i];
            if(D[v]>D[u]+R[v])
            {
                D[v]=D[u]+R[v];
                F[v]=F[u];
                q.push((node){v,D[v]});
            }
            else if(D[v]==D[u]+R[v])
                F[v]=(F[v]+F[u])%Mod;
        }
    }
}

int main()
{
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        int Tim=0;
        memset(P,0,sizeof(P));
        for(int i=1;i<=n;i++)
            for(int k=1;k<=n;k++)
            {
                scanf("%d",&G[i][k]);
                P[i][k]=++Tim;
            }
        ++Tim;
        memset(R,0,sizeof(R));
        for(int i=1;i<=n;i++)
            for(int k=1;k+i<=n+1;k++)
            {
                if(k+i==n+1)R[P[i][k]]=G[i][k];
                else R[P[i][k]]=G[i][k]+G[n-k+1][n-i+1];
            }
        memset(head,0,sizeof(head));
        Tot=0;
        for(int i=1;i<=n;i++)
            for(int k=1;k+i<=n+1;k++)
            {
                for(int p=1;p<=4;p++)
                {
                    int Xs=i+OFFX[p];
                    int Ys=k+OFFY[p];
                    if(E(Xs,Ys))
                        Link(P[i][k],P[Xs][Ys]);
                }
                if(k+i==n+1)
                    Link(P[i][k],Tim);
            }
        Dijkstra();
        printf("%d\n",F[Tim]);
    }
    return 0;
}

选信封

打了个DFS套DFS,获得了30分的好成绩.

然后写了个模拟退火,就过了?甚至都没有srand.

此时我的表情是:

模拟退火代码(LCT维护连通性):

#include<bits/stdc++.h>
const int SIZE=1500;
#define Random(x) (rand()%x+1)

int n,A[SIZE][5],B[SIZE][5],Tem[SIZE],Ans,now,Tot;

struct LCT
{
    int F[SIZE],C[SIZE][2];
    bool Tag[SIZE];
    #define LC(x) C[x][0]
    #define RC(x) C[x][1]
    bool NRoot(int x){return LC(F[x])==x||RC(F[x])==x;}
    void Rev(int x){std::swap(LC(x),RC(x));Tag[x]^=1;}
    void push_down(int x){if(Tag[x]){if(LC(x))Rev(LC(x));if(RC(x))Rev(RC(x));Tag[x]=0;}}
    void Rotate(int x)
    {
        int u=F[x],v=F[u],k=(RC(u)==x),w=C[x][k^1];
        if(NRoot(u))C[v][RC(v)==u]=x;C[x][k^1]=u;C[u][k]=w;
        if(w)F[w]=u;F[u]=x;F[x]=v;
    }
    void push(int x){if(NRoot(x))push(F[x]);push_down(x);}
    void Splay(int x)
    {
        for(push(x);NRoot(x);Rotate(x))
            if(NRoot(F[x]))Rotate((LC(F[x])==x)^(LC(F[F[x]])==F[x])?x:F[x]);
    }
    void Access(int u){for(int v=0;u;u=F[v=u])Splay(u),RC(u)=v;}
    void MakeRoot(int x){Access(x);Splay(x);Rev(x);}
    int Find(int x){Access(x);Splay(x);while(LC(x)){push_down(x);x=LC(x);}Splay(x);return x;}
    void Split(int u,int v){MakeRoot(u);Access(v);Splay(v);}
    void Link(int u,int v){MakeRoot(u);if(Find(v)!=u)F[u]=v;}
    void Cut(int u,int v){MakeRoot(u);if(Find(v)==u&&F[v]==u&&!LC(v))F[v]=RC(u)=0;}
}T;

void SA()
{
    for(double Temperature=1000;Temperature>1e-14;Temperature*=0.99)
    {
        int p=Random(n),o=Random(2);
        if(T.Find(A[p][o])!=T.Find(B[p][o]))
        {
            ++now;
            Ans=std::max(Ans,now);
            T.Link(A[p][o],B[p][o]);
        }
        else if(exp(((double)Ans-now)/Temperature)<(double)Random(RAND_MAX)/RAND_MAX)
        {
            T.Cut(A[p][o],B[p][o]);
        }
    }
}

int main()
{
    srand(time(0));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&A[i][1],&B[i][1],&A[i][2],&B[i][2]);
        Tem[++Tot]=A[i][1];
        Tem[++Tot]=B[i][1];
        Tem[++Tot]=A[i][2];
        Tem[++Tot]=B[i][2];
    }
    std::sort(Tem+1,Tem+1+Tot);
    for(int i=1;i<=n;i++)
    {
        A[i][1]=std::lower_bound(Tem+1,Tem+1+Tot,A[i][1])-Tem;
        B[i][1]=std::lower_bound(Tem+1,Tem+1+Tot,B[i][1])-Tem;
        A[i][2]=std::lower_bound(Tem+1,Tem+1+Tot,A[i][2])-Tem;
        B[i][2]=std::lower_bound(Tem+1,Tem+1+Tot,B[i][2])-Tem;
    }
    SA();
    printf("%d",Ans);
    return 0;
} 

原文地址:https://www.cnblogs.com/TaylorSwift13/p/11794868.html

时间: 2024-08-30 08:56:16

XJOI CSP-S2 2019开放模拟训练题1 赛后总结的相关文章

csp退役前的做题计划1(真)

csp退役前的做题计划1(真) 因为我太菜了,所以在第一次月考就会退役,还是记录一下每天做了什么题目吧. 任务计划 [ ] Z算法(Z Algorithm) 9.28 [x] ARC061C たくさんの数式 / Many Formulas [x] ARC061D すぬけ君の塗り絵 / Snuke's Coloring [x] ARC061E すぬけ君の地下鉄旅行 / Snuke's Subway Trip [x] ARC061F 3人でカードゲーム / Card Game for Three [

携程2019校招编程题(3)

携程今年的机试题为20道选择+3编程 由于今天最后提交时第三题编程未通过,交卷之后想出来的解法这里记录一下. import java.util.ArrayList; import java.util.List; import java.util.Scanner; //携程3 public class LRU { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int size=Intege

@CSP模拟2019.10.16 - [email&#160;protected] 垃圾分类

目录 @[email protected] @[email protected] @accepted [email protected] @[email protected] @[email protected] 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个树形结构,由 n 个垃圾桶和 n-1 条双向传送带组成. 垃圾处理器的编号为 1, 2, ..., n,每条传送带都可以花 1 秒钟将垃圾从一个垃圾桶输送到另一个垃圾桶. 垃圾投放点是编号为 r 的垃圾桶,垃圾总是投放在这

2019秦皇岛补题

F题 链接:https://codeforces.com/gym/102361/problem/F 思路 如果环的边长为k,那么环的删边方案数是2k-1.如果链的边长为k,那么链的删边方案数是2k.环的方案数乘以链的方案数就是总的方案数 (之前没关同步T了...) 代码 #include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; con

2019校招真题在线编程-牛牛找工作

时间限制:2秒 空间限制:65536K 热度指数:77851 本题知识点: 网易 Java工程师 C++工程师 iOS工程师 安卓工程师 运维工程师 前端工程师 算法工程师 PHP工程师 测试工程师 排序 模拟 贪心 题目描述 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬.牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作.在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们.牛牛的小伙伴太多了,于是他只好把这个任务交给

2020/3/14 Preliminaries for Benelux Algorithm Programming Contest 2019 部分补题报告和解题报告

A. Architecture 比较行列最大值相同则possible 不同则impossible #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; int main(){ int r,c,x,y,i; int maxx=0,maxy=0; cin>>r>>c; for(i=1;i<=r;i++)

2019.10.24模拟赛赛后总结

本文原创,如果有不到位的地方欢迎通过右下角的按钮私信我! A.Icow Player 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号.至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定: * 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000). * 当一首曲子播放完毕,接下来播放的

刷题记录:[SUCTF 2019]EasySQL (欠)

目录 刷题记录:[SUCTF 2019]EasySQL 刷题记录:[SUCTF 2019]EasySQL 原文地址:https://www.cnblogs.com/20175211lyz/p/11450409.html

2019.10.26 CSP%您赛第三场

\(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(light.cpp\) 输入文件名 \(competition.in\) \(message.in\) \(light.in\) 输出文件名 \(competition.out\) \(message.out\) \(light.out\) 测试点时限 \(1s\) \(1s\) \(2s\) 内存限制 \