牛客挑战赛32

Contest Page

A

sol 真的有人不会做这道题?
#include<bits/stdc++.h>
using namespace std;
 
int main(){
    string s;
    int N; cin >> N;
    for(int i = 1 ; i <= N ; ++i){
        cin >> s;
        if(s.size() >= 2 && s[s.size() - 1] == 'K' && s[s.size() - 2] == 'A'){
            for(int i = 0 ; i < s.size() - 2 ; ++i)
                cout << s[i];
            return 0;
        }
    }
    return 0;
}

B

sol $114514$只有$8$个约数,暴力统计数量然后人脑枚举所有可行方案就行了。
#include<bits/stdc++.h>
using namespace std;
 
#define int unsigned long long
const int _ = 229029 , tar[] = {2,31,1847};
signed main(){
    int N; cin >> N; static int arr[_] , num[8];
    for(int i = 1 ; i <= N ; ++i){
        cin >> arr[i];
        if(arr[i] != 0)
            if(114514 % arr[i] == 0){
                int cur = 0;
                for(int j = 0 ; j < 3 ; ++j)
                    if(arr[i] % tar[j] == 0) cur |= 1 << j;
                  ++num[cur];
            }
    }
    int p = num[7] + num[6] * num[1] + num[5] * num[2] + num[3] * num[4] + num[1] * num[2] * num[4];
    cout << p * (1 + num[0]);
    return 0;
}

C

sol 把前几项算出来丢到OEIS里发现递推公式:$a_i=2a_{i-1}+a_{i-2}-2a_{i-3}-a_{i-4}$,然后矩乘就行了。
#include<bits/stdc++.h>
using namespace std;
 
#define int long long
const int MOD = 998244353;
struct matrix{
    int a[4][4];
    matrix(){memset(a , 0 , sizeof(a));}
    int* operator [](int x){return a[x];}
    matrix operator *(matrix b){
        matrix c;
        for(int i = 0 ; i < 4 ; ++i)
            for(int k = 0 ; k < 4 ; ++k)
                for(int j = 0 ; j < 4 ; ++j)
                    c[i][j] = (c[i][j] + a[i][k] * 1ll * b[k][j]) % MOD;
        return c;
    }
}G , T;
 
signed main(){
    int N; cin >> N;
    if(N == 1) puts("0");
    else if(N == 2) puts("1");
    else if(N == 3) puts("2");
    else if(N == 4) puts("5");
    else{
        T[1][0] = T[2][1] = T[3][2] = 1;
        T[3][3] = 2; T[2][3] = 1; T[1][3] = MOD - 2; T[0][3] = MOD - 1;
        N -= 4; G[0][0] = 0; G[0][1] = 1; G[0][2] = 2; G[0][3] = 5;
        while(N){
            if(N & 1) G = G * T;
            T = T * T; N >>= 1;
        }
        cout << G[0][3];
    }
    return 0;
}

D

sol 考虑枚举$1 \leq i$
枚举$i,j$放在了$p_i,p_j$中多少个位置:
如果放了两个位置,一定是$j$在$p_i$、$i$在$p_j$。如果这样会产生贡献,那么我们就用$|i-j||p_i-p_j|p(N-2,N-2)$贡献答案;
如果放了一个位置,考虑$j$在$p_i$、$i$在$p_j$两种情况的可行方案距离总和,有可能会出现$i$在$p_j$、$j$在$p_i$的情况减掉,得到可行方案距离总和$S$。我们就可以用$|i-j|Sp(N-2,N-3)$贡献答案。
如果一个位置都没有,就是总距离$\sum\limits_{i=1}^{N-1}S_i$减去上述两种方案的距离乘上$|i-j|$乘上$p(N-2,N-4)$贡献答案。

所以我们要算$p(N-2,N-2),p(N-2,N-3),p(N-2,N-4)$,直接容斥就行了。
#include<bits/stdc++.h>
using namespace std;
 
const int MOD = 998244353;
int num[1003][3] , N , T , p[1003] , jc[1003] , inv[1003] , sum1[1003] , sum2[1003];
 
int poww(long long a , int b){
    int times = 1;
    while(b){
        if(b & 1) times = times * a % MOD;
        a = a * a % MOD; b >>= 1;
    }
    return times;
}
 
int ch(int a , int b){return 1ll * jc[a] * inv[b] % MOD * inv[a - b] % MOD;}
 
