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

这次考得相对不错,但是没什么水准。

只不过记得T1这道原题而已。虽说我忘了怎么做,而且数据范围不一样。。。差不多是从头想的。

但是并没有AC,像个弱智一样,有两个细节写的完全不对还有80分运气也是真好。

其实挂了不止两个细节。。。以为是原题于是上来就写20分钟写完,然后过一会出一个锅。。。

然后看T2,感觉$O(nk^2)$也许差不多?常数很大。。。但也不会别的。挺好想但是不是很好写。

于是乎强烈谴责cbx没素质暴力水题考后还不改正解的无脸行径

于是就开始写,写了一个半小时。

看T3,绝对大神题啊除了skyh谁会做啊(%%%大神打表)。60分暴力乱弄一个不会证的结论过样例(啥?归纳??)

花了半个小时。还有一个小时。直接放弃T3正解,自知T2板子容易爆炸于是老老实实写个对拍。

暴力疯狂出锅,修好之后发现了正解的锅。修啊修半个小时之后就AC了。

其实是发挥的不错的一次考试。对拍也挺明智的。只不过T1不注重细节单求速度的问题也有所暴露。

今天考试时难得状态上线。。。所以考试结束后累的一匹。。。

顺及:

昨天清了清博客的动态,从32页删到了10页。顺便看了看我联赛前的动态。

我怎么那么颓啊!!!

也活该联赛爆炸。想想最近一段时间也颓的不轻,效率挺低的(虽说最近的确是又累又闷但这并不是合适的理由)

自我督促一下。现在我没有放松的资本。。。

尽量更紧张一些吧。。。

T1:翻转硬币

题意:n硬币正面朝上,每次对一个长为$a_i$的区间翻转(共$m$种$a$),最后要求$k$个特定位置反面朝上其余正面。问最少翻转次数

$n \le 10000,m\le 100,k\le 10$。

0811NOIP模拟测试17的T3《星空》。数据范围略有变化。

然而当时并没有写题解,所以现在再说一说。

区间异或不难想到做差分。于是每次是对相距$a$的点同时操作。最多有$2k$个位置需要操作。

做$2k$次$BFS$找到点对之间相互到达的最少次数,然后做一个状压$dp$。

考场上挂的两个细节:

1,要注意差分之后数列实际上用到了$n+1$位所以上限不要只开到$n$。

2,状压$dp$时每次选出的点对不能与当前状态有交集。

其中状压$dp$的部分可以用那种钦定最小点的思路,这样复杂度会低一些。

最终复杂度$O(2knm+4^kn)$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,k,dt[11111],bp[22][22],sp[11111],p[22],pc,dp[1048577],q[66666],stp[111];
 4 int main(){
 5     scanf("%d%d%d",&n,&k,&m);
 6     for(int i=1,x;i<=k;++i)scanf("%d",&x),sp[x]^=1,sp[x+1]^=1;
 7     for(int i=1;i<=n+1;++i)if(sp[i])p[pc]=i,pc++;
 8     for(int i=1;i<=m;++i)scanf("%d",&stp[i]);
 9     for(int i=0,h,t;i<pc;++i){
10         memset(dt,0x3f,sizeof dt);dt[p[i]]=0;q[h=t=1]=p[i];
11         for(;h<=t;++h){
12             for(int j=1;j<=m;++j){
13                 if(q[h]+stp[j]<=n+1&&dt[q[h]+stp[j]]>dt[q[h]]+1)dt[q[++t]=q[h]+stp[j]]=dt[q[h]]+1;
14                 if(q[h]-stp[j]>0&&dt[q[h]-stp[j]]>dt[q[h]]+1)dt[q[++t]=q[h]-stp[j]]=dt[q[h]]+1;
15             }
16         }for(int j=0;j<pc;++j)bp[i][j]=dt[p[j]];
17     }
18     memset(dp,0x3f,sizeof dp);dp[0]=0;
19     for(int s=0;s<(1<<pc)-1;++s){
20         int fs;
21         for(int j=0;j<pc;++j)if(!(s&1<<j)){fs=j;break;}
22         for(int j=fs+1;j<pc;++j)if(!(s&1<<j))dp[s|1<<fs|1<<j]=min(dp[s|1<<fs|1<<j],dp[s]+bp[j][fs]);
23     }
24     printf("%d\n",dp[(1<<pc)-1]>6666666?-1:dp[(1<<pc)-1]);
25 }

