水杯
题目大意
小
D
D
D 有一个能显示温度的杯子. 其原理是杯盖上的一个传感器. 只有在杯子内的水的体积大于等于某个数
L
L
L 的时候传感器才能显示水温,并且如果水温不在
[
A
,
B
]
[A,B]
[A,B] 内传感器也无法显示水温.
注意,这里温度对水的体积没有影响
初始水杯为空,有
n
n
n 次操作,操作分为三种:
1
x
x
x 表示把水温变成
x
x
x.
2
x
x
x 表示把水的体积变成
x
x
x.
3 查询传感器的显示情况. 如果不能显示水温输出
G
G
GG
GG,否则输出水温.
输入格式
第一行四个整数
n
,
L
,
A
,
B
n,L,A,B
n,L,A,B 含义如题目所示.
接下来
n
n
n 行,每行一个整数
o
p
t
opt
opt 或两个整数
o
p
t
opt
opt,
x
x
x,表示执行操作
o
p
t
opt
opt
输出格式
对于所有操作 3 输出结果,每行一个答案.
数据规模与约定
对于
100
100
100 % 的数据,1
≤
\leq
≤ n
≤
\leq
≤ 1000,-273
≤
\leq
≤ A
≤
\leq
≤ B
≤
\leq
≤ 100,1
≤
\leq
≤ L
≤
\leq
≤ 1000,1
≤
\leq
≤ opt
≤
\leq
≤ 3
对于操作 1,-273
≤
\leq
≤ x
≤
\leq
≤ 100;对于操作 2,1
≤
\leq
≤ x
≤
\leq
≤ 1000.
样例输入
5 2 1 3
1 5
2 3
3
1 2
3
样例输出
GG
2
#include <iostream>
using namespace std;
int n,L,A,B,t,v;
int main()
{
cin>>n>>L>>A>>B;
while(n--)
{
int op,x;
cin>>op;
if(op==1){
cin>>x;
t=x;
}
else if(op==2){
cin>>x;
v=x;
}
else{
if(v>=L && t>=A && t<=B)
cout<<t<<'\n';
else cout<<"GG"<<'\n';
}
}
return 0;
}
鳖
题目大意
A
l
i
c
e
Alice
Alice 和
B
o
b
Bob
Bob 在打扑克.
有一副点数为 1
⋯
\cdots
⋯
n
n
n 的扑克牌,除了两种点数只有三张牌以外,其余的点数都有四张牌,点数相同的牌认为是相同的. 给出一个牌的顺序,
A
l
i
c
e
Alice
Alice 和
B
o
b
Bob
Bob 轮流按顺序摸牌,
A
l
i
c
e
Alice
Alice 先手,当某个人新摸到的牌已经在
T
a
Ta
Ta 的手牌中存在时,把这两张牌同时从
T
a
Ta
Ta 的手牌中移除. 注意手牌的顺序是摸牌的顺序.
摸完牌后,从
A
l
i
c
e
Alice
Alice 开始,重复以下过程:
如果有人没有手牌了,那么没有手牌的人获胜,结束.
计数器
c
n
t
cnt
cnt 加一
把对方的第一张手牌放到自己的手牌中,使其成为自己的最后一张手牌. 如果该牌之前已在自己的手牌中出现过,那么把这两张牌同时从自己的手牌中移除.
由对方继续操作.
给出牌的顺序,求出
c
n
t
cnt
cnt 的值. 可以证明在有限步内游戏一定会结束.
输入格式
第一行一个整数
n
n
n ,表示点数为 1
⋯
\cdots
⋯ n.
第二行
4
n
−
2
4n-2
4n−2 个正整数,表示牌的顺序. 保证恰好有两种点数出现了三次,其余点数出现四次.
输出格式
一行一个整数表示
c
n
t
cnt
cnt 的值.
数据规模与约定
对于
50
50%
50 的数据,3
≤
\leq
≤ n
≤
\leq
≤ 100。
对于
100
%
100\%
100% 的数据,3
≤
\leq
≤ n
≤
\leq
≤ 100000。
样例输入
5
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 5 5 5
样例输出
1
#include <iostream>
using namespace std;
const int maxn=1e5+7;
int a[maxn<<1],ap[maxn<<1],b[maxn<<1],bp[maxn<<1];
int n,cnt,topa,topb,idxa,idxb,na,nb;
void adda(int x)
{ //a[] 表示栈中存在的牌 ap[]表示出现过的牌,存的是 a[] 的下标
if(ap[x]){
a[ap[x]]=0;
ap[x]=0;
--na;
}
else{
a[++idxa]=x;
ap[x]=idxa;
++na;
}
}
void addb(int x)
{
if(bp[x]){
b[bp[x]]=0;
bp[x]=0;
--nb;
}
else{
b[++idxb]=x;
bp[x]=idxb;
++nb;
}
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0);
cin>>n;
for(int i=1;i<=n*4-2;++i)
{
int p;
cin>>p;
if(i&1) adda(p);
else addb(p);
}
++topa; ++topb; //栈顶指针
while(na && nb)
{
cnt++;
if(cnt&1){
while(!b[topb]) ++topb; //取栈中存在的牌
adda(b[topb]); //从栈 b 中得到 1张牌
addb(b[topb]); //去除这张牌
}
else{
while(!a[topa]) ++topa;
addb(a[topa]);
adda(a[topa]);
}
}
cout<<cnt<<'\n';
return 0;
}
顺序安排
题目大意
给定一棵有根树,对于给定的树求出对应的一种排列使得代价和最小。
对于一种排列计算代价方式如下
给定常数
k
k
k。
a
a
a 的父亲在序列中的位置是
x
x
x,
a
a
a 在序列中的位置是
y
y
y。
a
a
a 的儿子节点必须在
a
a
a 之后出现。
a
a
a 的父亲在
a
a
a 之前出现,代价是 k
×
\times
×
(
y
−
x
)
(y-x)
(y−x)。
特殊的,容易看出,树根只能放在
1
1
1 号位,则代价是
k
k
k。
只需要输出最小代价和即可。
输入格式
第一行两个正整数
n
n
n 和
k
k
k。
接下来一行
n
−
1
n - 1
n−1 个正整数,代表 2
∼
\sim
∼
n
n
n 每个节点的父节点编号。
输出格式
一行,输出最小代价和。
数据规模与约定
对于
10
%
10\%
10% 的数据,2
≤
\leq
≤ n
≤
\leq
≤ 10。
对于另外
40
%
40\%
40% 的数据,保证是一条链。
对于
100
%
100\%
100% 的数据,2
≤
\leq
≤ n
≤
\leq
≤ 600000, 1
≤
\leq
≤ k
≤
\leq
≤ 2
×
\times
×
1
0
6
10^6
106。
样例输入
5 2
1 1 3 3
样例输出
14
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
int cnt[maxn];
vector<int> v[maxn], p;
bool cmp(int a, int b) { return cnt[a] < cnt[b]; }
void dfs(int u) // 求子树结点的个数
{
cnt[u] = 1;
int t = v[u].size();
for (int i = 0; i < t; i++)
{
int e = v[u][i];
dfs(e);
cnt[u] += cnt[e];
}
}
int main()
{
#ifdef LZH_LOCAL
freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
#endif
int n, m;
cin>>n>>m;
for (int i = 2; i <= n; i++)
{
int x;
cin>>x;
v[x].push_back(i);
}
dfs(1); //求出每棵子树结点的个数 cnt[]
ll ans = 1; //根节点1的贡献点是1
// 分别对 每个结点作为根节点时 计算它的子节点的贡献值
for (int i = 1; i <= n; i++)
{
p.clear();
int t = v[i].size();
for (int j = 0; j < t; j++)
p.push_back(v[i][j]);
// 把结点i的所有儿子结点按照子树结点个数从小到大排序
sort(p.begin(), p.end(), cmp);
ll temp = 1;
// 计算结点i的子节点到i的贡献点
t = p.size();
for (int j = 0; j < t; j++)
{
int x = p[j];
ans += temp;
temp += cnt[x];
}
}
cout<<(ll)ans*m<<'\n';
return 0;
}
第三题代码参考这篇题解:👉 题解
如果能回到两年前,再也不会选择读计算机了,我会舍弃30分选个500分左右的专科读(至于为什么说是专科,即使现在是二本,高考前老肖就说了所谓的一本和二本招人的那代人根本不认),主要是氛围不好,学习真的太累,想学其余的东西还得自己花钱去学,我现在真的累,找不到知心朋友。现在对恋爱感到厌恶,想自己一个人静静,一个人学会自律,减肥,不想考研(主要考不上电子科技大学,英语六级就甩我一条街,双非学校,我有自知)。我不知道学校的数据结构讲的什么,没有意义,今天看了yxc老师进阶课的图论,我感觉到了难,算法这种事情,除了靠努力,天赋还很重要。