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

30+10+30+100=170 rk13

17岁的第一仗出师不利。

和外校联考,所以难度不高?后三道题非常简单基本上都是裸的。

但是我做的这是个啥啊。。。

T2广义后缀自动机板子写挂,如果儿子是nq就把儿子修改成nq。。。

T3想到正解然后算错复杂度结果觉得都可以写个简单的于是就把暴力交了上去。

T1猜到了第一个结论不会分块暴力也没想到数位dp。。。

考试前就感觉今天要炸,结果就真炸了。

又当了一次改题大神。半小时一道,中午没睡觉就直接改完了。

下午在uoj上乱跑找好题做ppt。效率挺低的。

这几天一直多灾多难。但愿它们在16岁终止吧。

T1:倒计时

大意:给定n,每次可以选择十进制下n的某一位,让n减去这个数。求最少几次能变成0。$n \le 10^{18}$

首先,发现答案有单调性,随着n增加单调不减。所以最优决策是每次去掉最大的数字。可以归纳证明。

如果高位特别小,低位特别大,那么即使高位不一样那么最近的几次决策也都是一样的。

想到这里,设dp[i][j]表示前面的所有数位最大的是i,剩下的数位是j,此时想把较低的这些位操作到0或负数所需要的最少步数,以及在步数最少的前提下操作后低位上是几。

转移直接按照含义来。记忆化搜索。代码特别好写。但是思路想不到啊。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 map<ll,pair<ll,ll> >dp[10];
 5 pair<ll,ll>sch(ll x,ll n){//cout<<x<<‘ ‘<<n<<endl;
 6     if(n==0)return make_pair(0,0);
 7     if(n<=x)return make_pair(1,n-x);
 8     if(n<=9)return make_pair(1,0);
 9     if(dp[x].find(n)!=dp[x].end())return dp[x][n];
10     ll h=n,l=1,ans=0,ls;while(h>=10)h/=10,l*=10;ls=n-h*l-l;
11     while(h>=0){
12         pair<ll,ll>r=sch(max(x,h),l+ls);
13         ans+=r.first;ls=r.second;h--;
14         if(!ls&&h>=0)ans++,ls=-max(x,h+1);
15     }
16     return dp[x][n]=make_pair(ans,ls);
17 }
18 main(){ll n;cin>>n;cout<<sch(0,n).first;}

T2:旅行路线

大意:树,边定向,每个点都能到达1。一条路线可以用路径上每个点度数的序列表示。求本质不同路径数。$n \le 10^5$

本质不同子串树。广义后缀自动机,可以说是模板题了。

写了一遍bfs建树。不怕被卡,心安了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define S 222222
 4 int fir[S],l[S],to[S],ec,f[S],lst=1,pc=1,deg[S],len[S],n,rt[S];long long ans;
 5 map<int,int>c[S];
 6 void link(int a,int b){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;deg[a]++;}
 7 void extend(int C){
 8     int np,nq,q,p=lst;
 9     if(q=c[p][C]){
10         if(len[q]==len[p]+1){lst=q;return;}
11         nq=lst=++pc; c[nq]=c[q]; f[nq]=f[q]; len[nq]=len[p]+1;
12         f[q]=nq; for(;c[p][C]==q;p=f[p])c[p][C]=nq;
13     }else{
14         lst=np=++pc; len[np]=len[p]+1;
15         for(;p&&!c[p][C];p=f[p])c[p][C]=np;
16         if(!p){f[np]=1;return;} q=c[p][C];
17         if(len[q]==len[p]+1){f[np]=q;return;}
18         len[nq=++pc]=len[p]+1; c[nq]=c[q]; f[nq]=f[q]; f[np]=f[q]=nq;
19         for(;c[p][C]==q;p=f[p])c[p][C]=nq;
20     }
21 }
22 void dfs(int p){
23     for(int i=fir[p];i;i=l[i])lst=rt[p],extend(deg[to[i]]),rt[to[i]]=lst;
24     for(int i=fir[p];i;i=l[i])dfs(to[i]);
25 }
26 int main(){
27     scanf("%d",&n);
28     for(int i=1,a,b;i<n;++i)scanf("%d%d",&a,&b),link(b,a);
29     extend(deg[1]-1);rt[1]=lst;dfs(1);
30     for(int i=1;i<=pc;++i)ans+=len[i]-len[f[i]];
31     printf("%lld\n",ans);
32 }

T3:流浪者

大意:一个人从(1,1)出发往右或下走,初始有个hp。有k个坏点。走到坏点时hp=hp+1>>1。求走到(n,m)时的期望hp。$n,m \le 100000, k \le 2000 , hp \le 1000000$

每次除2,所以最多$log$次就变成1了。

容斥+拓扑dp。思路很简单,记录到每个点经过多少坏点的方案数就行,超过log次的特殊处理防止容斥出锅。

