[考试反思]1025csp-s模拟测试87:生存

想起一句话

课上求生存,课下求发展

发展还好说,如何生存?

生存很困难。。。

没什么可抱怨的。有AK的。高分的也很多。

该说的在《Dust》里说完了,安静会吧。

这场rank43怎么追?

最大240分差,可能这一轮就完蛋了。

知道有多紧迫了吗?

上次爆个0导致追不回来直接滚出第一机房依旧令我印象深刻。

OI不会给你任何一次失手的机会。CSP-S也只有6道题。

这一天下来分数上限就是360了?

再说这样的话Day2还能稳住心态吗?

省一可能都拿不到吧?

不要轻视任何一道题与任意一次考试,希望不要在CSP上付出代价。

时间分配也有一点问题,难易度判断又挂了。

T1:maze

注意,OI坐标系横着是y轴竖着是x轴,与数学坐标系不同。

样例又是精心构造的。

爆零快乐。

二分+最短路,没什么好说的。

 1 #include<cstdio>
 2 #include<queue>
 3 using namespace std;
 4 struct P{int x,y;double d;friend bool operator<(P a,P b){return a.d>b.d;}};
 5 priority_queue<P>q;
 6 #define tx x+xx[i]
 7 #define ty y+yy[i]
 8 const int yy[]={0,0,1,-1};
 9 const int xx[]={1,-1,0,0};
10 int n,m,can[101][101],sx,sy,ex,ey;double s,dt[101][101];
11 bool chk(double k){
12     for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)dt[i][j]=1e16;
13     dt[sx][sy]=0;
14     q.push((P){sx,sy,0});
15     while(!q.empty()){
16         int x=q.top().x,y=q.top().y;double d=q.top().d;q.pop();
17         if(d-dt[x][y]>1e-4)continue;
18         for(int i=0;i<=1;++i)if(can[tx][ty]&&dt[tx][ty]>d+k)
19             q.push((P){tx,ty,dt[tx][ty]=d+k});
20         for(int i=2;i<=3;++i)if(can[tx][ty]&&dt[tx][ty]>d+1)
21             q.push((P){tx,ty,dt[tx][ty]=d+1});
22     }
23     return dt[ex][ey]<s;
24 }
25 int main(){
26     scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&ex,&ey);
27     for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) scanf("%d",&can[i][j]), can[i][j]^=1;
28     scanf("%lf",&s);
29     double l=0,r=100000;
30     while(r-l>1e-4)if(chk((l+r)/2))l=(l+r)/2;else r=(l+r)/2;
31     printf("%.3lf\n",l);
32 }

T2:bird

考场上就能看出来是个朴素的线段树优化dp。

但是分配时间不够,没细想。

因为一只鸟不能被打两遍,所以用线段树上的加减“篡改”一下转移值。

全场倒数第4个改出来。状态极差,效率极低。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<vector>
 4 using namespace std;
 5 vector<int>v1[500005],v2[500005];
 6 int mx[8000005],cl[8000005],cr[8000005],lz[8000005],n,ans,k,l,r,cf[500005];
 7 void build(int p,int l,int r){
 8     cl[p]=l;cr[p]=r;
 9     if(l==r)return;
10     build(p<<1,l,l+r>>1);build(p<<1|1,(l+r>>1)+1,r);
11 }
12 void down(int p){
13     mx[p<<1]+=lz[p];mx[p<<1|1]+=lz[p];
14     lz[p<<1]+=lz[p];lz[p<<1|1]+=lz[p];
15     lz[p]=0;
16 }
17 int ask(int p,int l,int r){if(r<l)return 0;
18     if(l<=cl[p]&&cr[p]<=r)return mx[p];
19     if(lz[p])down(p);
20     return max(l<=cr[p<<1]?ask(p<<1,l,r):0,r>=cl[p<<1|1]?ask(p<<1|1,l,r):0);
21 }
22 void add(int p,int l,int r,int w){
23     if(l<=cl[p]&&cr[p]<=r){mx[p]+=w;lz[p]+=w;return;}
24     if(lz[p])down(p);
25     if(l<=cr[p<<1])add(p<<1,l,r,w);
26     if(r>=cl[p<<1|1])add(p<<1|1,l,r,w);
27     mx[p]=max(mx[p<<1],mx[p<<1|1]);
28 }
29 int main(){
30     build(1,0,500000);
31     scanf("%d%d",&n,&k);
32     while(n--){
33         scanf("%d%d",&l,&r);
34         l=max(l,0);
35         if(r<0)continue;
36         v1[l].push_back(r),v2[r].push_back(l);
37         cf[l]++;cf[r+1]--;
38     }int cnt=0;
39     for(int i=0;i<=500000;++i){
40         if(i)cf[i]+=cf[i-1];
41         for(int j=0;j<v1[i].size();++j)add(1,i,v1[i][j],-1);
42         int x=ask(1,0,i-k)+cf[i];
43         add(1,i,i,x);ans=max(ans,x);
44         for(int j=0;j<v2[i].size();++j)add(1,v2[i][j],i,+1);
45     }printf("%d\n",ans);
46 }