T2:回文子串

题意:给定一个字符串,支持区间改为某一个字符,询问区间长度小于等于$k$的回文串个数。$n,m\le 50000,k\le 50$

突破口自然在$k$。除非你像cbx大神直接n2过。

维护i一个数组$a_{i,j}$表示以$j$结尾的长度为$i$的回文串是否存在$(0/1)$。查询就直接区间$k$次区间和。

如果修改的区间很长,那么对于$[l+k-1,r]$这些位置它们一定都是$1$。区间赋值。

而对于$[l,l+k-1],[r+1,r+k]$这两部分暴力重构,长度很短所以复杂度可以接受。

维护$50$个线段树。对于查询字符串,于是再开个线段树维护字符串。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define lc p<<1
 4 #define rc p<<1|1
 5 #define md (cl+cr>>1)
 6 #define S 222222
 7 char rs[S];int k,q,s[S],ss[S],n;unsigned long long h1[S],h2[S],pw[S];
 8 int palin(int l,int r){return h1[r]-h1[l-1]*pw[r-l+1]==h2[l]-h2[r+1]*pw[r-l+1];}
 9 void build_str(int p,int cl,int cr){
10     if(cl==cr){s[p]=rs[cl]-‘a‘+1;return;}
11     build_str(lc,cl,md);
12     build_str(rc,md+1,cr);
13 }
14 void down_str(int p){if(s[p])s[lc]=s[p],s[rc]=s[p],s[p]=0;}
15 void ask_str(int l,int r,int p=1,int cl=1,int cr=n){
16     if(cl==cr){ss[cl]=s[p];return;}
17     down_str(p);
18     if(l<=md)ask_str(l,r,lc,cl,md);
19     if(r>md)ask_str(l,r,rc,md+1,cr);
20 }
21 void chg_str(int l,int r,int w,int p=1,int cl=1,int cr=n){
22     if(l<=cl&&cr<=r){s[p]=w;return;}
23     down_str(p);
24     if(l<=md)chg_str(l,r,w,lc,cl,md);
25     if(r>md)chg_str(l,r,w,rc,md+1,cr);
26 }
27 struct Segment_Tree{
28     int w[S];bool lz[S];
29     void chg(int l,int r,int p=1,int cl=1,int cr=n){
30         if(l<=cl&&cr<=r){w[p]=cr-cl+1;lz[p]=1;return;}
31         if(l<=md)chg(l,r,lc,cl,md);
32         if(r>md)chg(l,r,rc,md+1,cr);
33         w[p]=w[lc]+w[rc];
34     }
35     void rebuild(int l,int r,int p=1,int cl=1,int cr=n){
36         if(cl==cr){w[p]=ss[cl];return;}
37         if(lz[p])w[lc]=md-cl+1,w[rc]=cr-md,lz[lc]=lz[rc]=1,lz[p]=0;
38         if(l<=md)rebuild(l,r,lc,cl,md);
39         if(r>md)rebuild(l,r,rc,md+1,cr);
40         w[p]=w[lc]+w[rc];
41     }
42     int ask(int l,int r,int p=1,int cl=1,int cr=n){
43         if(r<l)return 0;
44         if(l<=cl&&cr<=r)return w[p];
45         if(lz[p])w[lc]=md-cl+1,w[rc]=cr-md,lz[lc]=lz[rc]=1,lz[p]=0;
46         return (l<=md?ask(l,r,lc,cl,md):0)+(r>md?ask(l,r,rc,md+1,cr):0);
47     }
48 }T[55];
49 int main(){//freopen("2.in","r",stdin);freopen("A.out","w",stdout);
50     scanf("%s%d%d",rs+1,&k,&q);n=strlen(rs+1);build_str(1,1,n);
51     pw[0]=1;for(int i=1;i<=k+1;++i)pw[i]=pw[i-1]*29;
52     for(int i=1;i<=n;++i)h1[i]=h1[i-1]*29+rs[i]-‘a‘+1;
53     for(int i=n;i;--i)h2[i]=h2[i+1]*29+rs[i]-‘a‘+1;
54     for(int len=2;len<=k;++len){
55         for(int i=len;i<=n;++i)ss[i]=palin(i-len+1,i);
56         T[len].rebuild(len,n);
57     }
58     while(q-->0){
59         int opt,l,r,L,R;scanf("%d%d%d",&opt,&l,&r);
60         if(opt==1){
61             scanf("%s",rs);chg_str(l,r,rs[0]-‘a‘+1);L=max(1,l+1-k);R=min(n,r+k-1);
62             if(r-l+1<=k){
63                 ask_str(L,R);
64                 for(int i=L;i<=R;++i)h1[i]=h1[i-1]*29+ss[i];
65                 for(int i=R;i>=L;--i)h2[i]=h2[i+1]*29+ss[i];
66                 for(int len=2;len<=k;++len){
67                     for(int i=l;i<=R;++i)ss[i]=i>=len?palin(i-len+1,i):0;
68                     T[len].rebuild(l,R);
69                 }
70             }else{
71                 ask_str(L,l+k-1);
72                 for(int i=L;i<=l+k-1;++i)h1[i]=h1[i-1]*29+ss[i];
73                 for(int i=l+k-1;i>=L;--i)h2[i]=h2[i+1]*29+ss[i];
74                 for(int len=2;len<=k;++len){
75                     for(int i=l;i<=l+len-2;++i)ss[i]=palin(i-len+1,i);
76                     T[len].rebuild(l,l+len-2);
77                 }
78                 ask_str(r-k+1,R);
79                 for(int i=r-k+1;i<=R;++i)h1[i]=h1[i-1]*29+ss[i];
80                 for(int i=R;i>=r-k+1;--i)h2[i]=h2[i+1]*29+ss[i];
81                 for(int len=2;len<=k;++len){
82                     for(int i=r+1;i<=r+len-1&&i<=n;++i)ss[i]=palin(i-len+1,i);
83                     T[len].rebuild(r+1,min(n,r+len-1));
84                 }
85                 for(int len=2;len<=k;++len)T[len].chg(l+len-1,r);
86             }
87         }else{
88             int ans=r-l+1;
89             for(int i=2;i<=k&&i<=r-l+1;++i)ans+=T[i].ask(l+i-1,r);
90             printf("%d\n",ans);
91         }
92     }
93 }

