写在前面

安徽CSP取消了……

去年CSP考炸的我本来想今年一雪前耻(bushi),结果……

T1

第一题大毒瘤!

首先观察数据可以分类如下两种情况:

  1. \(a = 1\)

    直接输出\(1\),return 0
  2. \(a \le 2\)

    模拟乘方,由于不能超过\(10^9\),开long long模拟就可以过。

\(Code:\)

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
long long a, b, ans = 1;
int main()
{
freopen("pow.in","r",stdin);
freopen("pow.out","w",stdout);
cin >> a >> b;
if(a == 1) {
cout << 1;
return 0;
}
for (int i = 1; i <= b; i++) {
ans *= a;
if(ans > 1000000000) {
cout << -1;
return 0;
}
}
cout << ans;
}

T2

去年T2是大模拟题,但是我炸了……

在家写代码的时候就谨慎得多。

分析题面可知\(e \times d = pq - p - q + 2\)

\(\therefore m = n - e \times d + 2 = p + q\)

\(\therefore n = p(m - p) = mp - p^2\)

\(\therefore p^2 - mp + n = 0\)

\(\because p \leq q\)

\(\therefore p = \frac{m-\sqrt{m^2-4\times n}}{2}\)

这也就是说,这道题变成了裸的解方程!

求整数解需要有如下条件

  1. \(m^2 - 4 \times n\)是完全平方数
  2. \(m-\sqrt{m^2 - 4 \times n}\)是偶数

\(Code:\)

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
int k;
long long n, e, d, m;
int main()
{
freopen("decode.in","r",stdin);
freopen("decode.out","w",stdout);
scanf("%d", &k);
while (k--) {
scanf("%lld%lld%lld",&n, &e, &d);
m = n - e * d + 2;
long long sqr = sqrt(m * m - 4 * n);
if(sqr * sqr != m * m - 4 * n) {
printf("NO\n");
continue;
}
if((m - sqr) % 2 == 1) {
printf("NO\n");
continue;
}
long long p = (m - sqr) / 2 , q = (m + sqr) / 2;
printf("%lld %lld\n", p, q);
}
}

T3

前置知识1:栈

oiwiki

前置知识2:表达式求值——中缀表达式

我们需要一个数值栈d以及符号栈op

从左向右扫描表达式字符串(以本题的逻辑运算为例)

当扫到数字01时,直接加入数值栈。

当扫到符号时,分为一下三种情况:

  1. (

直接入符号栈

  1. 不是括号

如果符号栈非空且符号栈栈顶的优先级大于当前符号优先级,则进行calc运算;

否则把当前符号入栈。

  1. )

