当前位置:网站首页>2022 Niu Ke Summer Multi-School Training Camp 5 (BCDFGHK)
2022 Niu Ke Summer Multi-School Training Camp 5 (BCDFGHK)
2022-08-04 23:49:00 【Tan_Yuu】
题集链接;
目录:
B Watches
二分
题意
Watch shop has n Watch for sale,第 i Watch for a i a_i ai .若购买 k 个手表,那么第 i Watches cost a i + k i a_i+ki ai+ki 元.现有 m 元,O can buy up to how many watch;
思路
We consider that each watch costs related to the total purchase,Is not convenient to direct greedy processing,We choose binary out k 后,According to the actual cost for sorting and greedy;
代码
Teammates as follows
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
cin.tie(0) -> sync_with_stdio(false);
int n, m;
cin >> n >> m;
vector<long long> a(n);
for (auto& x : a) cin >> x;
auto solve = [&](int k) -> bool {
vector<long long> b(a);
for (int i = 0; i < n; i++) {
b[i] += 1ll * (i + 1) * k;
}
sort(b.begin(), b.end());
long long sum = 0;
for (int i = 0; i < k; i++) {
sum += b[i];
}
return sum <= m;
};
int l = 0, r = n;
int ans = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (solve(mid)) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
cout << ans << '\n';
}
C Bit Transmission
题意
Robot has a length of n 的字符串,Now ask the robot 3n Whether one is 1 ,But in all ask,Most robots will return an error.For a robot to answer,If there is a unique string of the output,否则返回 -1 ;
思路
First to exclude some obvious without the only answer,Such as the one without being asked;
Due to the unknown whether there is wrong,We need to first positioning error,To one asked more than twice a,If the results appear in a different,You can conclude that errors occur in here;
If can't positioning error,In addition to all who are being questioned more than twice and answer the same outside,The rest of the case are not only the original string;
代码
Teammates as follows
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
vector a(n, pair<int, int>(0, 0));
for (int i = 0; i < n * 3; i++)
{
int x;
string s;
cin >> x >> s;
if (s[0] == 'Y')
{
a[x].second++;
}
else
{
a[x].first++;
}
}
bool f = true;
for (int i = 0; i < n; i++)
{
if (a[i].first + a[i].second == 0)//No asked
{
f = false;
break;
}
}
int cnt = 0;
if (f)
{
for (int i = 0; i < n; i++)
{
if (a[i].first + a[i].second > 2)
{
if (a[i].first == 1 || a[i].second == 1)//错误发生
{
cnt++;
}
else if (a[i].first != 0 && a[i].second != 0)//At least two same mistake
{
f = false;
break;
}
if (cnt == 2)//多个错误
{
f = false;
break;
}
}
}
}
if (f)
{
if (cnt == 0)//If can't positioning error
{
for (int i = 0; i < n; i++)
{
if (a[i].first == 1 || a[i].second == 1)//Unable to determine the result authenticity
{
f = false;
break;
}
}
}
for (int i = 0; i < n; i++)
{
if (a[i].first == 1 && a[i].second == 1)//若出现11
{
f = false;
break;
}
}
}
if (f)
{
for (int i = 0; i < n; i++)
{
if (a[i].first > a[i].second)
{
cout << 0;
}
else
cout << 1;
}
}
else
{
cout << -1;
}
cout << '\n';
}
return 0;
}
D Birds in the tree
树状DP
题意
给出一个 n 个节点的树,每个节点有颜色 0 或 1 ,Its how many connected subgraph,Meet the degree of 1 The nodes of the same color;
思路
构造状态表示: d p [ i ] [ j ] dp[i][j] dp[i][j] 为以节点 i 为根的子树中,How many connected subgraph,度数为 1 的节点(若 i Is not the only one not consider i )颜色为 j;
推导状态转移方程:
d p [ i ] [ j ] = ∏ k ∈ s o n i ( 1 + d p [ k ] [ j ] ) − [ c o l [ i ] ! = j ] dp[i][j]=\prod_{k\in son_i}(1+dp[k][j])-[col[i]!=j] dp[i][j]=k∈soni∏(1+dp[k][j])−[col[i]!=j]
The previous LianCheng type obviously for counting multiplication principle,对于每一个子节点k,有 d p [ k ] [ j ] dp[k][j] dp[k][j] 种选择,Can not choose the child node;
For the back of the reduction,则表示若 i Node color and target different,You will need to remove only choice i 一个点的情况;
答案即为
∑ i d p [ i ] [ 1 ] + d p [ i ] [ 0 ] − ( ∑ k ∈ s o n i d p [ k ] [ ! c o l [ n ] ] ) \sum_idp[i][1]+dp[i][0]-(\sum_{k\in son_i}dp[k][!col[n]]) i∑dp[i][1]+dp[i][0]−(k∈soni∑dp[k][!col[n]])
At the back of the subtraction is minus i 为根节点,And select only a subtree of,Here is not in conformity with the question;
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M = 1e9 + 7;
vector<int> rod[300005];
ll col[300005];
ll dp[300005][2];
ll ans;
void dfs(int x, int f)
{
ll tmp1 = 1, tmp0 = 1, sum = 0;
for (auto y : rod[x])
{
if (y == f)
continue;
dfs(y, x);
sum += (dp[y][col[x] ^ 1]);
sum %= M;
tmp1 *= (1 + dp[y][1]) % M;
tmp1 %= M;
tmp0 *= (1 + dp[y][0]) % M;
tmp0 %= M;
}
dp[x][1] = tmp1 - (col[x] != 1) + M;
dp[x][0] = tmp0 - (col[x] != 0) + M;
dp[x][1] %= M;
dp[x][0] %= M;
ans += dp[x][1] + dp[x][0] - sum + M;
ans %= M;
}
int main()
{
int n;
while (cin >> n)
{
for (int i = 1; i <= n; i++)
rod[i].clear();
ans = 0;
string g;
cin >> g;
for (int i = 0; i < n; i++)
{
col[i + 1] = g[i] - '0';
}
for (int i = 1; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
rod[u].push_back(v);
rod[v].push_back(u);
}
dfs(1, 0);
cout << ans << endl;
}
}
F A Stack of CDs
计算几何
题意
洛谷原题,Changing the input sequence and output digits can be
思路
For the amount of data,We can for each dish for the covered range,And interval and calculate the covered general;
Pay attention to the plate to be upper containing;
Accumulative surplus length each dish is the answer;
代码
#include <bits/stdc++.h>
using namespace std;
#define double long double
const double eps = 1e-16;
const double PI = acos(-1.0);
int sign(double x) // 符号函数
{
if (fabs(x) < eps)
return 0;
if (x < 0)
return -1;
return 1;
}
struct Point
{
double x, y;
Point(double a = 0, double b = 0) {
x = a, y = b; }
Point operator+(const Point &a) const {
return Point(x + a.x, y + a.y); }
Point operator-(const Point &a) const {
return Point(x - a.x, y - a.y); }
Point operator*(const double &a) const {
return Point(x * a, y * a); }
Point operator/(const double &a) const {
return Point(x / a, y / a); }
bool operator==(const Point &a) const {
return !sign(x - a.x) && !sign(y - a.y); }
bool operator<(const Point &a) const {
return (fabs(x - a.x) < eps) ? (y < a.y) : (x < a.x); }
};
struct Line
{
Point a, v;
Line(Point x = Point(), Point y = Point()) {
a = x, v = y; }
};
struct Circle
{
Point o;
double r;
Circle(Point x = Point(), double y = 0) {
o = x, r = y; }
};
double dot(Point a, Point b) {
return a.x * b.x + a.y * b.y; }
double cross(Point a, Point b) {
return a.x * b.y - b.x * a.y; }
double get_length(Point a) {
return sqrt(dot(a, a)); }
Point get_line_intersection(Line m, Line n)
{
Point u = m.a - n.a;
if (sign(cross(m.v, n.v)) == 0)
return Point(0, 0);
double t = cross(n.v, u) / cross(m.v, n.v);
return m.a + m.v * t;
}
double distance_to_line(Point p, Line m) {
return fabs(cross(p - m.a, m.v) / get_length(m.v)); }
pair<Point, Point> line_circle_intersection(Line l, Circle c)
{
Point h = get_line_intersection(l, Line(c.o, Point(-l.v.y, l.v.x)));
if (sign(distance_to_line(h, l) - c.r) > 0)
return {
Point(), Point()};
Point e = l.v / get_length(l.v);
double k =
sqrt(c.r * c.r - fabs(cross(c.o - l.a, l.v)) * fabs(cross(c.o - l.a, l.v)) / dot(l.v, l.v));
return {
h - e * k, h + e * k};
}
Circle ccl[1003];
int n;
int circle_relation(Circle p, Circle q)
{
double d = get_length(p.o - q.o), l = fabs(p.r - q.r);
if (sign(d - p.r - q.r) > 0)
return 5;
else if (sign(d - p.r - q.r) == 0)
return 4;
else if (sign(d - l) > 0)
return 3;
else if (sign(d - l) == 0)
return 2;
else
return 1;
}
pair<Point, Point> circle_circle_intersection(Circle a, Circle b)
{
double d = get_length(a.o - b.o);
double d1 = a.r * (a.r * a.r + d * d - b.r * b.r) / (2 * a.r * d);
double h1 = sqrt(a.r * a.r - d1 * d1);
Point ed = b.o - a.o;
Point h = a.o + ed / get_length(ed) * d1;
return {
h + Point(ed.y, -ed.x) / get_length(ed) * h1,
h - Point(ed.y, -ed.x) / get_length(ed) * h1};
}
double get_angle(Point a, Point b) {
return acos(dot(a, b) / get_length(a) / get_length(b)); }
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
scanf("%Lf%Lf%Lf", &ccl[i].o.x, &ccl[i].o.y, &ccl[i].r);
}
vector<pair<double, double>> lim;
double ans = 0;
for (int i = 0; i < n; i++)
{
lim.clear();
double ers = 0;
bool zero = 0;
for (int j = i + 1; j < n; j++)
{
int tmp = circle_relation(ccl[i], ccl[j]);
if (tmp == 1 && ccl[i].r < ccl[j].r)
{
zero = 1;
break;
}
else if (tmp == 3)
{
auto pii = circle_circle_intersection(ccl[i], ccl[j]);
Point to = ccl[j].o - ccl[i].o;
pair<double, double> deg = {
atan2((pii.first - ccl[i].o).y, (pii.first - ccl[i].o).x),
atan2((pii.second - ccl[i].o).y, (pii.second - ccl[i].o).x)};
if (deg.first > deg.second)
{
swap(deg.first, deg.second);
}
if (sign(fabs(deg.first - atan2(to.y, to.x)) - PI) >= 0 ||
sign(fabs(deg.second - atan2(to.y, to.x)) - PI) >= 0)
{
lim.push_back({
deg.second, PI});
lim.push_back({
-PI, deg.first});
}
else
{
lim.push_back(deg);
}
}
}
if (zero)
continue;
if (lim.empty())
{
ers = 0;
}
else
{
sort(lim.begin(), lim.end());
double st = lim[0].first, ed = lim[0].second;
for (int i = 1; i < lim.size(); i++)
{
if (sign(lim[i].first - ed) <= 0)
{
ed = max(lim[i].second, ed);
}
else
{
ers += ed - st;
st = lim[i].first, ed = lim[i].second;
}
}
ers += ed - st;
}
ans += (2 * PI - ers) * ccl[i].r;
// printf("*%Lf %Lf %d\n", ers, ans, lim.size());
}
printf("%.10Lf", ans);
}
G KFC Crazy Thursday
Manacher(马拉车算法)
题意
给定长度为 n 的小写字母串,Respectively for how much k , f, c At the end of the text string back;
思路
As a cart is each character as the center of the longest palindrome string,We only need to be enumerated to some point as the center,All string of radius less than or equal to that point the longest palindrome palindrome string,Determine whether conform to the conditions and counting can be;
The original also worryT,Can actually be a~
代码
#include <bits/stdc++.h>
using namespace std;
const int M = 998244353;
const int maxn = 5e5 + 5;
char s[maxn * 2], str[maxn * 2];
int d[maxn * 2], len;
void getstr()
{
//重定义字符串
int k = 0;
str[k++] = '@'; //开头加个特殊字符防止越界
for (int i = 0; i < len; i++)
{
str[k++] = '#';
str[k++] = s[i];
}
str[k++] = '#';
len = k;
str[k] = 0; //字符串尾设置为0,防止越界
}
int k, f, c;
int manacher()
{
int mx = 0, id; // mx为最右边,id为中心点
int maxx = 0;
for (int i = 0; i < len; i++)
{
if (i < mx)
d[i] = min(mx - i + 1, d[2 * id - i]);
else
d[i] = 1;
while (str[i + d[i]] == str[i - d[i]])
d[i]++;
if (d[i] + i - 1 > mx)
{
mx = d[i] + i - 1;
id = i;
maxx = max(maxx, d[i]);
}
}
return (maxx - 1);
}
int main()
{
while (cin >> len)
{
scanf("%s", &s);
getstr();
memset(d, 0, sizeof d);
manacher();
k = f = c = 0;
for (int i = 1; i < len; i++)
{
for (int j = 1; j <= d[i]; j++)
{
if (str[i - j + 1] == 'k')
k++;
if (str[i - j + 1] == 'f')
f++;
if (str[i - j + 1] == 'c')
c++;
}
}
printf("%d %d %d\n", k, f, c);
}
}
H Cutting Papers
计算几何
题意
给定图形 ∣ x ∣ + ∣ y ∣ + ∣ x + y ∣ ⩽ n |x|+|y|+|x+y|\leqslant n ∣x∣+∣y∣+∣x+y∣⩽n 和 x 2 + y 2 ⩽ n 2 / 4 x^2+y^2\leqslant n^2/4 x2+y2⩽n2/4 Beg the area;
思路
经过matplotlib绘制,Found that the former shape as follows:

Can directly show area~
代码
Teammates as follows
#include <cmath>
#include <iostream>
using namespace std;
const double PI = acos(-1);
int main() {
double n;
cin >> n;
double r = n / 2;
printf("%.8f\n" , r * r * PI / 2 + 2 * r * r);
}
K Headphones
题意
现有 n-k The headset,Randomly pick a(不是一对),How many times at least take headphones can make hand logarithmic greater thank;
思路
如果存在解,先考虑最坏情况:
If take out n-k A headset is not right,You will need to get k+1 To meet the question;
The need to take at least n+1 个;
代码
#include <bits/stdc++.h>
using namespace std;
const int M = 998244353;
int main() {
long long n,k;
while(cin>>n>>k)
{
if(n-k>=k+1)printf("%lld\n",n+1);
else printf("-1\n");
}
}
ed
The difficulty of the gradient is a bit strange
边栏推荐
猜你喜欢

MySQL增删改查基础

Ab3d.PowerToys and Ab3d.DXEngine Crack

~ hand AHB - APB Bridge 】 【 AMBA AHB bus

美团二面:Redis与MySQL双写一致性如何保证?

NebulaGraph v3.2.0 Release Note, many optimizations such as the performance of querying the shortest path

Implementing class target method exception using proxy object execution

Ab3d.PowerToys and Ab3d.DXEngine Crack

How to burn the KT148A voice chip into the chip through the serial port and the tools on the computer

【软件测试】常用ADB命令

为何越来越多人选择进入软件测试行业?深度剖析软件测试的优势...
随机推荐
Shell expect real cases
【无标题】线程三连鞭之“线程池”
4 - "PyTorch Deep Learning Practice" - Backpropagation
生产者消费者问题
一点点读懂regulator(四)
怎么将自己新文章自动推送给自己的粉丝(巨简单,学不会来打我)
uniapp动态实现滑动导航效果demo(整理)
NebulaGraph v3.2.0 Release Note,对查询最短路径的性能等多处优化
DNS常见资源记录类型详解
上课笔记(6)(2)——#742. 周末舞会
Security software Avast and Symantec NortonLifeLock merge with UK approval, market value soars 43%
uniapp横向选项卡(水平滚动导航栏)效果demo(整理)
七牛云图片上传
2022年华数杯数学建模
学会反射后,我被录取了(干货)
游戏3D建模入门,有哪些建模软件可以选择?
一点点读懂Thremal(二)
加解密在线工具和进制转化在线工具
容联云发送短信验证码
KT148A电子语音芯片ic方案适用的场景以及常见产品类型