• LUOGU NOIP 2018 模拟赛 DAY1


    T1

    传送门

    解题思路

    这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    
    using namespace std;
    typedef long long LL;
    
    inline LL rd(){
        LL x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    
    LL l,r;
    int q;
    
    int main(){
        scanf("%d",&q);
        while(q--){
            l=rd(),r=rd();
            printf("%lld
    ",(r-l+1)%9*(l%9+r%9)%9*5%9);
        }
        return 0;
    }
    View Code

    T2

    传送门

    解题思路

    最短路,求出哈利在1点与T1点到其他点的最短路,再求出罗恩在一点与T1点到其他点的最短路,然后分类讨论就行了。

    // luogu-judger-enable-o2
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    
    using namespace std;
    const int MAXN = 50005;
    const int MAXM = 100005;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    
    int n,m,head[MAXN],cnt,k,T1,T2,ans;
    int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1];
    int dis[MAXN][5];  //dis[x][1] 哈利1 dis[x][2] 罗恩1 dis[x][3] 哈利x dis[x][4] 罗恩x 
    bool lim[MAXN],vis[MAXN];
    queue<int> Q;
    
    inline void add(int bg,int ed,int w){
        to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
    }
    
    void spfa_Harry(int st,int now){
        memset(vis,false,sizeof(vis));
        dis[st][now]=0;Q.push(st);vis[st]=1;
        register int x,u;
        while(!Q.empty()){
            x=Q.front();Q.pop();vis[x]=0;
            for(register int i=head[x];i;i=nxt[i]){
                u=to[i];
                if(dis[x][now]+val[i]<dis[u][now]){
                    dis[u][now]=dis[x][now]+val[i];
                    if(!vis[u]){vis[u]=1;Q.push(u);}
                }
            }
        }
    }
    
    void spfa_Ron(int st,int now){
        memset(vis,false,sizeof(vis));
        dis[st][now]=0;vis[st]=1;Q.push(st);
        int x,u;
        while(!Q.empty()){
            x=Q.front();Q.pop();vis[x]=0;
            for(register int i=head[x];i;i=nxt[i]){
                u=to[i];if(lim[u]) continue;
                if(dis[x][now]+val[i]<dis[u][now]){
                    dis[u][now]=dis[x][now]+val[i];
                    if(!vis[u]) {vis[u]=1;Q.push(u);}
                }
            }
        }
    }
    
    int main(){
        memset(dis,0x3f,sizeof(dis));
        n=rd(),m=rd(),k=rd();int x,y,z;
        for(int i=1;i<=k;i++) lim[rd()]=1;
        for(int i=1;i<=m;i++){
            x=rd(),y=rd(),z=rd();
            add(x,y,z),add(y,x,z);
        }
        T1=rd(),T2=rd();
        spfa_Harry(1,1);spfa_Harry(T1,2);
        spfa_Ron(1,3);spfa_Ron(T1,4);
        ans=min(min(max(dis[T1][1],dis[T2][3]),max(dis[T2][1],dis[T1][3]))
        ,min(min(dis[T1][1],dis[T2][1])+dis[T2][2],min(dis[T1][3],dis[T2][3])+dis[T2][4]));
        cout<<ans<<endl;
        return 0;
    }
    View Code

    T3

    传送门

    解题思路

    大模拟,感觉没有时间复杂度难。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<queue>
    #include<algorithm>
    
    using namespace std;
    const int MAXN = 205;
    
    int n,m,c,k,cnt,mp[MAXN][MAXN];
    int hx[MAXN],hy[MAXN],food,wx[MAXN],wy[MAXN];
    int sx[4]={0,0,-1,1},sy[4]={-1,1,0,0};
    bool exist[MAXN];
    char s[MAXN][MAXN],zz[MAXN][MAXN];
    
    struct Snack{
        int num,len;
    }S[MAXN];
    
    void dfs(int x,int y){
        S[cnt].len++;
        mp[x][y]=cnt;bool flag=0;
        for(register int i=0;i<=3;i++){
            int xx=x+sx[i],yy=y+sy[i];
            if(xx<=0 || xx>n || yy<=0 || yy>m) continue;
            if(s[xx][yy]!='#' || mp[xx][yy]==cnt) continue;
            flag=1;dfs(xx,yy);
        }
        if(!flag) wx[cnt]=x,wy[cnt]=y;
    }
    
    void die(int x,int y,int id){
        mp[x][y]=-1;
        for(register int i=0;i<=3;i++){
            int xx=x+sx[i],yy=y+sy[i];
            if(xx<=0 || xx>n || yy<=0 || yy>m) continue;
            if(mp[xx][yy]!=id) continue;
            die(xx,yy,id);
        }
    }
    
    inline bool pd(int x,int y){
        if(x>0 && x<=n && y>0 && y<=m && mp[x][y]<=0) return true;
        return false;
    }
    
    inline bool cmp(Snack A,Snack B){
        if(A.len==B.len) return A.num<B.num;
        return A.len>B.len;
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(s[i][j]=='&') mp[i][j]=-1,food++;
                if(s[i][j]=='@'){
                    cnt++;
                    hx[cnt]=i,hy[cnt]=j;
                    dfs(i,j);exist[cnt]=1;
                    S[cnt].num=cnt;
                }
            }
        }
    //    for(int i=1;i<=n;i++){
    //        for(int j=1;j<=m;j++)
    //            cout<<mp[i][j]<<" ";
    //        cout<<endl;
    //    }
        for(int i=1;i<=cnt;i++)
            scanf("%s",zz[i]+1);
        for(int i=1;i<=k;i++)
            for(int j=1;j<=cnt;j++){
                if(!exist[j]) continue;
                if(zz[j][i]=='D') {
                    hy[j]++;
                    if(!pd(hx[j],hy[j])) {
                        die(hx[j],hy[j]-1,j);
                        food+=S[j].len;
                        exist[j]=0;S[j].len=0;
                        continue;
                    }
                    if(mp[hx[j]][hy[j]]==-1){
                        food--;S[j].len++;
                        mp[hx[j]][hy[j]]=j;
                        continue;
                    }
                    mp[hx[j]][hy[j]]=j;
                    for(register int t=0;t<=3;t++){
                        int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                        if(mp[xx][yy]==j) {
                            mp[wx[j]][wy[j]]=0;
                            wx[j]=xx,wy[j]=yy;
                            break;
                        }
                    }
                }
                if(zz[j][i]=='A') {
                    hy[j]--;
                    if(!pd(hx[j],hy[j])) {
                        die(hx[j],hy[j]+1,j);
                        food+=S[j].len;
                        exist[j]=0;S[j].len=0;
                        continue;
                    }
                    if(mp[hx[j]][hy[j]]==-1){
                        food--;S[j].len++;
                        mp[hx[j]][hy[j]]=j;
                        continue;
                    }
                    mp[hx[j]][hy[j]]=j;
                    for(register int t=0;t<=3;t++){
                        int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                        if(mp[xx][yy]==j) {
                            mp[wx[j]][wy[j]]=0;
                            mp[xx][yy]=1;
                            wx[j]=xx,wy[j]=yy;
                            break;
                        }
                    }
                }
                if(zz[j][i]=='W') {
                    hx[j]--;
                    if(!pd(hx[j],hy[j])) {
                        die(hx[j]+1,hy[j],j);
                        food+=S[j].len;
                        exist[j]=0;S[j].len=0;
                        continue;
                    }
                    if(mp[hx[j]][hy[j]]==-1){
                        food--;S[j].len++;
                        mp[hx[j]][hy[j]]=j;
                        continue;
                    }
                    mp[hx[j]][hy[j]]=j;
                    for(register int t=0;t<=3;t++){
                        int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                        if(mp[xx][yy]==j) {
                            mp[wx[j]][wy[j]]=0;
                            mp[xx][yy]=1;
                            wx[j]=xx,wy[j]=yy;
                            break;
                        }
                    }
                }
                if(zz[j][i]=='S') {
                    hx[j]++;
                    if(!pd(hx[j],hy[j])) {
                        die(hx[j]-1,hy[j],j);
                        food+=S[j].len;
                        exist[j]=0;S[j].len=0;
                        continue;
                    }
                    if(mp[hx[j]][hy[j]]==-1){
                        food--;S[j].len++;
                        mp[hx[j]][hy[j]]=j;
                        continue;
                    }
                    mp[hx[j]][hy[j]]=j;
                    for(register int t=0;t<=3;t++){
                        int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                        if(mp[xx][yy]==j) {
                            mp[wx[j]][wy[j]]=0;
                            mp[xx][yy]=1;
                            wx[j]=xx,wy[j]=yy;
                            break;
                        }
                    }
                }
            }
        sort(S+1,S+1+cnt,cmp);
    //    for(int i=1;i<=n;i++){
    //        for(int j=1;j<=m;j++)
    //            cout<<mp[i][j]<<" ";
    //        cout<<endl;
    //    }
        for(int i=1;i<=cnt;i++)
            printf("%d %d
    ",S[i].len,S[i].num);
        printf("%d",food);
        return 0;
    }
    View Code
  • 相关阅读:
    Codeforces 765 E. Tree Folding
    Codeforces 617 E. XOR and Favorite Number
    2017.3.4[hihocoder#1403]后缀数组一·重复旋律
    2017.2.23[hdu1814]Peaceful Commission(2-SAT)
    2017.2.18Codeforces Round #398 (Div. 2)
    2017.2.18[codevs1170]NOIP2008提高组复赛T4双栈排序
    2017.2.18[codevs3319][bzoj3670]NOI2014D2T1动物园
    2017.2.18[codevs3311][bzoj3668]NOI2014D1T1起床困难综合症
    2017.2.10 Splay总结
    2017.2.10考试总结2017冬令营
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9691053.html
Copyright © 2020-2023  润新知