题目传送门

A .Yet Another Dividing into Teams

sol:原先是用比较复杂的方法来解的,后来学弟看了一眼,发现不是1就是2,当出现两个人水平相差为1就分成两组,1组全是奇数,1组全是偶数,必然符合题意。

  • 思维

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = ;
    bool vis[MAXN];
    int main() {
    int t, n, m;
    scanf("%d", &t);
    while (t--) {
    scanf("%d", &n);
    bool ok = true;
    memset(vis, false, sizeof(vis));
    for (int i = ; i <= n; i++) {
    scanf("%d", &m);
    vis[m] = true;
    if (vis[m - ] || vis[m + ]) ok = false;
    }
    if (ok) puts("");
    else puts("");
    }
    return ;
    }

B. Books Exchange

sol:很裸的并查集,i和p[i]属于同一个集合,求每个点所在集合的大小

  • 并查集

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = 2e5 + ;
    int pre[MAXN], cnt[MAXN];
    int find(int i) {
    if (pre[i] == i) return i;
    return pre[i] = find(pre[i]);
    }
    int main() {
    int t, n, m;
    scanf("%d", &t);
    while (t--) {
    scanf("%d", &n);
    for (int i = ; i <= n; i++) {
    cnt[i] = ;
    pre[i] = i;
    }
    for (int i = ; i <= n; i++) {
    scanf("%d", &m);
    int u = find(i);
    int v = find(m);
    if (u != v) {
    pre[u] = v;
    cnt[v] += cnt[u];
    }
    }
    for (int i = ; i <= n; i++)
    printf("%d ", cnt[find(i)]);
    puts("");
    }
    return ;
    }

C1. Good Numbers (easy version)

sol:由于n比较小,所以我们可以暴力罗列good number,pow(3, 10)已经大于n的最大范围10000,所以罗列到3的10次方够了,再组合一下,排序后用二分去搜就好了。

  • 暴力组合

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    int p[] = {};
    vector<int> v;
    void init() {
    for (int i = ; i <= ; i++)
    p[i] = * p[i - ];
    for (int i = ; i <= ( << ); i++) {
    int sum = ;
    for (int j = ; j <= ; j++)
    if (i & ( << j)) sum += p[j];
    v.push_back(sum);
    }
    }
    int main() {
    int t, n;
    scanf("%d", &t);
    init();
    sort(v.begin(), v.end());
    while (t--) {
    scanf("%d", &n);
    printf("%d\n", *lower_bound(v.begin(), v.end(), n));
    }
    return ;
    }

C2. Good Numbers (hard version)

sol:细看这题感觉和进制有关,把n转成3进制后找到第一个大于等于n并且所以三进制位不为2的数;

  • 进制

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    int p[];
    int main() {
    int t;
    LL n, pos;
    scanf("%d", &t);
    while (t--) {
    scanf("%lld", &n);
    memset(p, , sizeof(p));
    pos = ;
    while (n) {
    p[pos++] = n % ;
    n /= ;
    }
    int k = pos - ;
    while (k > && p[k] != ) k--; // 从高位往低位搜找到第一个2
    for (int i = k - ; i >= ; i--) p[i] = ; // 第k位加1,那么k之前的位可以全部为0了,一定不会小于n
    while (p[k] == ) { //进位
    p[k] = ;
    p[++k] ++;
    }
    pos = max(pos, k + 1LL);
    LL sum = , pp = ;
    for (int i = ; i < pos; i++) {
    if (p[i] == ) sum += pp;
    pp *= ;
    }
    printf("%lld\n", sum);
    }
    return ;
    }

D. Too Many Segments

sol:用差分确定覆盖每个点的线段有多少条,对于点i,如果覆盖的线段数量大于k,删掉覆盖该点的右端点最远的线段,可以用优先队列找这样的线段。就是需要两个排序方式。

  • 贪心,差分

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = 2e5 + ;
    struct Seg {
    int l, r;
    int index;
    friend bool operator < (Seg a, Seg b) {return a.r < b.r;}
    } a[MAXN];
    priority_queue<Seg> que;
    bool cmp(Seg a, Seg b) {return a.l < b.l;}
    vector<int> ans;
    int cnt[MAXN], pos, sum;
    int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = ; i <= n; i++) {
    scanf("%d%d", &a[i].l, &a[i].r);
    a[i].index = i;
    }
    sort(a + , a + + n, cmp);
    for (int i = ; i <= n; i++) {
    while (pos < a[i].l) sum += cnt[++pos];
    que.push(a[i]);
    sum ++, cnt[a[i].r + ] --;
    if (sum > m) {
    sum --;
    Seg s = que.top();
    que.pop();
    cnt[s.r + ] ++;
    ans.push_back(s.index);
    }
    }
    printf("%d\n", ans.size());
    for (auto index : ans) printf("%d ", index);
    return ;
    }