如果符号栈栈顶不是(,则进行calc运算,知道栈顶是(为止,并将(弹出。

calc运算步骤如下

定义ch是符号栈栈顶符号,符号栈pop

定义y是数值栈栈顶符号,数值栈pop

定义x是数值栈栈顶符号,数值栈pop

xy执行ch操作,并将结果压进数值栈。

扫描结束后,如果符号栈非空,则进行calc操作至符号栈为空为止。

\(Code:\)

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
string expr;//表达式
stack<int>d;//数值栈
stack<char>op;//符号栈
int level(char ch) { //判断符号优先级
if(ch == '&') return 2;
else if(ch == '|') return 1;
else return 0; //括号优先级最低
}
void calc() { //calc操作
int y = d.top(); d.pop();
int x = d.top(); d.pop();
char ch = op.top(); op.pop();
if(ch == '&') d.push(x & y);
else d.push(x | y);
}
int main()
{
cin >> expr;
for (int i = 0; i < expr.size(); i++) { //从左往右扫描表达式
if (expr[i] == 0 || expr[i] == 1) {
d.push(expr[i] - '0');//压入数值栈
}
else if (expr[i] == '(') op.push('(');//直接压入
else if (expr[i] != ')'){
while(!op.empty() && level(op.top()) >= level(expr[i])) calc();//运算优先级高的表达式
op.push(expr[i]);
}
else {
while(op.top() != '(') calc();//处理括号
op.pop();
}
}
while(!op.empty()) calc();//处理剩余表达式
cout << d.top();
}

前置知识3:表达树

表达式1&0|0&(0|1)的表达树如下:

     |
/ \
/ \
/ \
& |
/ \ / \
/ \ / \
1 0 0 |
/ \
/ \
0 1

我们可以看到,最早运算的运算符深度越深,且如果一个符号左边先算的式子就是该符号的左子树,右边先算的式子就是该符号的右子树,数字没有子节点。

建树过程与表达式求值类似。

\(Code:\)

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N = 1E6 + 5;
string expr;
stack<int>d, op;
int num(char ch){
if(ch == '&') return 3;
else if(ch == '|') return 2;
else if(ch == '1') return 1;
else if(ch == '0') return 0;
}
void build() {
int y = d.top();d.pop();
int x = d.top();d.pop();
int ch = op.top();op.pop();
l[ch] = x, r[ch] = y;
d.push(ch);
}
int main()
{
cin >> expr;
for (int i = 0; i < expr.size(); i++) {
dat[i + 1] = num(expr[i]);
if(expr[i] == '0' || expr[i] == '1') {
d.push(i + 1);
}
else if(expr[i] == '(') op.push(-1);
else if(expr[i] != ')'){
while(!op.empty() && dat[op.top()] >= dat[i + 1]) build();
op.push(i + 1);
}
else {
while(op.top() != -1) build();
op.pop();
}
}
while(!op.empty()) build();
}

回归本题

本题最后就是在表达树上进行\(dfs\),当左节点的表达式的值可以“垄断”右边表达式的值时,右边的就不需要进行“垄断”操作的计算。

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N = 1E6 + 5;
int l[N], r[N], dat[N], root;
int And, Or;
bool vis[N];
string expr;
stack<int>d, op;
int num(char ch){
if(ch == '&') return 3;
else if(ch == '|') return 2;
else if(ch == '1') return 1;
else if(ch == '0') return 0;
return -1;
}
void build() {
int y = d.top();d.pop();
int x = d.top();d.pop();
int ch = op.top();op.pop();
l[ch] = x, r[ch] = y;
d.push(ch);
}
int dfs(int u, int &And, int &Or) {
if(dat[u] < 2) return dat[u];
int L = dfs(l[u], And, Or);
if(dat[u] == 3 && L == 0) {
And += 1;
return 0;
}
else if(dat[u] == 2 && L == 1) {
Or += 1;
return 1;
}
int R = dfs(r[u], And, Or);
if(dat[u] == 3) return L & R;
else return L | R;
}
int main()
{
freopen("expr.in","r",stdin);
freopen("expr.out","w",stdout);
cin >> expr;
for (int i = 0; i < expr.size(); i++) {
dat[i + 1] = num(expr[i]);
if(expr[i] == '0' || expr[i] == '1') {
d.push(i + 1);
}
else if(expr[i] == '(') op.push(-1);
else if(expr[i] != ')'){
while(!op.empty() && dat[op.top()] >= dat[i + 1]) build();
op.push(i + 1);
}
else {
while(op.top() != -1) build();
op.pop();
}
}
while(!op.empty()) build();
root = d.top();
for (int i = 1; i <= expr.size(); i++) {
vis[l[i]] = vis[r[i]] = 1;
if(!l[i] && !r[i]) vis[i] = 1;
}
cout << dfs(root, And, Or) <<'\n';
cout << And << ' ' << Or;
}

T4

很明显,是\(dp\)。

首先按\(x_i\)为第一关键字,\(y_i\)为第二关键字从小到大排序。

接下来我们定义状态\(dp_{i,j}\),表示前\(i\)添加\(j\)个点后,最多能连接起多少个点,不包括后来添加的\(k\)个点。

则\(\max\{dp_{i,j}\}+k\)即为最大值,因为一定可以取完\(k\)个点。

状态转移方程:\(dp_{i,j} = \max\limits_{1\leq l \leq i}\{dp_{l,j-(x_i+y_i-x_l-y_l-1)}\}+1\)

\(Code:\)

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
int n, k, dp[505][105], ans;
struct Pos{
int x, y;
}a[505];
bool cmp(const Pos& u, const Pos& v) {
return u.x < v.x || u.x == v.x && u.y < v.y;
}
int main()
{
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y;
}
stable_sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) dp[i][j] = 1;
for (int j = 1; j < i; j++) {
if(a[j].y > a[i].y) continue;
int s = a[i].x + a[i].y - a[j].x - a[j].y - 1;
for(int l = s; l <= k; l++) {
dp[i][l] = max(dp[i][l], dp[j][l - s] + 1);
}
}
ans = max(ans, dp[i][k]);
}
cout << ans + k;
}

2022CSP-J线上游记的更多相关文章

  1. 线上Linux服务器运维安全策略经验分享

    线上Linux服务器运维安全策略经验分享 https://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=402022683&idx=1&a ...

  2. 使用tcpcopy导入线上流量进行功能和压力测试

    - 假设我们要上线一个两年内不会宕机的先进架构.在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试. 但这些步骤非生产环境下正式用户的行为.或许你会想到灰度上线,但毕竟 ...

  3. 记一次线上coredump事故

    1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发生在业务低峰期,而且该模块提供的功能也不是核心流程功能,所以对线上业务影响比较小.发生coredump后,运维收到 ...

  4. 转载:MySQL:亲测备份策略实例(线上真实备份案例)

    是否为线上库的备份而烦恼过,这里提供一个完整的备份从属数据库的备份方案,亲测可用 说明: 备份从库,按周计,每周进行一次全备 每周一的早上六点进行全备,其他时间备份中继日志 在从库上启用rsync服务 ...

  5. JVM jmap dump 分析dump文件 / 如何使用Eclipse MemoryAnalyzer MAT 排查线上问题

    jhat简介 jhat用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言 这个工具并不是想用于应用系统中而是用于"离线" ...

  6. 如何解析本地和线上XML文件获取相应的内容

    一.使用Dom解析本地XML 1.本地XML文件为:test.xml <?xml version="1.0" encoding="UTF-8"?> ...

  7. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  8. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 F题 Clever King(最小割)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  9. “玲珑杯”线上赛 Round #17 河南专场

    闲来无事呆在寝室打打题,没有想到还有中奖这种操作,超开心的 玲珑杯”线上赛 Round #17 河南专场 Start Time:2017-06-24 12:00:00 End Time:2017-06 ...

  10. DBAplus社群线上分享----Sharding-Sphere之Proxy初探

    功能 Cobar Mycat Heisenberg Shark TDDL Sharding-JDBC 是否开源 开源 开源 开源 开源 部分开源 开源 架构模型 Proxy架构 Proxy架构 Pro ...

随机推荐

  1. 绝杀processOn,这款UML画图神器,阿里字节都用疯了,你还不知道?

    大家好,我是陶朱公Boy,又和大家见面了. 前言 在文章开始前,想先问大家一个问题,大家平时在项目需求评审完后,是直接开始编码了呢?还是会先写详细设计文档,后再开始进行编码开发? ☆现实 这个时候可能 ...

  2. 【Chrome浏览器】关闭触摸板双指滑动进行前进后退的功能

    痛点 Chrome浏览器使用过程中,当前页面经常会莫名其妙地退回到上一个浏览的页面. 当时真是一脸懵B(心里一万头草泥马呼啸而过~)!以为活见鬼了! 后来才发现浏览器左边,有一个幽灵般的淡蓝色箭头的出 ...

  3. 忘记了99乘法表啥样的了,python打印下看看

    for i in range(1,10): for j in range(1, i+1): if i == j: print(j, "x", i, "=", i ...

  4. Codeforces1695 D1.+D2 Tree Queries

    题意 给一个n个点的无向图,其中有一个隐藏点X,可以进行一组询问S来确定S是n个节点中的哪个点.S包括k个询问节点.询问返回的值也为k个值,每个值为X点到每个询问节点的最短路距离,求k最小为多少. 提 ...

  5. python信息检索实验之向量空间模型与布尔检索

    import numpy as np import pandas as pd import math def bool_retrieval(string): if string.count('and' ...

  6. settings.py 配置汇总

    数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': ' ', #数据库名称 ...

  7. rocky8删除/etc/fstab 和/boot/所有文件,通过光盘救援模式恢复

    rocky8删除/etc/fstab 和/boot/所有文件,通过光盘救援模式恢复 mkdir /rootdir 先通过df和lsblk确定那个分区是根,如果确定不了,就先挂载一个分区,查看里边的文件 ...

  8. KeeWiDB的高性能修炼之路:架构篇

    数据也有冷热之分,你知道吗? 根据访问的频率的高低可将数据分为热数据和冷数据,访问频率高的则为热数据,低为冷数据.如果热.冷数据不区分,一并存储,显然不科学.将冷数据也存储在昂贵的内存中,那么你想,成 ...

  9. ANSYS安装教程

    ANSYS 16.0 WIN10 64位安装步骤:1.使用"百度网盘客户端"下载ANSYS 16.0软件安装包到电脑磁盘里全英文名称文件夹内,安装前先断开网络,然后找到ANSYS. ...

  10. 领域驱动设计(DDD)在美团点评业务系统的实践

    前言 至少 30 年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans 将其定义为领域驱动设计(Domain-Driven Design,简称 DDD).在 ...