首页 > 其他分享 >2024ccpc女生赛题解

2024ccpc女生赛题解

时间:2024-11-11 12:57:43浏览次数:3  
标签:女生 int 题解 a1 Stu a2 2024ccpc id rk

考场上写的A,C,H,L,M
下来补一下剩下的

E

注意\(p[i]<i\)这个性质
和重心关系不大,一个简单的构造,手模几个样例就能发现规律。
倒着枚举:
\(c[i]=0\)的是叶子,不用处理
\(c[i]>0\),这个点连到父亲所在连通块的根上即可。
并查集维护连通块以及连通块的根,根就是连通块中最小编号的点。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>

using namespace std;

const int N=2e5+5;
#define LL long long

int n;
int fa[N];
int find(int x) {
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
int c[N];
vector<int>p[N];
void merge(int x,int y) {
	int fx=find(x),fy=find(y);
	if(fx>fy) swap(fx,fy);//id小的做根
	fa[fy]=fx;
}
bool vis[N];
int main() {
	int T;
	scanf("%d",&T);
	while(T--) {
		scanf("%d",&n);
		for(int i=1;i<=n;i++) {
			fa[i]=i;
			vis[i]=0;
			p[i].clear();
		}
		for(int i=1;i<=n;i++) {
			scanf("%d",&c[i]);
			if(c[i]==0)
				continue;
			for(int j=1,x;j<=c[i];j++) {
				scanf("%d",&x);
				p[i].push_back(x);
			}
		}
		for(int i=n;i;i--) {
			for(int j=0;j<c[i];j++) {
				int x=find(p[i][j]);
				printf("%d %d\n",i,x);
				merge(i,x);
			}
		}
	}
	return 0;
}

K 小凯的省奖之梦

(考场上根本没读这题)
大模拟,在暴力的基础上优化即可,就是考验码力

暴力想法是,两层循环,枚举买几个p,几个q,然后去check加上这些分后是否能拿到省奖,
算一下复杂度,
check是 nlogn,但由于要多次排序,常数挺大。
\(100*100*500*log(500)*const=5e7*const\)
t飞
第一次优化,二分q。在第22个点TLE。
第二次优化,发现可以分开处理两个学期的得奖情况,\(O(100*nlogn)\)处理好第一学期的,然后存在vector里,第二学期直接在第一学期基础上做就好。

AC代码:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;

const int N = 505;
int rk[N];
int n;
struct Stu {
    int id;
    string nam;
    int a1, a2, b1, b2, c1, c2;//zhi ,de ,ti
    int sum1, sum2;
    int prize;//奖项分
} s[N];
vector<Stu> sav[101];
vector<Stu> v1;
bool cmp1(Stu x, Stu y) {
    return x.nam < y.nam;
}
char str[30];
Stu kk;
int fir, sec, thi;
int m, q, p;
void get_rk(vector<Stu> v) {
    v.push_back(kk);
    sort(v.begin(), v.end(), cmp1);
    int cnt = 0;
    for (auto x: v) {
        rk[x.id] = ++cnt;
    }
}

bool cmp2(Stu x, Stu y) {
    if (x.sum1 == y.sum1) {
        return x.a1 == y.a1 ? rk[x.id] < rk[y.id] : x.a1 > y.a1;
    } else {
        return x.sum1 > y.sum1;
    }
}

bool cmp3(Stu x, Stu y) {
    if (x.sum2 == y.sum2) {
        return x.a2 == y.a2 ? rk[x.id] < rk[y.id] : x.a2 > y.a2;
    } else {
        return x.sum2 > y.sum2;
    }
}

bool cmp4(Stu x, Stu y) {
    if (x.prize == y.prize) {
        if (x.sum1 + x.sum2 == y.sum1 + y.sum2) {
            return x.a1 + x.a2 == y.a1 + y.a2 ? rk[x.id] < rk[y.id] : x.a1 + x.a2 > y.a1 + y.a2;
        } else {
            return x.sum1 + x.sum2 > y.sum1 + y.sum2;
        }
    } else {
        return x.prize > y.prize;
    }
}

bool cmp_z1(Stu x, Stu y) {
    return x.a1 > y.a1;
}
bool cmp_z2(Stu x, Stu y) {
    return x.a2 > y.a2;
}
int rk_zhi[N];//智yu排序
int score1, score2, score3;

void sinister1(vector<Stu> &v, int add, int fir, int sec, int thi) {
    kk.a1 += add;
    kk.sum1 += add;
    v.push_back(kk);
    sort(v.begin(), v.end(), cmp_z1);
    int nowrank = 1;
    for (int i = 0; i < n; i++, nowrank++) {
        if (i > 0 && v[i].a1 == v[i - 1].a1) {
            rk_zhi[v[i].id] = rk_zhi[v[i - 1].id];
        } else
            rk_zhi[v[i].id] = nowrank;
    }
    sort(v.begin(), v.end(), cmp2);
    nowrank = 0;
    for (auto &it: v) {
        nowrank++;
        it.prize = 0;
        if (fir && rk_zhi[it.id] <= score1) {
            it.prize += 15;
            fir--;
            continue;
        }
        if (sec && rk_zhi[it.id] <= score2) {
            it.prize += 10;
            sec--;
            continue;
        }
        if (thi && rk_zhi[it.id] <= score3) {
            it.prize += 5;
            thi--;
            continue;
        }
    }
    kk.a1 -= add;
    kk.sum1 -= add;
}
//拷贝
bool check(vector<Stu> v, int add, int fir, int sec, int thi) {
    for (int i = 0; i < n; i++) {
        if (kk.id == v[i].id) {
            v[i].a2 += add;
            v[i].sum2 += add;
            break;
        }
    }
    sort(v.begin(), v.end(), cmp_z2);
    int nowrank = 1;
    for (int i = 0; i < n; i++, nowrank++) {
        if (i > 0 && v[i].a2 == v[i - 1].a2) {
            rk_zhi[v[i].id] = rk_zhi[v[i - 1].id];
        } else
            rk_zhi[v[i].id] = nowrank;
    }

    sort(v.begin(), v.end(), cmp3);
    nowrank = 0;
    for (auto &it: v) {
        nowrank++;
        if (fir && rk_zhi[it.id] <= score1) {
            it.prize += 15;
            fir--;
            continue;
        }
        if (sec && rk_zhi[it.id] <= score2) {
            it.prize += 10;
            sec--;
            continue;
        }
        if (thi && rk_zhi[it.id] <= score3) {
            it.prize += 5;
            thi--;
            continue;
        }
    }

    sort(v.begin(), v.end(), cmp4);

    bool ok = 0;
    nowrank = 0;
    for (auto &it: v) {
        nowrank++;
        if (it.id == kk.id) {
            if (nowrank <= m) ok = 1;
            break;
        }
    }

    return ok;
}
int main() {
    scanf("%d", &n);
    kk.nam = "crazyzhk";
    for (int i = 1; i <= n; i++) {
        scanf("%s %d %d %d %d %d %d", str, &s[i].a1, &s[i].b1, &s[i].c1, &s[i].a2, &s[i].b2, &s[i].c2);
        s[i].nam = str;
        s[i].id = i;
        s[i].sum1 = s[i].a1 + s[i].b1 + s[i].c1;
        s[i].sum2 = s[i].a2 + s[i].b2 + s[i].c2;
        if (s[i].nam == kk.nam) {
            kk.a1 = s[i].a1;
            kk.a2 = s[i].a2;
            kk.b1 = s[i].b1;
            kk.b2 = s[i].b2;
            kk.c1 = s[i].c1;
            kk.c2 = s[i].c2;
            kk.id = i;
            kk.sum1 = s[i].sum1;
            kk.sum2 = s[i].sum2;
        } else {
            v1.push_back(s[i]);
        }
    }
    get_rk(v1);

    fir = floor(0.15 * (double) n);
    sec = floor(0.25 * (double) n);
    thi = floor(0.35 * (double) n);
    score1 = floor(0.25 * (double) n);
    score2 = floor(0.45 * (double) n);
    score3 = floor(0.75 * (double) n);
    bool flg = 0;
    int ans = 1e8;
    scanf("%d %d %d", &m, &p, &q);
    for (int i = 0; i + kk.a1 <= 100; i++) {
        sav[i] = v1;
        sinister1(sav[i], i, fir, sec, thi);
        int L = 0, R = 100 - kk.a2;
        while (L <= R) {
            int mid = (L + R) >> 1;
            if (check(sav[i], mid, fir, sec, thi)) {
                flg = 1;
                ans = min(ans, i * p + mid * q);
                R = mid - 1;
            } else {
                L = mid + 1;
            }
        }
    }
    if (flg) {
        printf("%d", ans);
    } else {
        puts("Surely next time");
    }
    return 0;
}

标签:女生,int,题解,a1,Stu,a2,2024ccpc,id,rk
From: https://www.cnblogs.com/AuroraKelsey/p/18539458

相关文章

  • 题解:P11250 [GESP202409 八级] 手套配对
    题目传送门思路讲解一道非常经典的排列组合的题。首先,我们要先从nnn对手套中取走kk......
  • MySQL问题解决记录(1):IP address 'xxx.xxx.xxx.xxx' could not be resolved: 这是在主机
    目录问题描述排查流程解决方案总结问题描述[Warning][MY-010055][Server]IPaddress'xxx.xxx.xxx.xxx'couldnotberesolved:这是在主机名解析时通常出现的暂时错误,它意味着本地服务器没有从权威服务器上收到响应。问题表现:A主机的服务在访问B主机的MySQL数据库时,产......
  • Jmeter并发线程场景下共享变量错乱问题解决
    问题复现问题描述使用IF控制器获取前一个请求的后置脚本中设置的全局变量->并发线程下通过vars.get获取变量时,第一个线程和第二个线程获取的变量值一样->导致不同基础数据的请求入参一样方法如下:vars.put("shoppingCartIdList",shoppingCartIdList.toString());/......
  • CF1974题解
    闲话1974年第一次在东南亚打自由搏击就取得了冠军······CF1974A简单计数题点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intt;signedmain(){ scanf("%lld",&t); while(t--){ intx,y,ans=0,num=0; scanf("%lld%lld",&x,......
  • [CodeForces] CF1978 题解
    A.AliceandBooksLink-CFLink-Luogu【题目大意】\(n\)本书,编号为\(1\)到\(n\),价值为\(a_1\)到\(a_n\)。将这些书分成两堆,你获得每堆编号最大的书的价值。求可以获得的最大的价值。【解题思路】无论怎样,编号为\(n\)的书不管在那一堆都是编号最大的,所以一定会有它......
  • luogu-P3262题解
    简要题意有一棵不超过十层的满二叉树,需要对每个节点进行染色。每个叶子节点会对其颜色相同的祖先节点产生贡献且黑白贡献不同。求最大贡献。题解首先我会暴力!我如果直接暴力枚举每个节点的颜色,复杂度就是\(O(2^{2^n})\)。然后还要算贡献,所以还有一个\(O(2^{n-1}(n-1))\)。然......
  • CF 1365 题解
    CF1365题解APrimeSubtraction任何数的因数中都会有质数,除非他是\(1\).因此原题不合法当且仅当\(b-a=1\).BKill'EmAll首先,答案有明确的下界:最右面的怪兽一定要处理.不断模拟去杀掉当前最靠右的怪兽,得到的答案就是答案的下界.是否能取到下界呢?答案是肯定......
  • CF622E Ants in leaves 题解
    传送门给定一棵\(n\)个节点的树,根节点是\(1\)。这棵树的每一个叶节点都有一只小蚂蚁。每过\(1\)秒钟,可以选择让一些蚂蚁向父节点走一步。注意,两只蚂蚁不能同时在一个除去根节点的节点上。问这些蚂蚁最少用多少秒的时间,使得所有蚂蚁都走到根节点。根结点的各个子树独立,因......
  • ABC372D ABC379F 题解 单调栈二分
    ABC372DABC379F题解单调栈二分一直觉得AT上面学到的东西比CF要多一些,无意捧一踩一,但可能是我太菜的原因,毕竟ABC的题目普遍要比Div.2简单一些。好多次碰到这个单调栈里面二分的trick了,所以写一篇来总结一下。ABC372D形象地给定一系列Buildings的高度\(h\),保证每个......
  • P2123 皇后游戏 / [USACO12JAN] Mountain Climbing S / P1248 加工生产调度 题解
    P2123皇后游戏/[USACO12JAN]MountainClimbingS/P1248加工生产调度先来看P2123。我们把这个特别重要的公式打出来:\[c_{i}=\begin{cases}a_{1}+b_{1}&,i=1\\\displaystyle\max\left\{c_{i-1},\sum_{j=1}^{i}a_{j}\right\}+b_{i}&,2\leqi\leqn\end{......