因为超出部分的缘故,所以容斥需要在转移过程中进行,这样dp的含义由至少变成了恰好。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mod 1000000007
 4 int n,m,k,s,fac[222222],inv[222222],x[2222],y[2222],dp[2222][2222],ans;
 5 int q[2222],fir[2222],l[6666666],to[6666666],deg[2222],ec,ttpl;
 6 int C(int b,int t){return 1ll*fac[b]*inv[t]%mod*inv[b-t]%mod;}
 7 void link(int a,int b){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;deg[b]++;}
 8 int main(){
 9     fac[0]=inv[0]=inv[1]=fac[1]=1;
10     for(int i=2;i<=200000;++i)fac[i]=fac[i-1]*1ll*i%mod,inv[i]=mod-1ll*mod/i*inv[mod%i]%mod;
11     for(int i=1;i<=200000;++i)inv[i]=inv[i-1]*1ll*inv[i]%mod;
12     scanf("%d%d%d%d",&n,&m,&k,&s);m--;n--;x[k+1]=n;y[k+1]=m;link(0,k+1);
13     for(int i=1;i<=k;++i)scanf("%d%d",&x[i],&y[i]),link(0,i),link(i,k+1),x[i]--,y[i]--;
14     for(int i=1;i<=k;++i)for(int j=1;j<=k;++j)if(i!=j)if(x[i]<=x[j]&&y[i]<=y[j])link(i,j);
15     dp[0][0]=1;
16     for(int h=1,t=1;h<=t;++h)for(int i=fir[q[h]];i;i=l[i]){
17         deg[to[i]]--;if(!deg[to[i]])q[++t]=to[i];long long rt=C(x[to[i]]+y[to[i]]-x[q[h]]-y[q[h]],x[to[i]]-x[q[h]]);
18         for(int j=0;j<=20;++j)dp[j+1][to[i]]=(dp[j+1][to[i]]+dp[j][q[h]]*rt)%mod,dp[j][to[i]]=(dp[j][to[i]]-(j?1:0)*dp[j][q[h]]*rt%mod+mod)%mod;
19     }
20     for(int i=1;i<=20;++i)ans=(ans+1ll*s*dp[i][k+1])%mod,s=s+1>>1;
21     ans=(ans+dp[21][k+1])%mod;
22     printf("%lld\n",1ll*ans*inv[n+m]%mod*fac[n]%mod*fac[m]%mod);
23 }

T4:摆棋子

大意:同《土兵占领

当时的做法好诡异&弱智啊。

然而做了chip那道题之后,土兵占领连想带写也就17分钟。

直接考虑哪些位置放很麻烦,考虑哪些位置可以不放,最大化这个值。

左行右列边是士兵,每行每列不能删太多就是流量限制,每个兵流量为1如果流了就表示不放这个兵。

最大流,没了。1.1k

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,k,fir[222],l[22222],to[22222],v[22222],ec=1,T,X[111],Y[111],ans,d[22222],q[22222],gg[111][111];
 4 void link(int a,int b,int w){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;v[ec]=w;}
 5 void con(int a,int b,int w){link(a,b,w);link(b,a,0);}
 6 bool bfs(){
 7     for(int i=1;i<=T;++i)d[i]=0;d[0]=1;
 8     for(int h=1,t=1;h<=t;++h)for(int i=fir[q[h]];i;i=l[i])if(!d[to[i]]&&v[i])d[q[++t]=to[i]]=d[q[h]]+1;
 9     return d[T];
10 }
11 int dfs(int p,int f){int r=f;
12     if(p==T)return f;
13     for(int i=fir[p];i&&r;i=l[i])if(v[i]&&d[to[i]]==d[p]+1){
14         int x=dfs(to[i],min(r,v[i]));
15         if(!x)d[to[i]]=0;
16         v[i]-=x;v[i^1]+=x;r-=x;
17     }return f-r;
18 }
19 int main(){
20     scanf("%d%d%d",&n,&m,&k);T=n+m+1;
21     for(int i=1,w;i<=n;++i)scanf("%d",&X[i]);
22     for(int i=1,w;i<=m;++i)scanf("%d",&Y[i]);
23     for(int i=1,x,y;i<=k;++i)scanf("%d%d",&x,&y),gg[x][y]=1;
24     for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(!gg[i][j])con(i,j+n,1),X[i]--,Y[j]--,ans++;
25     for(int i=1;i<=n;++i)if(X[i]>0)return puts("No Solution"),0;else con(0,i,-X[i]);
26     for(int i=1;i<=m;++i)if(Y[i]>0)return puts("No Solution"),0;else con(i+n,T,-Y[i]);
27     while(bfs())ans-=dfs(0,1234567);printf("%d\n",ans);
28 }

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

时间: 2024-10-12 07:25:36

[考试反思]0201省选模拟15:分界的相关文章

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

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

[考试反思]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