E. By Elevator or Stairs?

sol:dp,dp[0][i]表示从a[i]到1的最少时间,dp[1][i]表示从b[i]到1的最少时间。代码中直接把a、b数组当dp[0]和dp[1]来用了;

  • 动态规划

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = 2e5 + ;
    int a[MAXN], b[MAXN];
    int main() {
    int n, c;
    scanf("%d%d", &n, &c);
    a[] = , b[] = c;
    for (int i = ; i <= n; i++) scanf("%d", &a[i]);
    for (int i = ; i <= n; i++) scanf("%d", &b[i]);
    for (int i = ; i <= n; i++) {
    a[i] += min(a[i - ], b[i - ]);
    b[i] += min(a[i - ] + c, b[i - ]);
    printf("%d ", min(a[i], b[i]));
    }
    return ;
    }

F. Maximum Weight Subset

sol:树形dp,dp[u][dep]表示u子树中距离u最近的选取点离u的距离不小于dep的最大权重。要注意的是合并的时候两颗子树间的选取点距离也不能小于等于k;

  • 树形dp

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    const int MAXN = ;
    int w[MAXN];
    int dp[MAXN][MAXN];
    vector<int> edge[MAXN];
    int n, k;
    void dfs(int u, int fa) {
    for (auto v : edge[u]) {
    if (v == fa) continue;
    dfs(v, u);
    }
    dp[u][] = w[u];
    for (auto v : edge[u]) {
    if (v == fa) continue;
    dp[u][] += dp[v][k];
    }
    for (int dep = ; dep <= k; dep++) {
    for (auto v : edge[u]) {
    if (v == fa) continue;
    int sum = dp[v][dep - ];
    for (auto other : edge[u]) {
    if (other == fa || other == v) continue;
    sum += dp[other][max(dep - , k - dep)];
    }
    dp[u][dep] = max(dp[u][dep], sum);
    }
    }
    for (int i = k - ; i >= ; i--) dp[u][i] = max(dp[u][i], dp[u][i + ]);
    }
    int main() {
    scanf("%d%d", &n, &k);
    for (int i = ; i <= n; i++) scanf("%d", &w[i]);
    for (int i = ; i <= n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    edge[u].push_back(v);
    edge[v].push_back(u);
    }
    dfs(, -);
    printf("%d\n", dp[][]);
    return ;
    }

    官方题解里vector太多了,看的好懵逼。提交最后解释了一下为什么复杂度是O(n^3)不是O(n^4),但是我看着还是感觉复杂度是O(n^4)

——————————————————————————————————————————————————————————————

第一次把一场CF所有题都补出来,开心

CF-595的更多相关文章

  1. cf 595 补题

    1.B2   Books Exchange (hard version) 题意:有n(1~n)个孩子看书,定义一个数组,记录了每个孩子看完

  2. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  3. 基于小脚丫的ADC081S101 电压采集595数码管显示

    RTL结构图 采集模块运用SPI 通讯 MISO方式收集数据 module ad_collect(input sddata,input rst_n,output reg cs,output reg s ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  6. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  9. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  10. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

随机推荐

  1. linux中nc命令

    语法 nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s ...

  2. List、Set和Map详解及其区别和他们分别适用的场景

    Java中的集合包括三大类 它们是Set(集).List(列表)和Map(映射),它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类.Set的实现类主要有HashS ...

  3. mybatis中foreach collection的三种用法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...

  4. 2019年阿里java面试题

    一.JVM与性能优化 描述一下 JVM 加载 Class 文件的原理机制? 什么是类加载器? 类加载器有哪些? 什么是tomcat类加载机制? 类加载器双亲委派模型机制? Java 内存分配? Jav ...

  5. PES介绍(转载)

    PES: 1.1 PES介绍: PES--Packetized  Elementary Streams  (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构.PES流是ES流经 ...

  6. js判断苹果和安卓端或者wp端

    最近做了一个H5,说要提供一个底部,可以区分安卓或者ios,到相应的网址进行下载APP,如图: 代码如下:  window.onload = function () { var u = navigat ...

  7. 将hello程序作为驱动程序编译进系统内核

    0x00开始 恩,可能是我比较愚钝,一个内核编译搞了一天,各种问题,各种bug,几度无奈,也是因为我突发奇想,并没有按照原来的那种操作,我直接把helloworld程序放到内核模块中编译成了一个驱动程 ...

  8. Bezier曲线的实现——de Casteljau算法

    这学期同时上了计算机图形学和计算方法两门课,学到这部分的时候突然觉得de Casteljau递推算法特别像牛顿插值,尤其递推计算步骤很像牛顿差商表. 一开始用伯恩斯坦多项式计算Bezier曲线的时候, ...

  9. setAttribute 添加属性js_jq

    属性js setAttribute document.getElementsByName("test")[0].setAttribute("src", &quo ...

  10. Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)

    Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)