L3-01 那就别担心了(30分的0分)
题目描述:
下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。
博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路径。
输入格式
输入首先在一行中给出两个正整数 N(1<N≤500)和 M,分别为命题个数和推理个数。这里我们假设命题从 1 到 N 编号。
接下来 M 行,每行给出一对命题之间的推理关系,即两个命题的编号 S1 S2,表示可以从 S1 推出 S2。题目保证任意两命题之间只存在最多一种推理关系,且任一命题不能循环自证(即从该命题出发推出该命题自己)。
最后一行给出待检验的两个命题的编号 A B。
输出格式:
在一行中首先输出从 A 到 B 有多少种不同的推理路径,然后输出 Yes 如果推理是“逻辑自洽”的,或 No 如果不是。
题目保证输出数据不超过 10^9 。
输入样例1:
7 8
7 6
7 4
6 5
4 1
5 2
5 3
2 1
3 1
7 1
输出样例1:
3 Yes
输入样例2:
7 8
7 6
7 4
6 5
4 1
5 2
5 3
6 1
3 1
7 1
输出样例2:
3 No
注:赛后写的代码,可能有误,欢迎大佬指出
题解:
#include <stdio.h>
#include <stdlib.h>
typedef struct map{
int nv,ne;
int G[501][501];
}map;
int sum,aim,end,visted[501];
void DFS(int n,map* T){
if(n==end)
{
sum++;
return;
}
for(int i=1;i<=T->nv;i++){
if(T->G[n][i]!=0&&visted[i]==0){
visted[i]=1;
DFS(i,T);
visted[i]=0;
}
}
}
int main()
{
map* T=(map*)malloc(sizeof(map));
scanf("%d%d",&T->nv,&T->ne);
int i,j,a,b,ans=0,flag;
int p[T->nv+1];
for(i=1;i<=T->nv;i++){
for(j=1;j<=T->nv;j++)
T->G[i][j]=0;
p[i]=0;
}
for(i=1;i<=T->ne;i++)
{
scanf("%d%d",&a,&b);
T->G[a][b]=1;
p[a]=1;
}
scanf("%d%d",&aim,&end);
DFS(aim,T);
printf("%d ",sum);
for(i=1;i<=T->nv;i++){
if(p[i]!=1){
ans++;
flag=i;
}
}
if(ans==1&&flag==end)
printf("Yes");
else
printf("No");
return 0;
}
传送门 (30分得0分)
题目描述:
平面上有 2n 个点,它们的坐标分别是 (1,0),(2,0),⋯(n,0) 和 (1,109),(2,109 ),⋯,(n,109 )。我们称这些点中所有 y 坐标为 0 的点为“起点”,所有 y 坐标为 109 的点为终点。一个机器人将从坐标为 (x,0) 的起点出发向 y 轴正方向移动。显然,该机器人最后会到达某个终点,我们设该终点的 x 坐标为 f(x)。
在上述条件下,显然有 f(x)=x。不过这样的数学模型就太无趣了,因此我们对上述数学模型做一些小小的改变。我们将会对模型进行 q 次修改,每一次修改都是以下两种操作之一:
- x′ x′′ y: 在 (x′ ,y) 与 (x′′ ,y) 处增加一对传送门。当机器人碰到其中一个传送门时,它会立刻被传送到另一个传送门处。数据保证进行该操作时,(x′ ,y) 与 (x′′ ,y) 处当前不存在传送门。
- x′ x′′ y: 移除 (x′ ,y) 与 (x′′ ,y) 处的一对传送门。数据保证这对传送门存在。
求每次修改后 x=1∑n xf(x) 的值。
输入格式
第一行输入两个整数 n 与 q (2≤n≤105 , 1≤q≤105 ),代表起点和终点的数量以及修改的次数。
接下来 q 行中,第 i 行输入一个字符 opi 以及三个整数 xi′ , xi′′ and yi (opi ∈{‘+’ (ascii: 43),‘-’ (ascii: 45)}, 1≤xi′ <xi′′ ≤n, 1≤yi <109 ),代表第 i 次修改的内容。修改顺序与输入顺序相同。
输出格式:
输出 q 行,其中第 i 行包含一个整数代表第 i 次修改后的答案。
输入样例1:
5 4
+ 1 3 1
+ 1 4 3
+ 2 5 2
- 1 4 3
输出样例1:
51
48
39
42
注:暂无,望大佬指点
题解:
可怜的复杂度 (30分得0分)
可怜有一个数组 A,定义它的复杂度 c(A) 等于它本质不同的子区间个数。举例来说,c([1,1,1])=3,因为 [1,1,1] 只有 3 个本质不同的子区间 [1]、[1,1] 和 [1,1,1];而 c([1,2,1])=5,它包含 5 个本质不同的子区间 [1]、[2]、[1,2]、[2,1]、[1,2,1]。
可怜打算出一道和复杂度相关的题目。众所周知,引入随机性往往可以让一个简单的题目脱胎换骨。现在,可怜手上有一个长度为 n 的正整数数组 x 和一个正整数 m。接着,可怜会独立地随机产生 n 个 [1,m] 中的随机整数 yi ,并把 xi 修改为 mxi +yi 。
显然,一共有 N=mn 种可能的结果数组。现在,可怜想让你求出这 N 个数组的复杂度的和。
输入格式
第一行给出一个整数 t (1≤t≤5) 表示数据组数。
对于每组数据,第一行输入两个整数 n 和 m (1≤n≤100,1≤m≤109 ),第二行是 n 个空格隔开的整数表示数组 x 的初始值 (1≤xi ≤109 )。
输出格式:
对于每组数据,输出一行一个整数表示答案。答案可能很大,你只需要输出对 998244353 取模后的结果。
输入样例1:
4
3 2
1 1 1
3 2
1 2 1
5 2
1 2 1 2 1
10 2
80582987 187267045 80582987 187267045 80582987 187267045 80582987 187267045 80582987 187267045
输出样例1:
36
44
404
44616
注:暂无,望大佬指点
题解: