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) {;}
秀秀 和 哺噜国 (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) {;}
作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现
怎么能够停止不前
穿越时空 竭尽全力
我会来到你身边
微笑面对危险
梦想成真不会遥远
鼓起勇气 坚定向前
奇迹一定会出现