A- Villages: Landlines

题意:

在一条横轴上给定nnn个点横坐标xsx_sxs​和半径rsr_srs​,可以在横轴上任意两点连线,问连接这nnn个点形成的圆的连线最小长度为多少。

1≤n≤2∗105,−109≤xs≤109,1≤rs≤1091\le n\le 2*10^5,-10^9 \leq x_s \leq 10^9, 1\leq r_s\leq 10^91≤n≤2∗105,−109≤xs​≤109,1≤rs​≤109

思路:

等价于给了nnn个区间起点和终点,排序贪心即可。时间复杂度O(nlogn)O(nlogn)O(nlogn)

代码:

 cin >> n;for (int i = 1; i <= n; i++){int a, b;cin >> a >> b;w[i] = {a - b, a + b};}sort(w + 1, w + 1 + n);int ans = 0;int now = w[1].y;for (int i = 2; i <= n; i++){if (w[i].x > now){ans += w[i].x - now;}now = max(now, w[i].y);}cout << ans << endl;

C- Grab the Seat!

题意:

给定n∗mn*mn∗m的二维平面,有kkk个坐标点已有人。qqq次询问,每次将第pip_ipi​个坐标点的人换到(xi,yi)(x_i,y_i)(xi​,yi​),问二维平面中好位置的数量,修改永久成立。

好位置的定义:对于一个位置(xi,yi)(x_i,y_i)(xi​,yi​)满足与(0,1)(0,1)(0,1)和(0,m)(0,m)(0,m)的直线相交区间内没有人。

思路:

以(0,1)(0,1)(0,1)为例,从(0,1)(0,1)(0,1)往所有有人的坐标点发出射线,对于同一yiy_iyi​,xix_ixi​越小斜率越大,显然斜率越大的遮盖的面积越大,因此对于每一行维护到当前为止的最大斜率,根据直线公式算出向上取整的xxx。(0,m)(0,m)(0,m)做法类似,两者xxx取minminmin,则x−1x-1x−1为当前列合法的位置数。复杂度O(mq)O(mq)O(mq)

代码:

#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N = 200010, M = 2 * N, _ = 0, P = 13331;
typedef pair<int, int> pii;int k, t, q, n, m;
pii w[N];
int pos[N];//当前y x最小的位置
int ans[N];//合法位置数量void work()
{for (int i = 1; i <= m; i++)pos[i] = n + 1;for (int i = 1; i <= k; i++){auto [x, y] = w[i];pos[y] = min(pos[y], x);}int dx = 1, dy = 0;// y=(dy/dx)x+1  x=(y-1)*dx/dyfor (int i = 1; i <= m; i++){if (i == 1)ans[i] = pos[i] - 1;else{int x = pos[i], y = i;if ((y - 1) * dx >= x * dy)dx = x, dy = y - 1;ans[i] = ((i - 1) * dx + dy - 1) / dy - 1; //向上取整}}dx = 1, dy = m;// y=(dy/dx)x+m  x=(y-m)*dx/dyfor (int i = m; i >= 1; i--){if (i == m)ans[i] = min(ans[i], pos[i] - 1);else{int x = pos[i], y = i;if ((y - m) * dx <= x * dy)dx = x, dy = y - m;ans[i] = min(ans[i], ((i - m) * dx + dy + 1) / dy - 1); //向上取整,dy是负数因此dy+1}}int res = 0;for (int i = 1; i <= m; i++)res += ans[i];cout << res << endl;
}void solve()
{cin >> n >> m >> k >> q;for (int i = 1; i <= k; i++){int a, b;cin >> a >> b;w[i] = {a, b};}while (q--){int a, b, c;cin >> a >> b >> c;w[a] = {b, c};work();}
}signed main()
{ios::sync_with_stdio(false), cin.tie(nullptr);int T;// cin >> T;T = 1;while (T--){solve();}return (0 ^ _ ^ 0);
}

