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

菜得过分。

面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了。。。

T1这种大模板啊。。。其实我是觉得我能打出来的,然后先用一个小时码了一个2k。

然后做T2想贪心就出来了。十分钟码完T3暴力之后回T1打对拍瞬间爆炸。

于是又重新打了一个2k,WA0。对拍发现。

然后考试就没几分钟了交暴力走了。

不要打完就跑,记得早点对拍改进思路。

T1:

的确是挺裸的线段树。离散化或者权值线段树都可以。

但是考场上两个都打出来都死了。

最后用离散化A的。

 1 #include<cstdio>
 2 #include<unordered_map>
 3 #include<algorithm>
 4 using namespace std;
 5 #define inf 10000001
 6 unordered_map<long long,int>M;
 7 int m,cnt,k[100005];long long x[300005],l[100005],r[100005],re[300005];
 8 struct Segment_Tree{
 9     int cl[1500005],cr[1500005],lz[1500008],lzxor[1500008],w0[1500008],w1[1500008];
10     void build(int p,int l,int r){
11         cl[p]=l;cr[p]=r;lz[p]=-1;w0[p]=l;w1[p]=inf;
12         if(l==r)return;
13         build(p<<1,l,l+r>>1);build(p<<1|1,(l+r>>1)+1,r);
14     }
15     void up(int p){w0[p]=min(w0[p<<1],w0[p<<1|1]);w1[p]=min(w1[p<<1],w1[p<<1|1]);}
16     void down(int p){
17         if(lz[p]!=-1){
18             lz[p<<1]=lz[p],lz[p<<1|1]=lz[p];
19             lzxor[p<<1]=lzxor[p<<1|1]=0;
20             if(lz[p])w1[p<<1]=cl[p<<1],w1[p<<1|1]=cl[p<<1|1],w0[p<<1]=w0[p<<1|1]=inf;
21             else w1[p<<1]=w1[p<<1|1]=inf,w0[p<<1]=cl[p<<1],w0[p<<1|1]=cl[p<<1|1];
22             lz[p]=-1;
23         }else if(lzxor[p]){
24             if(lz[p<<1]!=-1)lz[p<<1]^=1;else lzxor[p<<1]^=1;
25             if(lz[p<<1|1]!=-1)lz[p<<1|1]^=1;else lzxor[p<<1|1]^=1;
26             swap(w1[p<<1],w0[p<<1]);
27             swap(w1[p<<1|1],w0[p<<1|1]);
28             lzxor[p]=0;
29         }
30         up(p);
31     }
32     void set(int p,int l,int r,int w){
33         if(l<=cl[p]&&cr[p]<=r){
34             lz[p]=w;lzxor[p]=0;
35             if(w)w1[p]=cl[p],w0[p]=inf;
36             else w1[p]=inf,w0[p]=cl[p];
37             return;
38         }
39         down(p);
40         if(l<=cr[p<<1])set(p<<1,l,r,w);
41         if(r>=cl[p<<1|1])set(p<<1|1,l,r,w);
42         up(p);
43     }
44     void Xor(int p,int l,int r){
45         if(l<=cl[p]&&cr[p]<=r){
46             if(lz[p]!=-1)lz[p]^=1;else lzxor[p]^=1;
47             swap(w0[p],w1[p]);
48             return;
49         }
50         down(p);
51         if(l<=cr[p<<1])Xor(p<<1,l,r);
52         if(r>=cl[p<<1|1])Xor(p<<1|1,l,r);
53         up(p);
54     }
55 }Tree;
56 main(){
57     scanf("%d",&m);
58     for(int i=1;i<=m;++i)scanf("%d%lld%lld",&k[i],&l[i],&r[i]),x[i]=l[i],x[m+i]=r[i],x[m+m+i]=r[i]+1;
59     sort(x+1,x+1+m+m+m);
60     for(int i=1;i<=m*3;++i)if(x[i]!=x[i-1])M[x[i]]=++cnt,re[cnt]=x[i];
61     for(int i=1;i<=m;++i)l[i]=M[l[i]],r[i]=M[r[i]];
62     if(M.find(1)==M.end()){for(int i=1;i<=m;++i)puts("1");return 0;}
63     Tree.build(1,1,cnt);Tree.lz[1]=0;
64     for(int i=1;i<=m;++i){
65         if(k[i]==1)Tree.set(1,l[i],r[i],1);
66         if(k[i]==2)Tree.set(1,l[i],r[i],0);
67         if(k[i]==3)Tree.Xor(1,l[i],r[i]);
68         printf("%lld\n",re[Tree.w0[1]]);
69     }
70 }

思路积累:

  • 线段树模板

T2:

三分其实不完全正确。虽然secret证明了单峰性质,但是ooo给出了函数值在谷底以外的地方不严格单调的例子。

直接贪心的话我们会发现决策有点复杂而且还可能会反悔。

但是其实只有四种物品,它们内部先排一下序(一定要排序啊啊啊)

根据数据范围的提示,两人都喜欢的物品是特殊的。

然后如果我们确定了两人都喜欢的物品的选择数量,剩下的贪心决策就好说了。

总费用关于它是个单峰函数(非严格)。

