zoukankan      html  css  js  c++  java
  • 10.23 模拟赛

    叉叉

    题目名称

    叉叉

    程序文件名

    cross

    输入文件名

    cross.in

    输出文件名

    cross.out

    每个测试点时限

    1秒

    内存限制

    128MB

    测试点数目

    10

    每个测试点分值

    10

    是否有部分分

    试题类型

    传统

    题目描述

    现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样的操作。

    现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。

    下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。

    输入格式

    一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。

    输出格式

    一个整数,表示答案。

    样例输入

    abaazooabz

    样例输出

    3

    数据范围

    对于30% 的数据,字符串长度不超过50。

    对于100% 的数据,字符串长度不超过100,000。

     

    思路:纯模拟

       按照题目要求 把字母连线 存下每一条线段

       判断这条线段与多少线段相交 

       极限复杂度应该是O(n^2/4) 但是远远达不到这个复杂度

       数组开小了 100分只拿了30

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 
     5 const int MAXN=100010;
     6 
     7 int n,tot,ans,p;
     8 
     9 char s[MAXN];
    10 
    11 int e[27][4500];
    12 
    13 struct data {
    14     int s,t;
    15     friend inline bool operator < (data x,data y) {
    16         return x.s<y.s;
    17     }
    18 };
    19 data seg[MAXN];
    20 
    21 int hh() {
    22     freopen("corss.in","r",stdin);
    23     freopen("corss.out","w",stdout);
    24     scanf("%s",s+1);
    25     n=strlen(s+1);
    26     
    27     for(int x,i=1; i<=n; ++i) {
    28         x=s[i]-'a'+1;
    29         e[x][++e[x][0]]=i;
    30     }
    31     for(int i=1; i<=26; ++i) {
    32         for(int j=1; j<=e[i][0]; j+=2) 
    33          ++tot,seg[tot].s=e[i][j],seg[tot].t=e[i][j+1];
    34     }
    35     std::sort(seg+1,seg+1+tot);
    36     
    37     for(int i=1; i<=tot; ++i)
    38       for(int j=i+1; j<=tot; ++j) {
    39           if(seg[j].s>seg[i].t) break;
    40           if(seg[j].t>seg[i].t) ++ans;
    41       }
    42     
    43     printf("%d
    ",ans);
    44     
    45     return 0;
    46 } 
    47 
    48 int sb=hh();
    49 int main(int argc,char**argv) {;}
    代码

    思路:一道**题。

       前30% SPFA水过 

       再30% Floyd + 枚举一条边 水过

       后40% 理论上 只有k>=q 的时候跑 SPFA 

           实际上 直接跑 SPFA 就能过  数据严重水

       照着前60%打的 拿了60

      1 #include <queue>
      2 #include <cstdio>
      3 #include <cctype>
      4 #include <vector>
      5 #include <cstring>
      6 #define  min(a,b) a<b?a:b
      7 
      8 const int INF=0x3f3f3f3f;
      9 const int MAXN=1010;
     10 
     11 int n,m,q,k,ans,tot;
     12 
     13 int dis[MAXN],f[510][510];
     14 
     15 bool vis[MAXN];
     16 
     17 struct data {
     18     int x,y,w;
     19 };
     20 data e[MAXN<<2];
     21 
     22 struct node {
     23     bool flag;
     24     int v,w;
     25     node (int v,int w,bool flag):v(v),w(w),flag(flag) {}
     26 };
     27 
     28 std::queue<int> Q;
     29 std::vector<node> Graph[MAXN];
     30 
     31 inline void read(int&x) {
     32     int f=1;register char c=getchar();
     33     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
     34     for(;isdigit(c);x=x*10+c-48,c=getchar());
     35     x=x*f;
     36 }
     37 
     38 int SPFA() {
     39     Q.push(1);
     40     for(int i=1; i<=n; ++i) vis[i]=false,dis[i]=INF;
     41     dis[1]=0;
     42     while(!Q.empty()) {
     43         int u=Q.front();
     44         Q.pop();
     45         vis[u]=false;
     46         for(int i=0; i<Graph[u].size(); ++i) {
     47             if(Graph[u][i].flag) continue;
     48             int v=Graph[u][i].v;
     49             if(dis[v]>dis[u]+Graph[u][i].w) {
     50                 dis[v]=dis[u]+Graph[u][i].w;
     51                 if(!vis[v]) Q.push(v),vis[v]=true;
     52             }
     53         }
     54     }
     55     if(dis[n]==INF) return -1;
     56     return dis[n];
     57 }
     58 
     59 int SPFA_1() {
     60     Q.push(1);
     61     for(int i=1; i<=n; ++i) vis[i]=false,dis[i]=INF;
     62     dis[1]=0;
     63     while(!Q.empty()) {
     64         int u=Q.front();
     65         Q.pop();
     66         vis[u]=false;
     67         for(int i=0; i<Graph[u].size(); ++i) {
     68             int v=Graph[u][i].v;
     69             if(dis[v]>dis[u]+Graph[u][i].w) {
     70                 dis[v]=dis[u]+Graph[u][i].w;
     71                 if(!vis[v]) Q.push(v),vis[v]=true;
     72             }
     73         }
     74     }
     75     if(dis[n]==INF) return -1;
     76     return dis[n];
     77 }
     78 
     79 int hh() {
     80     freopen("move.in","r",stdin);
     81     freopen("move.out","w",stdout);
     82     
     83     read(n);read(m);read(q);read(k);
     84     memset(f,INF,sizeof f);
     85     
     86     for(register int u,v,w,i=1; i<=m; ++i) {
     87         read(u);read(v);read(w);
     88         Graph[u].push_back(node(v,w,0));
     89         f[u][v]=w;
     90     }
     91     
     92     for(register int u,v,w,i=1; i<=q; ++i) {
     93         read(u);read(v);read(w);
     94         Graph[u].push_back(node(v,w,1));
     95         e[++tot].x=u;e[tot].y=v;e[tot].w=w;
     96     }
     97     
     98     if(k==0) printf("%d
    ",SPFA());
     99     else if(k==1) {
    100         for(int i=1; i<=n; ++i) f[i][i]=0;
    101         for(int k=1; k<=n; ++k) 
    102           for(int i=1; i<=n; ++i)
    103             for(int j=1; j<=n; ++j)
    104               f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    105     
    106         if(f[1][n]==INF) printf("-1");
    107         else {
    108             ans=f[1][n];
    109             for(int i=1; i<=tot; ++i) 
    110                 ans=min(ans,f[1][e[i].x]+f[e[i].y][n]+e[i].w);
    111               printf("%d
    ",ans);
    112         }
    113     }
    114     else printf("%d
    ",SPFA_1());
    115     
    116     return 0;
    117 }
    118 
    119 int sb=hh();
    120 int main(int argc,char**argv) {;}
    View Code

         秀秀 和 哺噜国 (cut)

    时间限制:1s
    空间限制:512MB
    【问题描述】
    哺噜国里有 n 个城市,有的城市之间有高速公路相连。在最开始时,哺噜国里有 n−1 条高
    速公路,且任意两座城市之间都存在一条由高速公路组成的通路。
    由于高速公路的维护成本很高,为了减少哺噜国的财政支出, 将更多的钱用来哺育小哺噜,
    秀秀女王决定关闭一些高速公路。 但是为了保证哺噜国居民的正常生活,不能关闭太多的高速
    公路,要保证每个城市可以通过高速公路与至少k个城市(包括自己)相连。
    在得到了秀秀女王的指令后,交通部长华华决定先进行预调研。华华想知道在满足每个城
    市都可以与至少k个城市相连的前提下,有多少种关闭高速公路的方案(可以一条也不关) 。两
    种方案不同, 当且仅当存在一条高速公路在一个方案中被关闭, 而在另外一个方案中没有被关
    闭。
    由于方案数可能很大, 你只需输出不同方案数对786433取模后的结果即可。 其中786433 =
    6×2^17+ 1。
    【输入格式】
    从文件 cut.in 中读入数据。
    输入第一行,包含两个正整数n,k。
    接下来的 n−1 行,每行包含两个正整数1和2,表示城市1和城市2之间有一条高速公路相
    连。
    【输出格式】
    输出文件到 cut.out 中。
    输出一个非负整数,表示所求方案数对 786433 取模后的结果。
    【样例 1 输入】
    5 2
    1 2
    2 3
    3 4
    4 5
    【样例 1 输出】
    3
    【样例 1 解释】
    三种方案分别为:
    一条高速公路也不关闭;
    关闭城市 2 和城市 3 之间的高速公路;
    关闭城市 3 和城市 4 之间的高速公路。
    【样例 2 输入】
    10 2
    1 2
    1 3
    2 4
    2 5
    3 6
    3 7
    3 10
    5 8
    6 9
    【样例 2 输出】
    12
    【子任务】
    对于20%的数据:n ≤ 20;
    另有30%的数据:n ≤ 100;
    另有10%的数据:k ≤ 100;
    另有20%的数据:n ≤ 1000;
    对于100%的数据:n ≤ 5000,k ≤ n。

    思路:51 Nod 算法马拉松3 Tree

       题解: http://www.cnblogs.com/whistle13326/p/7717554.html

     1 #include <cstdio>
     2 #include <cctype>
     3 #include <vector>
     4 
     5 typedef long long LL;
     6 
     7 const int Mod=786433;
     8 const int MAXN=5010;
     9 
    10 int n,k;
    11 
    12 int siz[MAXN];
    13 
    14 int dp[MAXN][MAXN];
    15 
    16 std::vector<int> Graph[MAXN];
    17 
    18 inline void read(int&x) {
    19     int f=1;register char c=getchar();
    20     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
    21     for(;isdigit(c);x=x*10+c-48,c=getchar());
    22     x=x*f;
    23 }
    24 
    25 void DFS(int u,int fa) {
    26     dp[u][1]=1;
    27     siz[u]=1;
    28     
    29     for(int i=0; i<Graph[u].size(); ++i) {
    30         int v=Graph[u][i];
    31         if(v==fa) continue;
    32         DFS(v,u);
    33         for(int i=siz[u]; i; --i) {
    34             for(int j=1; j<=siz[v]; ++j)
    35               dp[u][i+j]=(dp[u][i+j]+(LL)dp[u][i]*dp[v][j]%Mod)%Mod;
    36             dp[u][i]=(LL)dp[u][i]*dp[v][0]%Mod;
    37         }
    38         siz[u]+=siz[v];
    39     }
    40     for(int i=k; i<=siz[u]; ++i) dp[u][0]=(dp[u][0]+dp[u][i])%Mod;
    41 }
    42 
    43 int hh() {    
    44     read(n);read(k);
    45     
    46     for(int x,y,i=1;i<n;++i) {
    47         read(x);read(y);
    48         Graph[x].push_back(y);
    49         Graph[y].push_back(x);
    50     }
    51     
    52     DFS(1,-1);
    53     
    54     printf("%d
    ",dp[1][0]);
    55     
    56     return 0;
    57 }
    58 
    59 int sb=hh();
    60 int main(int argc,char**argv) {;}
    代码
  • 相关阅读:
    ie6下absolute:fixed问题,完美兼容
    ajax传输 基础一
    获取ip的ip138.com
    css 常用代码解析
    QQ客服出现“企业QQ在线咨询无权限在当前场景使用!” 问题
    用js实现QQ自定义在线图片
    getElement的几中属性介绍
    Ecshop 单选按钮组功能 颜色多选
    IE6完美解决fix问题
    PHP站内搜索、多关键字、加亮显示
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7717724.html
Copyright © 2011-2022 走看看