文章目录
前言
这是一个正规总结,四道题都有详细题解。
先记录一下成长历程,额…比较短:
- 2020 CSP-J 一等奖
- 2020 CSP-S 一等奖
- 2020 NOIP 二等奖资格(主要是初中没有评奖资格)
好了没了,一连串的比赛结束,又要开始日常的训(bi)练(sai)生活。
总结
这次比赛去纪中,刚刚看完题目,我就被XC摸头,额…是被叫去给五年级新生监考的,于是我没有比赛。
T1
Description
题解
水题,左括号配对右括号,栈模拟
代码
#include<bits/stdc++.h>
#define rg register
#define Fu(i,a,b) for(rg int i=(a);i<=(b);i++)
#define Fd(i,a,b) for(rg int i=(a);i>=(b);i--)
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
char a[32005];
int t[32005],bt,bf,js;
int size,num,n;
int main(){
fre(form);
while(scanf("%s",a)==1){
size=0,num++,n=0,js=0;
while(a[n]=='T'||a[n]=='F'||a[n]=='('||a[n]==')'){
if(a[n]==')'){
bt=bf=0;
while(size>0&&t[size]>=0){
if(t[size]==1) bt=1;
else bf=1;
size--;
}
if(t[size]==-1){
if(bf==1)t[size]=0;
else t[size]=1;
}
else{
if(bt==1) t[size]=1;
else t[size]=0;
}
js--;
}
else{
if(a[n]=='('){
js=js+1;
if(js%2==1){
t[++size]=-1;
}
else t[++size]=-2;
}
else if(a[n]=='T')t[++size]=1;
else if(a[n]=='F')t[++size]=0;
}
n++;
}
if(t[size]==1) printf("%d. true\n",num);
else printf("%d. false\n",num);
}
return 0;
}
T2
Description
题解
好像是并查集,还没改出来。
T3
Description
小Z是一个爱好数学的小学生。最近,他在研究一些关于整数数列的性质。
为了方便他的研究,小Z希望实现一个叫做“Open Continuous Lines Processor”的数列编辑器。
一开始,数列编辑器里没有数字,只有一个光标。这个数列编辑器需要支持五种操作。
• I x 在当前光标前插入数字 x。
• D 删除当前光标前的数字。
• L 光标向前移动一个数字。
• R 光标向后移动一个数字。
• Q k 设光标之前的数列是{a1,a2,……,an},输出第k位及之前最大的前缀和,保证k≤n
题解
随意,两个栈模拟就好
代码
#include<bits/stdc++.h>
#define rg register
#define Fu(i,a,b) for(rg int i=(a);i<=(b);i++)
#define Fd(i,a,b) for(rg int i=(a);i>=(b);i--)
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
int n,l[1000005],r[1000005];
int qzh[1000005],maxn[1000005];
int main(){
fre(editor);
scanf("%d",&n);
Fu(i,0,n)maxn[i]=-0x7fffffff;
Fu(i,1,n){
char f=' ',a;
while(f!='I'&&f!='D'&&f!='L'&&f!='R'&&f!='Q') f=getchar();
if(f=='I'){
int x;
scanf("%d",&x);
l[++l[0]]=x;
qzh[l[0]]=qzh[l[0]-1]+x;
maxn[l[0]]=max(maxn[l[0]-1],qzh[l[0]]);
}
else if(f=='D'){
qzh[l[0]]=maxn[l[0]]=0;
l[0]--;
}
else if(f=='L'){
if(l[0]>0){
qzh[l[0]]=maxn[l[0]]=0;
r[++r[0]]=l[l[0]],l[0]--;
}
}
else if(f=='R'){
if(r[0]>0){
l[++l[0]]=r[r[0]],r[0]--;
qzh[l[0]]=qzh[l[0]-1]+r[r[0]+1];
maxn[l[0]]=max(maxn[l[0]-1],qzh[l[0]]);
}
}
else if(f=='Q'){
int k;
scanf("%d",&k);
printf("%d\n",maxn[k]);
}
}
return 0;
}
T4
Description
「寻找希望…为了找出希望…
那才是真正的希望…
只要拥有这样的希望,
不管陷入怎样的困境,我们都能继续前行…」
“这是 发生在互相残杀的学园生活之前的故事 。也或许根本就是某个平行世界的故事。
“黑幕站在大门口,静静地审视着希望之峰学园 。旁边站着的是一只 长得像玩偶的熊, 身体一半是黑色一半是白。 不知道是否对接下来将要引起的绝望而感到兴奋,黑幕的嘴角不易察觉地微微上扬。 而身旁 的黑白熊则 ‘唔噗噗噗 ’地意味不明地笑着。
“为了 计划的顺利实施,黑幕需要在学园内装上能监视到所有地方的摄像头。 学园 里一共 有n个房间,有一些房间通过走廊相连。出于特殊的原因,学园只修建了保证所有房间都能互相到达的前提下的最少的走廊。一个房间里的摄像头可以监视到这个房间以及这个房间直接通过走廊相连的所有房间。
“配置摄像头也不是一件简单的事情,所以黑幕决定安装尽量少摄像头。 同时黑幕也想到了一个超高校级的问题: 在安装最少的摄像头前提下,一共有多少种安装的方案? 两个方案不同当且仅存在一个房间在种方案中安装了摄像头,而在另一种方案中没有安装。
“答案 我已经计算出来了哦,你能吗? ”Alter Ego对着屏幕前的人,微笑着说道。
Input
输入 第一行含有一个整数n,代表学园里房间的数量。
接下来n−1行,每行描述一条走廊。每行含有 两个数,代表这条走廊连接的两个房间。
Output
输出 一共两行 。
第一行输出 一个整数,代表需要安装的最少摄像头的数目。
第二行输出一个整数,代表安装的方案数。由于答案可能很大,故输出答案对1,000,000,007取模的结果。
Sample Input
7
2 1
3 1
题解
T4:轮舞前夕
40(树形DP)+12(暴力)=52(有手就行)
代码
#include<bits/stdc++.h>
#define rg register
#define Fu(i,a,b) for(rg int i=(a);i<=(b);i++)
#define Fd(i,a,b) for(rg int i=(a);i>=(b);i--)
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
using namespace std;
int f[100005][3],n;
vector <int>a[100005];
void dp(int o,int from){
f[o][0]=0x7fffffff,f[o][1]=1,f[o][2]=0;int bj=0;
Fu(i,0,a[o].size()-1){
if(a[o][i]!=from){
dp(a[o][i],o);
f[o][1]+=min(f[a[o][i]][0],min(f[a[o][i]][1],f[a[o][i]][2]));
f[o][2]+=min(f[a[o][i]][0],f[a[o][i]][1]);
if(f[a[o][i]][1]<=f[a[o][i]][0]) bj=1;
}
}
if(bj==1) f[o][0]=f[o][2];
else{
Fu(i,0,a[o].size()-1){
if(a[o][i]!=from){
f[o][0]=min(f[o][0],f[o][2]+f[a[o][i]][1]-f[a[o][i]][0]);
}
}
}
}
int main(){
scanf("%d",&n);
Fu(i,2,n){
int u,v;
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
dp(1,0);
printf("%d\n0",min(f[1][0],f[1][1]));
return 0;
}