2021-11-13模拟赛总结

今天的模拟赛,总体还不错,基本保持了正常的水平,只挂了T4的 $10pts$。T1不是很难,30分钟写完了线性的正解,切掉了之后心情大好(好久没切题了qaq),T2是一个类似于数学的题目,看到数据范围误以为是矩乘,于是一直在想递推的式子,结果走入了歧途。没办法,只能打了个 $30pts$ 的暴力走人。去看后两个题,T4发现是一个类似于容斥的dp,但是之前练习的太少,以为是自己想错了,去考虑了状压,结果只能写了个 $10pts$ 的暴力。T3指数级别的暴力最后时间不多没有写完,非常可惜。

T1

从后向前扫,对坐标变换进行维护,最后映射到字符串里即可,时间复杂度 $O(n+k)$。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 500000 + 10;
 4 int n,k,ox;
 5 int pos[N],a[N],op[N],vis[N],lst[N];
 6 char s[N],ans[N];
 7 signed main()
 8 {
 9     freopen("reverse.in","r",stdin);
10     freopen("reverse.out","w",stdout); 
11     scanf("%d%d",&n,&k);
12     for(int i = 1;i <= n;i++) cin >> s[i];
13     for(int i = 1;i <= k;i++)
14     {
15         scanf("%d",&a[i]);
16         vis[a[i]] = 1;
17     }
18     for(int i = k;i >= 1;i--) op[a[i]] = ((i & 1) == (k & 1)) ? 1 : 0;
19     for(int i = n;i >= 1;i--) lst[i] = vis[i] ? i : lst[i+1];
20     for(int i = n;i >= 1;i--)
21     {
22         if(not lst[i])
23         {
24             pos[i] = i;
25             continue;
26         }
27         if(vis[i]) op[i] ? ox = ox + i + 1 : ox = ox - i - 1;
28         pos[i] = op[lst[i]] ? ox - i : ox + i;
29     }
30     for(int i = 1;i <= n;i++)
31         ans[pos[i]] = s[i];
32     for(int i = 1;i <= n;i++) cout << ans[i];
33     //for(int i = 1;i <= n;i++) cout << pos[i] << " ";
34     printf("\n");
35     return 0;
36 }
View Code

T2

智障的数学题,打表找规律后存解二分即可。赛时写了暴力枚举,没有想到可以打表做,经验+1qaq。(被降智了)

T3

计数DP,dp能力还是太弱,赛时尝试去写区间dp但没有成功,dp真的是……赛前继续加强练习

T4

容斥DP,想到了,但自我否定。容斥DP联系过少,需要把之前落的题补一下。。。(误以为是状压)。写的指数级暴力超时了(还在调)

期望:$100+30+0+10=140$

实际:$100+30+0+0=130$

统一评测:$100+30+0+16=146$

posted @ 2021-11-13 16:08  一程山雪  阅读(31)  评论(0)    收藏  举报