T3:最大权值

题意:$n$物品有参数$a,b$,选出$k$件任意排列的价值为$\sum b+a\times (p-1)$。求对所有$1\le k \le n$的最大价值。

$n \le 300000, a \le 10^6,b \le 10^{12}$

大神都用$\% d$读$b$。

显然(?)选$k$个物品时的集合是$k+1$时的子集,其实只是插入一个元素其余相对位置不变。

设$dp_{i,j}$表示考虑前$i$个物品选出$j$个的最大收益,做个差分就是每个元素的贡献,设为$g$。

打表发现$dp$转移时两种转移之间有一个明确的分界。考虑二分。

每个点的贡献就是按照题意那么维护,插入一个点之后它左端的点权值不变,右端的要增加一个$a_i$。

插入,区间加,二分。$splay$

不难写。不好想。

$splay$上二分以及$dp$打表都是挺好的思路,记一下。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define S 333333
 4 struct ps{
 5     long long a,b;
 6     friend bool operator<(ps x,ps y){return x.a<y.a;}
 7 }P[S];
 8 int n,c[2][S],f[S],sz[S],s[S],rt,I,C;long long lz[S],w[S],g[S];
 9 void down(int p){
10     if(!lz[p])return;
11     w[c[0][p]]+=lz[p];lz[c[0][p]]+=lz[p];
12     w[c[1][p]]+=lz[p];lz[c[1][p]]+=lz[p];
13     lz[p]=0;
14 }
15 void up(int p){sz[p]=sz[c[0][p]]+sz[c[1][p]]+1;}
16 void spin(int p){
17     int F=f[p],G=f[F],d=c[1][F]==p,B=c[!d][p];
18     if(G)c[c[1][G]==F][G]=p; c[d][c[!d][p]=F]=B;
19     if(B)f[B]=F; f[f[F]=p]=G;
20     up(p);up(F);
21 }
22 void splay(int p){
23     int F=p,tp=0;while(F)s[++tp]=F,F=f[F];while(tp)down(s[tp]),tp--;
24     for(;F=f[p];spin(p))if(f[F])spin(c[1][f[F]]==F^c[1][F]==p?p:F);rt=p;
25 }
26 void find(int p){
27     int lp,tsz=0,d;
28     while(p){
29         down(p);
30         if(w[p]>P[I].a*(tsz+sz[c[0][p]])+P[I].b)tsz+=sz[c[0][p]]+1,p=c[d=1][lp=p];
31         else p=c[d=0][lp=p];
32     }
33     f[I]=lp;c[d][lp]=I;w[I]=P[I].a*tsz+P[I].b;sz[I]=1;
34     splay(I);lz[c[1][I]]+=P[I].a;w[c[1][I]]+=P[I].a;
35 }
36 void dfs(int p){
37     if(!p)return;
38     down(p);
39     dfs(c[0][p]);
40     g[++C]=w[p];
41     dfs(c[1][p]);
42 }
43 int main(){//freopen("1.in","r",stdin);
44     scanf("%d",&n);
45     for(int i=1;i<=n;++i)scanf("%lld%lld",&P[i].a,&P[i].b);
46     sort(P+1,P+1+n);
47     rt=1;w[1]=P[1].b;sz[1]=1;
48     for(I=2;I<=n;++I)find(rt);
49     dfs(rt);
50     for(int i=1;i<=n;++i)g[i]+=g[i-1],printf("%lld\n",g[i]);
51 }

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