注意左右端点。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 struct ps{
 5     int c1,c2;long long v;
 6     friend bool operator<(ps a,ps b){return a.v<b.v;}
 7 }p[100005];
 8 int n,m,k,a,b,n0,n1,n2,n3;long long v[100005],c1[100005],c2[100005];
 9 long long q0[100005],q1[100005],q2[100005],q3[100005],ans=100000000000000000ll;
10 long long chk(int p){
11     long long tot=0,lft=m-k-(k-p);
12     for(int i=1;i<=p;++i)tot+=q3[i];
13     for(int j=1;j<=k-p;++j)tot+=q1[j]+q2[j];
14     int p0=1,p1=k-p+1,p2=k-p+1;
15     while(lft--)
16         if(q0[p0]<q1[p1]&&q0[p0]<q2[p2])tot+=q0[p0],p0++;
17         else if(q1[p1]<q2[p2])tot+=q1[p1],p1++;
18         else tot+=q2[p2],p2++;
19     ans=min(ans,tot);//printf("%d %lld\n",p,tot);
20     return tot;
21 }
22 main(){
23     scanf("%d%d%d",&n,&m,&k);
24     for(int i=1;i<=n;++i)scanf("%lld",&v[i]);
25     scanf("%d",&a);for(int i=1,x;i<=a;++i)scanf("%d",&x),c1[x]=1;
26     scanf("%d",&b);for(int i=1,x;i<=b;++i)scanf("%d",&x),c2[x]=1;
27     for(int i=1;i<=n;++i)
28         if(c1[i]&&c2[i])q3[++n3]=v[i];
29         else if(c1[i])q1[++n1]=v[i];
30         else if(c2[i])q2[++n2]=v[i];
31         else q0[++n0]=v[i];
32     sort(q0+1,q0+n0+1);
33     sort(q1+1,q1+n1+1);
34     sort(q2+1,q2+n2+1);
35     sort(q3+1,q3+n3+1);
36     q0[n0+1]=q1[n1+1]=q2[n2+1]=1000000000000ll;
37     int l=0,r=n3;
38     l=max(l,max(k-n1,k-n2));l=max(l,2*k-m);//printf("%d %d\n",l,r);
39     if(l>r){puts("-1");return 0;}
40     while(l<r-1)if(chk(l+r>>1)<chk((l+r>>1)+1))r=l+r>>1;else l=l+r>>1;
41     for(int i=l;i<=r;++i)chk(i);
42     printf("%lld\n",ans);
43 }

  • 贪心
  • 单峰函数三分
  • 这两个知识点总在一起出现?

T3:

见下发题解。

挺神仙的。

 1 #include<cstdio>
 2 #include<bitset>
 3 using namespace std;
 4 bitset<401>B[401];
 5 int n,m,a[50005],b[50005],ans;
 6 int main(){
 7     scanf("%d%d",&n,&m);
 8     for(int i=1;i<=m;++i)scanf("%d%d",&a[i],&b[i]);
 9     for(int i=1;i<=n;++i)B[i][i]=1;
10     for(int i=1;i<=n;++i)for(int j=m;j;--j)
11         if(B[i][a[j]]&&B[i][b[j]]){B[i].reset();break;}
12         else if(B[i][a[j]]&&!B[i][b[j]])B[i][b[j]]=1;
13         else if(B[i][b[j]]&&!B[i][a[j]])B[i][a[j]]=1;
14     for(int i=1;i<=n;++i)if(B[i].any())for(int j=i+1;j<=n;++j)if(B[j].any()&&(B[i]&B[j]).none())ans++;
15     printf("%d\n",ans);
16 }



什么时候才能回到原来的状态啊。。。

为什么会这么菜啊。。。

可是我好像会做啊。。。



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

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

时间: 2024-08-30 01:34:12

[考试反思]0929csp-s模拟测试55:沦陷的相关文章

2019.9.29 csp-s模拟测试55 反思总结

不咕咕咕是一种美德[大雾] 头一次体会到爆肝写题解??? 这次考试我们没赶上,是后来掐着时间每个人自己考的.我最后的分数能拿到152…熟悉的一题AC两题爆炸. 强烈吐槽出题人起名走心 T1联: 发现每一次加入一个区间的操作,只有区间的l或者r+1有可能成为答案.那么考虑能不能用这两个点代表一整个区间,维护全局最靠左的0在什么地方. 把每个操作的l和r+1都存下来,离散化,建一棵线段树.每一次区间操作都针对线段树上的a[l]-a[r+1]-1这部分(a[x]为x离散化以后的排序,即线段树里的位置)

模拟测试55

T1: 区间很大,但是最优位置可能出现的地方不超过$2n$个. 可以将区间端点及最优值可能出现的位置离散化,即每个区间的$l$.$r$和$r+1$,连同$1$一起离散化. 然后线段树维护就即可. 要同时维护最左侧的$0$和$1$,当前区间是否全为$1$或全为$0$. 修改时如果是区间赋值,直接覆盖答案及懒标记. 如果是区间反转,交换最左侧的$0$和$1$的位置,同时反转区间状况和懒标记. 查询最左侧的$0$即可. 时间复杂度$O(nlogn)$. T2: 将物品分成4类:甲喜欢,乙喜欢,都喜欢和

[考试反思]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)的卡常 正?解: