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\n",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\n",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\n",ans);
112         }
113     }
114     else printf("%d\n",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\n",dp[1][0]);
55     
56     return 0;
57 }
58 
59 int sb=hh();
60 int main(int argc,char**argv) {;}
代码

 

posted @ 2017-10-23 16:59  拿叉插猹哈  阅读(186)  评论(0编辑  收藏  举报