• 日常模拟赛


    题目链接

    None
    100 + 100 + 10 = 210

    T1

    不太会做...
    好像....是个SB题....嗯.....div3T1难度

    #include<cstdio> 
    #include<algorithm> 
    #define int long long 
    #define gc getchar() 
    #define pc putchar
    inline int read() {
    	int x = 0,f = 1; 
    	char c = getchar(); 
    	while(c < '0' || c > '9') c = getchar(); 
    	while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar(); 
    	return x * f; 
    } 
    void print(int x)  {
    	if(x < 0) { 
    		pc('-'); 
    		x = -x; 
    	} 
    	if(x >= 10) print(x / 10); 
    	pc(x % 10 + '0'); 
    } 
    main() { 
    	freopen("grid.in","r",stdin); 
    	freopen("grid.out","w",stdout); 
    	int n = read(),a = read(),b = read(),c = read(),d = read(); 
    	printf("%lld
    ",std::max(std::abs(a - c),std::abs(d - b))); 
    	return 0; 
    } 
    
    

    T2

    dp[i][2/3]表示以i为开始向后扩展两位是否可行..那么就是从dp[i + 2 / 3][2 / 3]转移就好了

    #include<cstdio> 
    #include<string> 
    #include<cstring>  
    #include<algorithm> 
    #include<bits/stdc++.h> 
    using namespace std; 
    #define gc getchar() 
    #define pc putchar
    inline int read() {
    	int x = 0,f = 1; 
    	char c = getchar(); 
    	while(c < '0' || c > '9') c = getchar(); 
    	while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar(); 
    	return x * f; 
    } 
    #define ull unsigned long long
    void print(int x)  {
    	if(x < 0) { 
    		pc('-'); 
    		x = -x; 
    	} 
    	if(x >= 10) print(x / 10); 
    	pc(x % 10 + '0'); 
    } 
    const int maxn = 200007; 
    bool dp[maxn][5]; 
    char s[maxn]; 
    bool judge(int l,int r,int l1,int r1) {  
    	for(int i = l,j = l1; i <= r; ++ i,++ j) {
    		if(s[i] != s[j]) return true; 
    	} 
    	return false; 
    } 
    struct node { 
    	int l,r; 
    } ans[maxn]; 
    /*const int bas; 
    struct node { 
    	ull has; 
    	int id; 
    	bool operator < (const Hash &k)const { 
    		return has < k.has; 
    	} 
    } 
    char Ts[]
    ull hash(char S[]) { 
    	
    } */
    std::string A[maxn],B[maxn]; 
    int tot = 0; 
    bool judge2(int x,int y) { 
    	int a = A[x].size(),b = A[y].size(); 
    	if(a != b) return true; 
    	if(a == 2) { 
    		if(A[x][0] != A[y][0]) return true;  
    		if(A[x][1] != A[y][1]) return true;  
    	} else { 
    		if(A[x][0] != A[y][0]) return true;  
    		if(A[x][1] != A[y][1]) return true;  
    		if(A[x][2] != A[y][2]) return true;  
    	} 
    	return false; 
    } 
    void solve() { 
    	memset(dp,0,sizeof dp); 
    	tot = 0; 
    	int n = strlen(s + 1); 
    	dp[n - 1][2] = 1; 
    	dp[n - 2][3] = 1; 
    	for(int i = n;i > 3;-- i) { 
    		if((dp[i + 2][2] && judge(i,i + 1,i + 2,i + 3)) || dp[i + 2][3])
    			dp[i][2] = 1; 
    		if((dp[i + 3][3] && judge(i,i + 2,i + 3,i + 5)) || dp[i + 3][2])
    			dp[i][3] = 1; 
    	} 
    	A[0] = "*(&*("; 
    	for(int i = 4;i <= n;++ i) { 
    		if(dp[i][2]) { 
    			++ tot;
    			A[tot].clear(); 
    			A[tot] += s[i] , A[tot] += s[i + 1]; 
    		} 
    		if(dp[i][3]) { 
    			++ tot; 
    			A[tot].clear(); 
    			A[tot] += s[i],A[tot] += s[i + 1],A[tot] += s[i + 2]; 
    		} 
    	} 
    	std::sort(A + 1,A + tot + 1); 
    	int ans = 0;  
    	 for(int i = 1;i <= tot;++ i) { 
    		if(judge2(i,i - 1)) 
    		B[++ ans] = A[i]; 
    	} 
    	print(ans); 
    	pc('
    '); 
    	for(int i = 1;i <= ans;++ i) { 
    		for(int j = 0;j < B[i].size();++ j) {
    			pc(B[i][j]); 
    		} 
    		pc('
    '); 
    	} 
    } 
    void solve2() {
    	
    	memset(dp,0,sizeof dp); 
    	tot = 0; 
    	int n = strlen(s + 1); 
    	dp[n - 1][2] = 1; 
    	dp[n - 2][3] = 1; 
    	for(int i = n;i > 3;-- i) { 
    		if((dp[i + 2][2] ) || dp[i + 2][3])
    			dp[i][2] = 1; 
    		if((dp[i + 3][3] ) || dp[i + 3][2])
    			dp[i][3] = 1; 
    	} 
    	A[0] = "*(&*("; 
    	for(int i = 4;i <= n;++ i) { 
    		if(dp[i][2]) { 
    			++ tot;
    			A[tot].clear(); 
    			A[tot] += s[i] , A[tot] += s[i + 1]; 
    		} 
    		if(dp[i][3]) { 
    			++ tot; 
    			A[tot].clear(); 
    			A[tot] += s[i],A[tot] += s[i + 1],A[tot] += s[i + 2]; 
    		} 
    	} 
    	std::sort(A + 1,A + tot + 1); 
    	int ans = 0;  
    	 for(int i = 1;i <= tot;++ i) { 
    		if(judge2(i,i - 1)) 
    		B[++ ans] = A[i]; 
    	} 
    	print(ans); 
    	pc('
    '); 
    	for(int i = 1;i <= ans;++ i) { 
    		for(int j = 0;j < B[i].size();++ j) {
    			pc(B[i][j]); 
    		} 
    		pc('
    '); 
    	} 
    } 
    int main() { 
    	freopen("ling.in","r",stdin); 
    	freopen("ling.out","w",stdout); 
    	int n = read(),type = read(); 
    	for(int i = 1;i <= n;++ i) { 
    		scanf("%s",s + 1); 
    		if(type == 0) solve(); 
    		else solve2(); 
    	} 
    	return 0; 
    } 
    
    

    T3

    dp[i][j]表示以i为根的子树中,树高小于等于j的概率
    转移就是dp[i][j] *= 0.5 + 0.5 * (dp[i][j-1]) 首先是边不连的概率,其次是<=dp[son][j -1]的
    然后我zz了
    对于新增一个点,对于父亲的深度影响只有该节点的深度+1,除掉旧的乘上新的就OK,我全更新了一遍...,写出了奇怪的bug...

    #include<cstdio> 
    #include<string> 
    #include<cstring>  
    #include<algorithm> 
    #include<bits/stdc++.h> 
    using namespace std; 
    #define gc getchar() 
    #define pc putchar
    inline int read() {
    	int x = 0,f = 1; 
    	char c = getchar(); 
    	while(c < '0' || c > '9') c = getchar(); 
    	while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar(); 
    	return x * f; 
    } 
    void print(int x)  {
    	if(x < 0) { 
    		pc('-'); 
    		x = -x; 
    	} 
    	if(x >= 10) print(x / 10); 
    	pc(x % 10 + '0'); 
    } 
    const int maxn = 100005; 
    const int h = 60; 
    double dp[maxn][70]; 
    double pp[maxn][70]; 
    int fa[maxn]; 
    int siz[maxn]; 
    int node = 0; 
    struct node { 
    	int v,next;
    } edge[maxn << 1]; 
    int num = 0,head[maxn]; 
    inline void add_edge(int u,int v) { 
    	edge[++ num].v = v; edge[num].next = head[u];head[u] = num; 
    } 
    #define eps 1e-7 
    void update(int x) { 
    	int k = 60; 
    	dp[x][0] = 1.0; 
    	int X = x; 
    	while(-- k && X) { 
    		siz[X] ++; 
    		for(int i = 0;i < h;++ i) { 
    			if((fabs(dp[X][i] - 0.0) > eps) && ((fabs(dp[fa[X]][i + 1] - 0.0) > eps))) dp[fa[X]][i + 1] /= (0.5 + 0.5 * dp[X][i]); 
    		} 
    		X = fa[X]; 
    	} 
    	k = 60; 
    	while(-- k && x) { 
    		dp[fa[x]][0] *= 0.5; 
    		for(int i = 0;i < h;++ i) { 
    			if(fabs(dp[fa[x]][i + 1] - 0.0) <= eps) dp[fa[x]][i + 1] = 1.0; 
    			dp[fa[x]][i + 1] *= (0.5 + 0.5 * dp[x][i]); 
    		} 	 
    		x = fa[x]; 
    	} 
    } 
    int main() { 
    	freopen("threebody.in","r",stdin); freopen("threebody.out","w",stdout); 
    	int T = read(),q = read(); 
    	++ node; 
    	siz[node] = 1,dp[node][0] = 1.0; 
    	for(int ty,x,i = 1;i <= q;++ i) { 
    		ty = read(),x = read(); 
    		if(ty == 1) { 
    			fa[++ node] = x; 
    			update(node); 
    		} else { 
    			double ans = 0; 
    			for(int i = 1;i < std::min(siz[x],h);++ i) { 
    				ans += 1.0 * i * std::max(dp[x][i] -  dp[x][i - 1],0.0); 
    			} printf("%lf
    ",ans); 
    		} 
    	} 
    	return 0; 
    } 
    
    
  • 相关阅读:
    《你不知道的javascript》读书笔记2
    你不知道的console调试
    《你不知道的javascript》读书笔记1
    使用js做LeetCode
    用装饰器来进行登录验证
    python 解压序列
    pycharm 的live_template的使用
    faker 库的使用
    Python常用内置类和常用内置函数汇总
    迭代器 ,生成器(生成器函数/生成器表达式)
  • 原文地址:https://www.cnblogs.com/sssy/p/9691236.html
Copyright © 2020-2023  润新知