T3:stone

第二天早上改题,状态回升。

显然可以打表,考场上也打出了dp。然后没有找到规律。

表太小了看不出来,其实打表得到的1是联通的,中间凭空出现了几个零散的0。

出现0的条件是a[i]=b[j-1]&&a[i-1]=b[j]&&a[i]!=a[i-1]

证明skyh说的挺好的,我太菜不写了

然后用子序列dp干一下处理出每一行的左右端点,再挖去0。

因为只有3种字符,所以手动讨论一下相邻两位的字符,用前缀和统计一下每个字符串在b里出现的次数,在a的lr之间求出即可。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 char a[1000005],b[1000005];int n,m,l[1000005],r[1000005];long long ans;
 5 int ab[1000005],ac[1000005],ba[1000005],bc[1000005],ca[1000005],cb[1000005];
 6 int main(){
 7     scanf("%s%s",a+1,b+1);
 8     while(a[n+1])n++;
 9     while(b[m+1])m++;
10     int p1=1,p2=1;
11     for(int i=1;i<=n;++i)if(a[i]==b[p1])l[i]=p1++;else l[i]=p1;
12     for(int i=1;i<=m;++i)if(b[i]==a[p2])p2++,r[p2]=min(i+1,m);else r[p2]=min(i+1,m);
13     if(!r[1])r[1]=1;
14     for(int i=1;i<=n;++i)if(!r[i])r[i]=m;
15     for(int i=2;i<=m;++i){
16              if(b[i]==‘A‘&&b[i-1]==‘C‘)ac[i]++;
17         else if(b[i]==‘A‘&&b[i-1]==‘B‘)ab[i]++;
18         else if(b[i]==‘B‘&&b[i-1]==‘A‘)ba[i]++;
19         else if(b[i]==‘B‘&&b[i-1]==‘C‘)bc[i]++;
20         else if(b[i]==‘C‘&&b[i-1]==‘A‘)ca[i]++;
21         else if(b[i]==‘C‘&&b[i-1]==‘B‘)cb[i]++;
22         ac[i]+=ac[i-1];ab[i]+=ab[i-1];
23         bc[i]+=bc[i-1];ba[i]+=ba[i-1];
24         ca[i]+=ca[i-1];cb[i]+=cb[i-1];
25     }
26     for(int i=1;i<=n;++i)ans+=r[i]-l[i]+1;
27     for(int i=2;i<=n;++i)
28              if(a[i]==‘A‘&&a[i-1]==‘C‘)ans-=ca[r[i]]-ca[l[i]-1];
29         else if(a[i]==‘A‘&&a[i-1]==‘B‘)ans-=ba[r[i]]-ba[l[i]-1];
30         else if(a[i]==‘B‘&&a[i-1]==‘A‘)ans-=ab[r[i]]-ab[l[i]-1];
31         else if(a[i]==‘B‘&&a[i-1]==‘C‘)ans-=cb[r[i]]-cb[l[i]-1];
32         else if(a[i]==‘C‘&&a[i-1]==‘A‘)ans-=ac[r[i]]-ac[l[i]-1];
33         else if(a[i]==‘C‘&&a[i-1]==‘B‘)ans-=bc[r[i]]-bc[l[i]-1];
34     printf("%lld\n",ans);
35 }

原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11742420.html

时间: 2024-10-13 17:25:40

[考试反思]1025csp-s模拟测试87:生存的相关文章

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

[考试反思]1003csp-s模拟测试58:沉淀

稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使用的话,切记计算内存,一点都不能开大. T1: 直接根号筛,拿map也能过. 遍历map直接begin和end啊... 1 #include<cstdio> 2 int Cnt[202]; 3 struct hash_map{ 4 int cnt,fir[10000020],l[6666666],

[考试反思]0114省选模拟7:迷离

这次考得相对不错,但是没什么水准. 只不过记得T1这道原题而已.虽说我忘了怎么做,而且数据范围不一样...差不多是从头想的. 但是并没有AC,像个弱智一样,有两个细节写的完全不对还有80分运气也是真好. 其实挂了不止两个细节...以为是原题于是上来就写20分钟写完,然后过一会出一个锅... 然后看T2,感觉$O(nk^2)$也许差不多?常数很大...但也不会别的.挺好想但是不是很好写. 于是乎强烈谴责cbx没素质暴力水题考后还不改正解的无脸行径 于是就开始写,写了一个半小时. 看T3,绝对大神题

模拟测试68,69

68: 32 AlpaCa 41 03:08:20 31 02:46:16 30 02:46:28 102 03:08:20 69: 28 AlpaCa 20 02:51:15 60 03:05:32 0 01:39:45 80 03:05:32 彻底挂掉了呢. 不过也还好吧,至少之后的考试不会有那么大压力了吧(出第一机房是肯定的事了),那利用之后几场考试就调整好状态,下次再来嘛. 但是最近炸了那么多场还是要反思一下,其实不只是心态的问题,自身实力,考试技巧,时间分配等方面好像都有点问题. 69

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci