• nowcoder提高组2题解


    T1

    化一下试子就ok

    code

    #include<cstdio>
    #include<algorithm>
    inline long long read() {
        long long x = 0,f = 1;
        char c = getchar();
        while(c < '0' || c > '9') {if(c == '-')f = -1; c = getchar(); }
        while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
        return x * f;
    }
    long long n; 
    long long a[100007]; 
    long long sum[100007];
    long long sum2[100007];
    int main() {
        n = read();
        for(long long i = 1;i <= n;++ i)  a[i] = read(),sum[i] = sum[i - 1] + a[i],sum2[i] = sum2[i - 1] + a[i] * a[i];
        for(long long i = 1;i <= n;++ i) {
            long long s1 = sum2[i - 1] + sum2[n] - sum2[i];
            long long s = sum[i - 1] + sum[n] - sum[i];
            long long ans = (n - 1) * s1 - s * s ;
            if(i != n) printf("%lld ",ans);
            else printf("%lld",ans);
        }
        return 0;
    }
    

    T2

    (g(n))为长为n的环的方案数
    (f(n))为长为n的序列方案书
    容易得到递推式
    (g(n) = f(n) - g(n - 1))
    由于(a_1>a_n)的时候不好处理,我们直接把环转一下,让1位置为最小值
    对于(f(n))可以容斥求得

    [f_i = sum_j f_j imes min(a[j+1... i]) imes (-1)^{i-j-1} \ f_i = (-1)^{i} sum_jmin(a[j+1...i]) imes f_j imes (-1)^{j-1}]

    考虑 i 转移到 i+1 时候:

    [min(a[j+1...i]) o min(a[j+1...i+1] ]

    单调栈为维护一下就好了,单调栈维护

    code

    #include<cstdio> 
    #include<cstring> 
    #include<algorithm> 
    #define pc putchar
    #define gc getchar
    inline int read() { 
    	int x = 0,f = 1; 
    	char c = gc(); 
    	while(c < '0' || c > '9') c = gc(); 
    	while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc(); 
    	return x * f; 
    } 
    #define LL long long
    const int mod = 1000000007; 
     void print(LL x) { 
    	if(x < 0) { 
    		pc('-'); 
    		x = -x;  
    	} 
    	if(x >= 10)print(x / 10); 
    	pc(x % 10 + '0'); 
    } 
    #define INF  0x3f3f3f3f3f3f3f3fLL
    const int maxn = 4000007; 
    LL a[maxn],b[maxn]; 
    int n; 
    inline void mo(LL &x,LL y) { 
    	x = ((x + y ) % mod + mod) % mod; 
    } 
    LL st[maxn][3]; 
    int main()  { 
    	n = read(); 
    	a[1] = read(); 
    	if(n == 1) { 
    		print(a[1]); 
    	} 
    	int mn = 1; 
    	for(int i = 2;i <= n;++ i) { 
    		a[i] = read(); 
    		if(a[i] < a[mn]) mn = i; 
    	} 
    	for(int i = 1;i <= n;++ i) b[i] = a[(mn + i - 2) % n + 1]; 
    	int tp = 1; 
    	memset(a,0,sizeof a); 
    	LL ans = 0; 
    	a[0] = n & 1 ? -1 : 1; 
    	st[1][0] = INF,
    	st[1][1] = a[0]; 
    	for(int i = 1;i <= n;++ i) { 
    		LL sum = 0; 
    		for(;tp && b[i] < st[tp][0]; -- tp)	mo(sum,st[tp][1]); 
    		mo(a[i],-st[tp][2] - sum * b[i]); 	
    		st[++ tp][0] = b[i]; 
    		st[tp][1] = sum; 
    		st[tp][2] = (sum * b[i] + st[tp - 1][2]) % mod; 
    		st[++ tp][0] = INF; 
    		st[tp][1] = a[i]; 
    		mo(ans,a[i]); 
    	} 
        mo(ans,n & 1? - b[1]:b[1]);  
        print(ans);  
    } 
    

    T3

    • 假设 ({1,2,dots, n}in S)
      那么一定存在一个 (i) ,使得 (forall U) 使得 (iin U), 必有 (Uin S​) .
      (如果不存在,那么 (forall i, exists iin V_i, V_iin T) ,那么 ({1,2,dots, n}=igcup_i V_i in T),矛盾)
    • 假设 ({1,2,dots, n}in T)
      那么一定存在一个 (i) ,使得 (forall U) 使得 (iin U), 必有 (Uin T) .
      (如果不存在,那么 (forall i, exists iin V_i, V_iin S) ,那么 ({1,2,dots, n}=igcup_i V_i in S),矛盾)
      (2^0 , 2^1, dots, 2^{n-1}) ,
      假设 (K=2^{a_0}+2^{a_1}+dots +2^{a_s})
      咕咕咕
  • 相关阅读:
    JavaScript之闭包
    JavaScript之原型模式
    .NET Core3.1 解决跨域问题 Startup的配置
    .NTE Core 使用Editor.md富文本编辑器上传图片
    .NET Core3.1 WebApi 配置Swagger 超详细办法
    C#添加写日志,记录单个变量
    一个让我痛不欲生的算法题
    用EF 搭建底层
    用Linq To SQL 搭建底层
    安卓端腾讯QQ-【我的电脑】下载地址
  • 原文地址:https://www.cnblogs.com/sssy/p/9662476.html
Copyright © 2020-2023  润新知