第一次考csp,去年高一决赛都没进 ,csp在爆零的边缘徘徊。
下文游记按时间顺序记叙,题解反思在最后面
游记
10.22
考试前一天,感觉脑袋已经转不过来了,早上就随便敲了几个模板 (一个没用到) 。下午打了会儿pingpong,然后提前放不上晚自习,看了会儿hky和kl打球就回家摸鱼了,然后早早睡了个觉。
10.23
考前
好像11点才醒,然后吃了个饭就赶去学校了,感觉头晕眼花,危。
然后下午1点左右就到了考场门口,在外面傻站了1个小时左右。。。
2点左右进了学校,听他们说pj考了四道模拟,我感觉不妙,不会tg要考四道思维吧 。然后匆匆忙忙进了考场,好挤呀,机房电脑都挨着的,人挨人,我旁边坐了两个初中的,一个好像才初二。然后往讲台方向看,靠讲台看到了josh的身影,带上帽子一股AK之气。
我检查了一下cena,然后开始调我的阴间Dev背景,清晰的记得47,56,60。然后敲了个缺省源。
然而这竟然是我提前退不退役的关键时候。
考完之后我翻洛谷帖子,看到了一个一个贴,说什么“为什么#include<bits\stdc++.h>本地可以过,windows可以,Linux不行?”(详见这里)。
谢谢,已经开始慌了,我从来都直接用缺省源,考试前一天才记了一下头文件,快读,考试的时候又只打了一遍,剩下的都直接复制粘贴,根本想不起对不对。然后我洛谷上试了一下:\ 本机不报错,交上去直接CE ,冒汗 。然后我回忆了一下当时,但啥都记不起来。接着试着重新敲一遍头文件,但仿佛我敲 \ 的概率大一点,小指刚好能碰到,而且眼睛也看的到那个键,一晚上没睡好。
最后看源码,那是我离退役最近的时候,幸好老天保佑,暂时还活着。。。
开考
2:30的时候把题发了,但我不知道怎么找,看旁边初中同学操作飞快,就照着他找到了题。
大概花了20分钟想T1,没有半毛钱思路,唯一的单调性是一个机场廊桥增加停靠飞机数不降 ,有个锤子用 。但是飞机是否能停不是一个单调的(至少我当时是这么认为的),所以直接放弃思考敲了个暴力。
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int n,m1,m2,f1[N],f2[N],b[N<<2],uni,ans;
int q[N],l,r;
struct Node{
int l,r;
}s1[N],s2[N];
int bit[N<<2];
inline int lowbit(const int x){
return x&-x;
}
inline void add(int x,const int v){
while(x<=uni+1) bit[x]+=v,x+=lowbit(x);
}
inline int sum(int x){
int res=0; while(x) res+=bit[x],x-=lowbit(x); return res;
}
inline bool cmp(const Node &x,const Node &y){
return x.l<y.l;
}
#define gc getchar()
#define in read()
inline int read(){
int f=1,k=0; char cp=gc; while(cp!='-'&&(cp<'0'||cp>'9')) cp=gc; if(cp=='-') f=-1,cp=gc;
while(cp>='0'&&cp<='9') k=(k<<3)+(k<<1)+cp-48,cp=gc; return f*k;
}
int main(){
freopen("airport.in","r",stdin),freopen("airport.out","w",stdout);
n=in,m1=in,m2=in;
for(int i=1;i<=m1;i++) b[++uni]=s1[i].l=in,b[++uni]=s1[i].r=in;
for(int i=1;i<=m2;i++) b[++uni]=s2[i].l=in,b[++uni]=s2[i].r=in;
sort(b+1,b+uni+1),uni=unique(b+1,b+uni+1)-b-1;;
for(int i=1;i<=m1;i++) s1[i].l=lower_bound(b+1,b+uni+1,s1[i].l)-b,s1[i].r=lower_bound(b+1,b+uni+1,s1[i].r)-b;
for(int i=1;i<=m2;i++) s2[i].l=lower_bound(b+1,b+uni+1,s2[i].l)-b,s2[i].r=lower_bound(b+1,b+uni+1,s2[i].r)-b;
sort(s1+1,s1+m1+1,cmp),sort(s2+1,s2+m2+1,cmp);
for(int lim=1;lim<=m1;lim++){
memset(bit,0,sizeof(bit));
for(int i=1;i<=m1;i++){
int l=s1[i].l,r=s1[i].r;
if(sum(l)<lim) ++f1[lim],add(l,1),add(r+1,-1);
}
}
for(int lim=1;lim<=m2;lim++){
memset(bit,0,sizeof(bit));
for(int i=1;i<=m2;i++){
int l=s2[i].l,r=s2[i].r;
if(sum(l)<lim) ++f2[lim],add(l,1),add(r+1,-1);
}
}
ans=0; for(int j=0;j<=n;j++) ans=max(ans,f1[min(m1,j)]+f2[min(m2,n-j)]); printf("%d\n",ans);
return 0;
}
一个愚蠢的 O ( n 2 l o g ) O(n^2log) O(n2log)的做法,仿佛能拿40分,但是测强点的数据就只有20了,直接T掉。
然后开T2,看着这么长的题脑袋大了,读了两遍题感觉啥都没读懂 (根我读语文课文差不多),可能又过去了10分钟 。就果断先开T3了。
T3个人认为唯一的方法就是找性质 ,因为我不会任何其它的方法 。然后缓缓的找了10几分钟就找到了,就是“另一个”一定会一直连成一块,就无脑的敲了个四指针的暴搜,总感觉会T。然后非常不自信的把T=1的点直接输出-1,洛谷测就挂了8分。
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N=1e6+10;
int T,n,a[N]; pii pos[N];
bool use[N],flag;
bool sta[N]; int top; int staa[N];
inline void init(){
memset(pos,0,sizeof(pos)); top=0; memset(use,0,sizeof(use)); flag=0;
}
inline int find(const int i){
if(i!=pos[a[i]].fi) return pos[a[i]].fi; else return pos[a[i]].se;
}
inline void dfs(const int l,const int r,const int l1,const int r1,const int cnt){
if(cnt<<1==n){
for(int i=1;i<=top;i++) printf(sta[i]?"R":"L");
int x=l1,y=r1;
for(int i=top;i>=1;i--){
if(staa[i]==x) printf("L"),++x; else printf("R"),--y;
} puts("");
flag=1; return;
}
if(!use[l]){
int p=find(l);
if(!use[p]){
use[l]=use[p]=1;
if(!l1&&!r1){
sta[++top]=0,staa[top]=p,dfs(l+1,r,p,p