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 \times \min(a[j+1... i]) \times (-1)^{i-j-1} \\ f_i = (-1)^{i} \sum_j\min(a[j+1...i]) \times f_j \times (-1)^{j-1}\]

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

\[\min(a[j+1...i]) \to \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\) 使得 \(i\in U\), 必有 \(U\in S​\) .
    (如果不存在,那么 \(\forall i, \exists i\in V_i, V_i\in T\) ,那么 \(\{1,2,\dots, n\}=\bigcup_i V_i \in T\),矛盾)
  • 假设 \(\{1,2,\dots, n\}\in T\)
    那么一定存在一个 \(i\) ,使得 \(\forall U\) 使得 \(i\in U\), 必有 \(U\in T\) .
    (如果不存在,那么 \(\forall i, \exists i\in V_i, V_i\in S\) ,那么 \(\{1,2,\dots, n\}=\bigcup_i V_i \in S\),矛盾)
    \(2^0 , 2^1, \dots, 2^{n-1}\) ,
    假设 \(K=2^{a_0}+2^{a_1}+\dots +2^{a_s}\)
    咕咕咕
posted @ 2018-09-17 15:34  zzzzx  阅读(113)  评论(0编辑  收藏  举报