时间: 2024-10-14 06:50:12

[考试反思]0114省选模拟7:迷离的相关文章

[考试反思]0113省选模拟6:过载

真累啊...离上次放假也挺久,离下次放假也挺久,离上次放出去玩也挺久,离下次放出去玩还不知道有多久... 好累啊...大脑基本成天在挂机了.什么也不想干了... 持续状态不佳.但是今天运气好,所以考试排名看起来还可以. T1没认真读题也没看数据范围,以为是送分题,17分钟写完交了...然后我就把分送出去了 像个弱智一样...但是现在的精神状态的确不太能支持好好做题 幸亏T2是个比较简单的SAM+dp,思维量不大,脑子宕机的时候也能写一写. (归功于当时给大家讲课时稍微有一点理解,要是其它的板子我

[考试反思]0117省选模拟10:争夺

T3出了一点锅,于是按IOI赛制打的. 可能也是这辈子唯一一次好好打的IOI赛制了. 提答,又沉里面了,进去就出不来.莫名的虚荣让我根本没有回头看传统题. 于是的确在T3的80%时间里一直单题rk1,然而其实很慌,剩下两道题又怎样? 运气好,T1特别水,T2数据水,T3用奇技淫巧多拿7分于是并列rk1了. 数组没清空丢了1分... 状态差的不行,一下午一道题都没改出来...咕到第二天也没改出来 于是在第二天考试的时候写完三个暴力之后终于把T2A了... 然后第二天考试就炸了,没什么好说的 T1:

[考试反思]0130省选模拟13:悔恨

0+30+20=50.rk8 关键在于: T1写错个变量名挂了100分 kxkxkxkx(激动的语无伦次) 考试过程?上来看T1,一个比较裸的基环树dp,断开环上一条边之后大概就是一个稍加改动的最大独立集. 思路不难想,细节倒是有一点,考场上调啊调啊过了样例又手模了各种数据都过了两个半小时之后很开心就扔了. 然后看T2/3啥都不会,写了俩随机化就走了. 然而T3随机化+贪心是可以AC的.正确性不知道...没写... 最后还有5分钟回T1,突然发现T1可以不是基环树而是基环树森林??? 啊修锅修锅

[考试反思]0220省选模拟27:怪异

怪异的一场考试.考的有点懵 $T1$正解是模拟,人人都能切,然而也没有多少人敢笃定这就是正解吧,常数和精度上下卡着,看运气的题了. $T2$想到了第二档分其实离正解就不远了但是时间不够没往下想.回$T1$卡常去了. $T3$不给状压分,于是猜到一条结论之后并不敢往下想... 然而最后$T1$也没有卡过,考后也在这破玩意上浪费了不少时间... 而且$T3$数据特别谁水暴力可以过,然而因为我不会决策点单调,所以学了学知识点,并没有用暴力水过... T1:飞行棋 大意:长度为$n$的序列,$m$人.每

[考试反思]0410省选模拟67:迷惑

现在想想,先做$T3$真乃人间迷惑行为. 部分分不多的一场考试,$T1$部分分最多结果没花时间光荣爆零,结果正解真的就是一个暴力+大力分类讨论 $T2$也比较可想,然而看着$75pts$的子任务心中有几分慌张,苟了个暴力跑路了. 结果一个弱智$T3$的$10pts$部分分$O(n^8)$暴写了$2.8k$.从这代码长度看是不是$10pts$您施舍的有点少啊. 其余部分分一点用没有,不知道咋想的. T1:链 大意:维护操作:加边,询问有几个点满足:删掉之后图中剩下的都是若干链.$n,m \le 2

[考试反思]1219省选模拟3: 释怀

有些东西渐渐就远去了...不必挂念. 只有时间才拥有如此力量.我们能做的,唯有释怀. 这次的题格外顺手,大概是我的强项了. 但是考得还是不够好吧...感觉可以更高的 今天迎来了学了OI一年多比较重要的一个成就:(虽说是在考后) AC1000道题!还是挺不容易的. 第1000道题是今天的T3.大部分是自己思考的,题也不是很简单,挺好的. 挺过了联赛,现在想要等到下一次整百,可能就要到3月份了. 我还能在OI多久呢? 回到这场考试. T1的数据范围只有10000,让我想起了ALO那道题50000数据

[考试反思]0110省选模拟5:信仰

又倒一啦 10分真是个熟悉的成绩(虽然没有爆零熟悉) 状态一直低迷,没什么好说的 答题策略的话...就那样吧 一眼看出T1是结论题,没有部分分,不好写. 但T2是伯努利数的差不多是模板题了,于是就奔着它去了. 没有注意$0^0=1$.过不去样例最后交的暴力 没有抽时间认真打T3的暴力,因为至多30分. 因为现在30分和0分对我来说是一样的.我是要靠着省选翻盘,拿大众分的话肯定还是退役,求个稳,4个月白学. 现在的答题策略的确不能像联赛时一样了.现在求稳是赢不了了,在稳住200和争取230里我可能

[考试反思]0122省选模拟12:延迟

博客咕过了一年我也就忘了我考试状态了2333. T1是弱智题但是没想...写个暴力跑路了(时间不够,主要投在T2/3上了) 然而其实想到了一个乱搞,觉得能得分的概率不大,结果数据奇水完全不对的玩意还有20分,然而我并没有写... 然而T2写的是正解,虽说没有其他人的状压优秀,T了一个细节WA了一个拿了80分,凑合吧. 然后T3时间不多的时候写的,拿个暴力,想到了正解大概怎么写但是没有写,太恶心. 考后改题写了写,一下午就过去了...一晚上也就过去了...弄得跟我颓废了半天一样... 然而是真xx

[考试反思]0201省选模拟15:分界

30+10+30+100=170 rk13 17岁的第一仗出师不利. 和外校联考,所以难度不高?后三道题非常简单基本上都是裸的. 但是我做的这是个啥啊... T2广义后缀自动机板子写挂,如果儿子是nq就把儿子修改成nq... T3想到正解然后算错复杂度结果觉得都可以写个简单的于是就把暴力交了上去. T1猜到了第一个结论不会分块暴力也没想到数位dp... 考试前就感觉今天要炸,结果就真炸了. 又当了一次改题大神.半小时一道,中午没睡觉就直接改完了. 下午在uoj上乱跑找好题做ppt.效率挺低的.