zoukankan      html  css  js  c++  java
  • JZOJ 2020.07.28【NOIP提高组】模拟

    2020.07.28【NOIP提高组】模拟

    考试时状态不好,暴力不想打
    结束前勉勉强强骗点分
    已经不想说什么了······

    (T1) 复制&粘贴2
    逆推答案,枚举 (k),分类讨论

    (T2) 愉快的logo设计
    暴力计算贡献改为前缀和,把原串复制一片,把目标串分成连续的多块,记录开头结尾,根据前缀和算成功匹配的个数,取最大的即可

    (T3) Flower 特难的题,见我另一篇,这里不展开叙述

    (T4) 有趣的有趣的家庭菜园 还可以,见我另一篇,这里不展开叙述

    前两题代码:

    (Code1)

    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    const int N = 2e5 + 5;
    int k , m , n , x[N] , y[N] , z[N];
    char s[N];
    
    int main()
    {
    	freopen("copypaste.in" , "r" , stdin);
    	freopen("copypaste.out" , "w" , stdout);
    	scanf("%d%d%s%d" , &k , &m , s , &n);
    	for(register int i = 1; i <= n; i++) scanf("%d%d%d" , &x[i] , &y[i] , &z[i]);
    	int len = strlen(s);
    	for(register int i = len; i; i--) s[i] = s[i - 1];
    	for(register int i = 1; i <= k; i++)
    	{
    		int ans = i;
    		for(register int j = n; j; j--)
    		{
    			if (z[j] + y[j] - x[j] < ans) ans = ans - (y[j] - x[j]);
    			else if (ans > z[j]) ans = ans - z[j] + x[j];
    		}
    		printf("%c" , s[ans]);
    	}
    }
    

    (Code2)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    
    const int N = 5000005;
    int k , ans = N , tot = 0 , num[5][N];
    char s[N] , str[13][N];
    
    struct node{
    	int l , r , s;
    }fl[N];
    
    int main()
    {
    	freopen("logo.in" , "r" , stdin);
    	freopen("logo.out" , "w" , stdout);
    	scanf("%d%s" , &k , s);
    	
    	int p = 1;
    	str[0][0] = '0';
    	for(register int i = 1; i <= k; i++)
    	{
    		for(register int j = 1; j <= p; j++) str[i][j - 1] = 'J' , str[i][j + p - 1] = 'O' , str[i][j + p * 2 - 1] = 'I';
    		for(register int j = 3 * p; j < 4 * p; j++) str[i][j] = str[i - 1][j - 3 * p];
    		p *= 4;
    	}
    	for(register int i = 0; i < p - 1; i++) 
    	{
    		int j = i;
    		fl[++tot].l = i;
    		fl[tot].s = str[k][i] == 'J' ? 1 : (str[k][i] == 'O' ? 2 : 3);
    		while (str[k][j] == str[k][j + 1]) j++;
    		fl[tot].r = j;
    		i = j;
    	}
    	
    	p = strlen(s);
    	for(register int i = p; i <= p * 2 - 1; i++) s[i] = s[i - p];
    	for(register int i = 0; i <= p * 2 - 1; i++) 
    	{
    		int x = s[i] == 'J' ? 1 : (s[i] == 'O' ? 2 : 3);
    		if (i != 0) 
    		{
    			num[1][i] = num[1][i - 1];
    			num[2][i] = num[2][i - 1];
    			num[3][i] = num[3][i - 1];
    		}
    		num[x][i]++;
    	}
    	
    	for(register int i = 0; i < p; i++)
    	{
    		int x = 0;
    		for(register int j = 1; j <= tot; j++) 		
    			x += fl[j].l + i != 0 ? num[fl[j].s][fl[j].r + i] - num[fl[j].s][fl[j].l + i - 1] : num[fl[j].s][fl[j].r + i];
    		ans = min(ans , p - x);
    	}	
    	printf("%d" , ans - 1);	
    }
    
  • 相关阅读:
    更换Ubuntu源为国内源的操作记录
    Dockerfile构建容器镜像
    Nginx负载均衡中后端节点服务器健康检查
    Linux系统下CPU使用(load average)梳理
    android:怎么实现一个控件与另一个指定控件左对齐
    Android Studio一直 Fetching Documentation...
    px、pt、ppi、dpi、dp、sp之间的关系
    Android中如何在代码中设置View的宽和高?
    硬中断与软中断的区别!
    Java 日期时间获取和显示
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/13392678.html
Copyright © 2011-2022 走看看