zoukankan      html  css  js  c++  java
  • NOIP模拟赛13

    期望得分:100+0+100=200

    实际得分:100+5+100=205

    T1

    空间卡到30M。。

    n<=2.5*1e7

    若x是整除区间[1,n]每个数的最小的数,那么对[1,n]每个数分解质因数,

    ai=2^x*3^y*5^z……

    x=2^max(x) * 3^max(y) * 5^max(z) * ……

    max(x)=floor (logx n)

    只有5000以内的素数的指数才会>=2,所以500之后的素数打个表

    代码13M,不传了 

    T2 bzoj 1567  Blue Mary的战役地图

    正解二维哈希,但是严重不满n^7枚举可过

    考试的时候zz的把return0 写成break,gg

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    inline void read (int &x)
    {
        x=0; char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
    }
    int a[51][51],b[51][51];
    int main()
    {
        int n;
        read(n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                read(a[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                read(b[i][j]);
        int x2a,y2a,x2b,y2b;
        bool ok; int ans=0;
        for(int len=n;len;len--)
            for(int xa=1;xa+len-1<=n;xa++)
                for(int ya=1;ya+len-1<=n;ya++)
                    for(int xb=1;xb+len-1<=n;xb++)
                        for(int yb=1;yb+len-1<=n;yb++)
                            if(a[xa][ya]==b[xb][yb])
                            {
                                ok=true;
                                for(int x=1;x<=len&&ok;x++)
                                    for(int y=1;y<=len&&ok;y++)
                                        if(a[xa+x-1][ya+y-1]!=b[xb+x-1][yb+y-1]) ok=false;
                                if(ok) { ans=len;printf("%d",ans);return 0;}
                            }
    }
    View Code

    T3[SDOI2009]Elaxia的路线 增强版

    2个人改成k个人

    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define N 1501
    #define M 4000001
    using namespace std;
    int n,m,k;
    int s[11],t[11];
    int front[N],to[M],nxt[M],tot=1,val[M],from[M];
    int dis1[11][N],dis2[11][N];
    bool vis[N];
    int in[N],front2[N],nxt2[N<<1],to2[N<<1],val2[N<<1],tot2;
    int dp[N];
    struct node
    {
        int num,dis;
        bool operator < (node q)const
        {
            return dis>q.dis;
        }
    }cur,nt;
    void read(int &x)
    {
        x=0; char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
    }
    void add(int u,int v,int w)
    {
        to[++tot]=v;nxt[tot]=front[u];front[u]=tot;val[tot]=w;from[tot]=u;
        to[++tot]=u;nxt[tot]=front[v];front[v]=tot;val[tot]=w;from[tot]=v;
    }
    void add2(int u,int v,int w)
    {
        to2[++tot2]=v;nxt2[tot2]=front2[u];front2[u]=tot2;val2[tot2]=w;in[v]++;
    }
    void init()
    {
        read(n); read(m); read(k);
        for(int i=1;i<=k;i++) read(s[i]),read(t[i]);
        int u,v,w;
        for(int i=1;i<=m;i++) 
        {
            read(u); read(v); read(w);
            add(u,v,w);
        }
    }
    void dijkstra1(int w)
    {
        priority_queue<node>q;
        int S=s[w],T=t[w];
        memset(dis1[w],63,sizeof(dis1[w]));
        memset(vis,false,sizeof(vis));
        dis1[w][S]=0;
        cur.dis=0;cur.num=S;
        q.push(cur);
        int now;
        while(!q.empty())
        {
            cur=q.top(); q.pop();
            now=cur.num;
            if(vis[now]) continue;
            vis[now]=true;
            if(dis1[w][now]!=cur.dis) continue;
            for(int j=front[now];j;j=nxt[j])
                if(dis1[w][to[j]]>dis1[w][now]+val[j]) 
                {
                    dis1[w][to[j]]=dis1[w][now]+val[j];
                    nt.dis=dis1[w][to[j]];
                    nt.num=to[j];
                    q.push(nt);
                }
        }
    }
    void dijkstra2(int w)
    {
        priority_queue<node>q;
        int T=s[w],S=t[w];
        memset(dis2[w],63,sizeof(dis2[w]));
        memset(vis,false,sizeof(vis));
        dis2[w][S]=0;
        cur.dis=0;cur.num=S;
        q.push(cur);
        int now;
        while(!q.empty())
        {
            cur=q.top(); q.pop();
            now=cur.num;
            if(vis[now]) continue;
            vis[now]=true;
            if(dis2[w][now]!=cur.dis) continue;
            for(int j=front[now];j;j=nxt[j])
                if(dis2[w][to[j]]>dis2[w][now]+val[j]) 
                {
                    dis2[w][to[j]]=dis2[w][now]+val[j];
                    nt.dis=dis2[w][to[j]];
                    nt.num=to[j];
                    q.push(nt);
                }
        }
    }
    void pre()
    {
        for(int i=1;i<=k;i++) dijkstra1(i),dijkstra2(i);
    }
    void topsort()
    {
        queue<int>q;
        for(int i=1;i<=n;i++)
            if(!in[i]) q.push(i);
        int now;
        while(!q.empty())
        {
            now=q.front(); q.pop();
            for(int i=front2[now];i;i=nxt2[i])
            {
                dp[to2[i]]=max(dp[to2[i]],dp[now]+val2[i]);
                in[to2[i]]--;
                if(!in[to2[i]]) q.push(to2[i]);
            }
        } 
        int ans=0;
        for(int i=1;i<=n;i++) ans=max(ans,dp[i]);
        printf("%d",ans);
    }
    void solve()
    {
        bool ok;
        int u,v;
        for(int i=2;i<=tot;i++)
        {
            ok=true;
            u=from[i]; v=to[i];
            if(dis1[1][u]+val[i]+dis2[1][v]!=dis1[1][t[1]]) continue;
            for(int j=2;j<=k&&ok;j++)
                if(dis1[j][u]+val[i]+dis2[j][v]!=dis1[j][t[j]] && dis2[j][u]+val[i]+dis1[j][v]!=dis2[j][s[j]]) ok=false;
            if(ok) add2(u,v,val[i]);
        }
        topsort();
    }
    int main()
    {
        freopen("yukari.in","r",stdin);
        freopen("yukari.out","w",stdout);
        init();    
        pre();
        solve();
    }
    View Code
  • 相关阅读:
    算法笔记_225:数字密码发生器(Java)
    LVS专题-(1)LVS基本介绍
    Mysql加锁过程详解(7)-初步理解MySQL的gap锁
    java实现二叉树的构建以及3种遍历方法
    java设计模式-菜鸟网络
    数据结构与算法(周鹏-未出版)-第六章 树-习题
    数据结构与算法(周鹏-未出版)-第六章 树-6.5 Huffman 树
    数据结构与算法(周鹏-未出版)-第六章 树-6.4 树、森林
    数据结构与算法(周鹏-未出版)-第六章 树-6.3 二叉树基本操作的实现
    数据结构与算法(周鹏-未出版)-第六章 树-6.2 二叉树
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7597772.html
Copyright © 2011-2022 走看看