D- Mocha and Railgun

猜结论过的。复杂度O(1)O(1)O(1)。

代码:

 double r, x, y, d;cin >> r >> x >> y >> d;double oa = sqrt(x * x + y * y);double oe = oa - d;double boe = acos(oe / r);double of = oa + d;double cof = acos(of / r);double jj = fabs(boe - cof);cout << fixed << setprecision(12) << jj * r << endl;

G- Lexicographical Maximum

题意:

求1∼n1\sim n1∼n中字典序最大的数。1≤n≤1010000001\le n\le 10^{1000000}1≤n≤101000000

思路:

令nnn长度为lenlenlen,若str[1∼len−1]str[1\sim len-1]str[1∼len−1]全是999,则nnn即为最大数;否则len−1len-1len−1个999为最大数。复杂度O(n)O(n)O(n)。

代码:

 cin >> str + 1;n = strlen(str + 1);int f=1;for(int i=1;i<n;i++)if(str[i]!='9'){f=0;break;}if(f)for(int i=1;i<=n;i++)cout<<str[i];else for(int i=1;i<n;i++)cout<<9;cout<<endl;

H- Fly

待补。无限期鸽。


I- Chiitoitsu

题意:

给定131313张初始手牌,初始手牌不会出现超过两张相同的牌。问在最优策略下单人麻将自动摸切最终以七对子自摸胡牌的期望回合数是多少。

思路:

一回合中摸牌只有两种情况:需要/不需要。

考虑概率dpdpdp。假设当前手上还有resresres张牌没凑成对子,牌河里还有nownownow张牌。若摸到的牌是需要的,概率为res∗3now\frac{res*3}{now}nowres∗3​,没凑成对子的数量少一张,并且打出一张没凑成对子的牌,总计res−=2res-=2res−=2,牌河少一张now−=1now-=1now−=1;若摸到是不需要的,概率为now−res∗3now\frac{now-res*3}{now}nownow−res∗3​,resresres不变,牌河少一张now−=1now-=1now−=1。递归求解。有10510^5105组数据,预处理后O(1)O(1)O(1)询问。

代码:

#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N = 1000010, M = 2 * N, _ = 0, P = 13331;
typedef pair<int, int> pii;int k, t, q, n, m;
int w[N];
char str[N];
int po[200];
int dp[200][200];
int cnt;
int ans[20];
int qmi(int a, int b, int p = mod)
{int res = 1;while (b){if (b & 1)res = (ll)res * a % p;a = (ll)a * a % p;b >>= 1;}return res;
}int dfs(int res, int now) // res剩下几种牌  now牌河
{if (~dp[res][now])return dp[res][now];if (res == 1){dp[res][now] = ((res * 3) * po[now] % mod +//不需要+1因为当前回合已经自摸了(now - res * 3) * po[now] % mod * (dfs(res, now - 1) + 1) % mod) %mod;return dp[res][now];}dp[res][now] = ((res * 3) * po[now] % mod * (dfs(res - 2, now - 1) + 1) % mod+ (now - res * 3) * po[now] % mod * (dfs(res, now - 1) + 1) % mod) % mod;//dfs()+1代表多一轮return dp[res][now];
}void work(int x)
{memset(dp, -1, sizeof dp);for (int i = 0; i < 200; i++)dp[i][0] = 0;ans[x] = dfs(x, 123);
}void solve()
{cin >> str + 1;n = strlen(str + 1);map<string, int> mp;for (int i = 2; i <= n; i += 2){string tmp = "";tmp += str[i - 1];tmp += str[i];mp[tmp]++;}cnt = 0;for (auto [a, b] : mp)if (b % 2)cnt++;cout << ans[cnt] << endl;
}signed main()
{ios::sync_with_stdio(false), cin.tie(nullptr);int T;for (int i = 1; i <= 150; i++)po[i] = qmi(i, mod - 2) % mod;cin >> T;// T=1;for (int i = 0; i <= 13; i++)work(i);for (int i = 1; i <= T; i++){cout << "Case #" << i << ": ";solve();}return (0 ^ _ ^ 0);
}

J- Serval and Essay

题意:

有一张nnn个点mmm 条边的无重边无自环的有向图,初始时可以选择一个点染黑,其余点均为白点。若某个点所有入边的起点均为黑点,则该点可以被染黑。求最大化图中黑点数量。

多组数据,∑n≤2∗105,∑m≤5∗105\sum n\le2*10^5,\sum m\le 5*10^5∑n≤2∗105,∑m≤5∗105

思路:

初始每个节点属于一个集合,集合大小为111。假设当某一点成立时TTT集合内的点全部成立size(T)≥1size(T)\ge1size(T)≥1,且对于一个点vvv,其入度为111且pre[v]∈Tpre[v]\in Tpre[v]∈T,则vvv也将属于TTT集合,显然能由vvv得出的所有点也属于TTT集合,启发式合并将两个集合合并。out[i]out[i]out[i]记录集合iii中的点能到达的所有其他点。若a∈out[u]&&a∈out[v]a\in out[u]\&\&a\in out[v]a∈out[u]&&a∈out[v],则将din[a]−−din[a]--din[a]−−,当din[a]=1din[a]=1din[a]=1时,将pre[a]=upre[a]=upre[a]=u,并将其加入合并队列中,说明uuu所在集合成立时就可推出aaa;若a∉out[u]&&a∈out[v]a\notin out[u]\& \&a\in out[v]a∈/out[u]&&a∈out[v],则将aaa加入out[u]out[u]out[u]中。若干次操作后将会形成森林,取森林中sizesizesize最大值即可。时间复杂度O((n+m)log2n)O((n+m)log^2n)O((n+m)log2n)。

代码:

#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
using namespace std;
const int N = 1000010, M = 2 * N, _ = 0, P = 13331;int k, t, q, n, m;
int w[N];
set<int> out[N]; //集合的所有出边
int din[N], pre[N];
int id[N]; // i所属集合的编号
int qe[N], hh, tt;
int p[N], si[N];int find(int x)
{if (p[x] != x)p[x] = find(p[x]);return p[x];
}void init()
{for (int i = 1; i <= n; i++){out[i].clear();p[i] = i;si[i] = 1;}hh = 1, tt = 0;
}int merge(int u, int v)
{u = find(u), v = find(v);if (u == v)return id[u];int idu = id[u], idv = id[v];p[v] = u; //合并集合si[u] += si[v];if (out[idv].size() > out[idu].size()) //启发式合并swap(idu, idv);for (auto it : out[idv]) //更新集合v中能到达的所有点的入度{auto itu = out[idu].find(it);if (itu == out[idu].end())out[idu].insert(it);else{din[it]--;if (din[it] == 1){qe[++tt] = it;pre[it] = u;}}}return idu;
}void solve()
{cin >> n;init();for (int i = 1; i <= n; i++){cin >> din[i];for (int j = 1; j <= din[i]; j++){int a;cin >> a;pre[i] = a;out[a].insert(i);}if (din[i] == 1) //如果入度为1则加进合并队列,说明假设pre[i]成立,i也成立qe[++tt] = i;id[i] = i;}while (hh <= tt){int cur = qe[hh++];int pp = pre[cur];pp = find(pp);id[pp] = merge(pp, cur);}int ans = 0;for (int i = 1; i <= n; i++)ans = max(ans, si[i]);cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false), cin.tie(nullptr);int T;cin >> T;// T=1;for (int i = 1; i <= T; i++){cout << "Case #" << i << ": ";solve();}return (0 ^ _ ^ 0);
}

2022牛客多校第一场A、C、D、G、I、J相关推荐

  1. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

  2. python字符串去重及排序 牛客_2018牛客多校第一场 D.Two Graphs

    题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合 ...

  3. 2020 牛客多校第一场

    2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...

  4. 【多校训练】2021牛客多校第一场

    [前言] 组队训练的第一场比赛,感觉这场出题十分阴间,后面几个乱搞题根本不会.jpg 赛时只过了5题,rk123,学校参加5/8. A. Alice and Bob [题意] 两人博弈,每次一个人从一 ...

  5. 2018牛客多校第一场 Monotonic Matrix (LGV引理)

    链接:https://www.nowcoder.com/acm/contest/139/A 来源:牛客网 题目描述 Count the number of n x m matrices A satis ...

  6. 2022牛客多校第二场CDE

    C题 题意:nim游戏,先手赢的话,尽量赢的快,输的话尽量输的慢. 求最多的游戏局数,和先手执行的最优策略数 下面给两个结论: 1,石子数异或和为0的话,先手败,否则胜 2,先手败的话,可以构造出先后 ...

  7. [2020牛客多校第一场]Coda的题解集

    被暴打了. 会先写比赛中过题数100+的题目,其他的以后再补. 施工中,未完待续- F Infinite String Comparision 一开始想到的是对比到lcm(|a|,|b|),意料之中T ...

  8. 2019年牛客多校第一场B题 Integration 定积分 裂项相消

    题目链接: https://ac.nowcoder.com/acm/contest/881/B 题解: 转发一个大佬的博客,裂项相消,很容易看懂. https://blog.csdn.net/dill ...

  9. FFT ---- 2021牛客多校第一场 H Hash Function

    题目链接 题目大意: 解题思路: 首先我们知道任意两个数%seed\%seed%seed都不相同→\rightarrow→(aj−ai)%seed≠0(∀ai≤aj)(a_j-a_i)\%seed\n ...

最新文章

  1. SpringMVC---web.xml的配置
  2. 为什么没有MMU的处理器无法安装操作系统?
  3. matlab碎纸拼接相似函数,基于蒙特卡洛算法构建能量函数的碎纸图片拼接方法
  4. YY/T 0664—2020《医疗器械软件 软件生存周期过程》 相关
  5. 从零做网站开发:基于Flask和JQuery,实现表格管理平台
  6. cordova指定版本_Cordova/Ionic构建android Gradle错误:支持的最小Gradle版本是2.14.1。当前版本是2.13...
  7. 携程正式挂牌港交所 开盘涨近5%
  8. Jquery学习总结(2)——jQuery Ajax用法详解
  9. Forms验证中的roles(转)
  10. 【会议】2009-1-6
  11. 性能测试负载模型(十)
  12. c语言实现开方,c语言开方(c语言开平方代码)
  13. 【swarm测试极简指南】如何获得bzz奖励?0.6.2版本手动安装指南
  14. SPSS-非参数检验
  15. 新站如何解决收录问题
  16. php fpm 测试,php-fpm – 配置详解(转)
  17. Win11如何重置电脑 Win11重置电脑教程
  18. 课程设计 天气预报数据可视化开发
  19. HBA卡,HCA卡,IB卡,以太网卡,万兆网卡
  20. [HNOI2004]宠物收养所(简单理解,用set写的)

热门文章

  1. VRay 2.0 for SketchUp高级室内渲染教程荟
  2. win10+Ubantu双系统
  3. 最新传智播客P2P金融项目网络借贷平台开发
  4. 学校行政会议管理系统
  5. excel去重函数的使用方法_EXCEL 怎么用函数公式计数(Excel函数去重计数 / 去除重复项),不使用透视表...
  6. 这游戏如此吊,它的玩家知道吗-Android游戏《头脑风暴》
  7. MPU6500寄存器映射及说明
  8. 计算机软件检验 考试题,历年计算机软件水平程序员部分考试真题
  9. 读王坚博士的《在线》有感
  10. mysql 商品规格表_完成后台管理系统功能(九)商品规格列表的展示,添加以及删除...