int main(){
    jc[0] = 1;
    for(int i = 1 ; i <= 1000 ; ++i) jc[i] = 1ll * jc[i - 1] * i % MOD;
    inv[1000] = poww(jc[1000] , MOD - 2);
    for(int i = 999 ; i >= 0 ; --i) inv[i] = inv[i + 1] * (i + 1ll) % MOD;
    for(int i = 1 ; i <= 1000 ; ++i)
        for(int j = 0 ; j <= i && j <= 2 ; ++j){
            num[i][j] = 0;
            for(int k = 0 ; k <= i - j ; ++k)
                num[i][j] = (num[i][j] + (k & 1 ? MOD - 1ll : 1ll) * jc[i - k] % MOD * ch(i - j , k)) % MOD;
        }
    for(int i = 1 ; i <= 1000 ; ++i) sum1[i] = sum1[i - 1] + i;
    for(int i = 1 ; i <= 1000 ; ++i) sum2[i] = (sum2[i - 1] + sum1[i]) % MOD;
    for(cin >> T ; T ; --T){
        cin >> N; int sum = 0;
        for(int i = 1 ; i <= N ; ++i) cin >> p[i];
        if(N == 1){puts("0"); continue;}
        if(N == 2){printf("%d\n" , p[1] == 1 ? 1 : 0); continue;}
        for(int i = 1 ; i <= N ; ++i){
            for(int j = i + 1 ; j <= N ; ++j){
                int val = 0;
                val = (val + 1ll * num[N - 2][2] *
                       (sum2[N - 1] - (sum1[p[i] - 1] + sum1[N - p[i]]) - (sum1[p[j] - 1] + sum1[N - p[j]]) + abs(p[i] - p[j])) % MOD + MOD) % MOD;
                val = (val + 1ll * num[N - 2][1] * (sum1[N - p[i]] + sum1[p[j] - 1] - 2 * max(p[j] - p[i] , 0)) % MOD + MOD) % MOD;
                if(p[i] < p[j]) val = (val + 1ll * num[N - 2][0] * (p[j] - p[i])) % MOD;
                sum = (sum + 1ll * val * (j - i)) % MOD;
            }
        }
        cout << sum << endl;
    }
    return 0;
}

E

sol 考虑每一个点取正和取负对逆序对数量造成的影响。不难发现某个点取负可以使其子树中所有权值绝对值比它小的和它产生逆序对,而大于它的则一定由这个更大的点取正或者负来确定;它取正可以使其祖先中所有权值绝对值比它小的和它产生逆序对。

所以每个点取正取负对逆序对数量的贡献是独立的,不受其他节点的影响。

把两个的贡献一个二维数点、一个dfs的时候维护祖先权值进行计算,然后bitset优化背包就可以算出是否合法。
#include<bits/stdc++.h>
using namespace std;
 
int read(){int a; scanf("%d" , &a); return a;}
 
const int _ = 1e5 + 7;
vector < int > ch[_]; int N , ts , val[_] , lsh[_] , sum[_] , add[_][2] , dfn[_] , sz[_] , ind[_];
bitset < 30001 > now;
 
namespace BIT{
#define lowbit(x) ((x) & -(x))
    int arr[_];
    void add(int x , int n){while(x <= N){arr[x] += n; x += lowbit(x);}}
    int qry(int x){int sum = 0; while(x){sum += arr[x]; x -= lowbit(x);}return sum;}
}
 
void dfs(int x , int p){
    ind[dfn[x] = ++ts] = x; sz[x] = 1; add[x][0] = BIT::qry(val[x]); BIT::add(val[x] , 1);
    for(auto t : ch[x]) if(!sz[t]){dfs(t , x); sz[x] += sz[t];}
    BIT::add(val[x] , -1);
}
 
#define PII pair < int , int >
void calc(){
    vector < PII > qry;
    for(int i = 1 ; i <= N ; ++i){qry.push_back(PII(dfn[i] - 1 , -i)); qry.push_back(PII(dfn[i] + sz[i] - 1 , i));}
    sort(qry.begin() , qry.end()); int pos = 0;
    for(auto t : qry){
        while(pos < t.first) BIT::add(val[ind[++pos]] , 1);
        int flg = t.second < 0 ? -1 : 1 , id = abs(t.second);
        add[id][1] += flg * BIT::qry(val[id]);
    }
}
 
int main(){
    N = read(); for(int i = 1 ; i <= N ; ++i) val[i] = lsh[i] = read();
    sort(lsh + 1 , lsh + N + 1);
    for(int i = 1 ; i <= N ; ++i) val[i] = lower_bound(lsh + 1 , lsh + N + 1 , val[i]) - lsh;
    for(int i = 1 ; i < N ; ++i){
        int p = read() , q = read();
        ch[p].push_back(q); ch[q].push_back(p);
    }
    dfs(1 , 0); calc(); now[0] = 1;
     
    for(int i = 1 ; i <= N ; ++i){bitset < 30001 > p = now , q = now; p <<= add[i][0]; q <<= --add[i][1]; now = p | q;}
    for(int Q = read() ; Q ; --Q) puts(now[read()] ? "Orz" : "QAQ");
    return 0;
}

F

我怎么可能会这种题

转载于:https://www.cnblogs.com/Itst/p/11560233.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值