test1 3-15 模拟赛1

文章目录

  • 考试复盘
  • matrix
  • set
  • string

考试复盘


首先先说T1T1T1,嗯,发现了列是相互独立的,所以分开考虑了
但是实在没想到线性基,就顺着自己的思路硬搞了505050跑路
老实说,505050分的部分分写得都是迷迷糊糊的,重构了好几遍
幸好过了,不然自己今天就是个圆溜的零光蛋了
在这里插入图片描述

没想到的点:

  1. 线性基
  2. 二进制的加法可以转化为异或
  3. bitset优化

再说T2T2T2,嗯——怎么说呢
想到了枚举最小值,然后线段树找符合的区间[val,val∗2)[val,val*2)[val,val2)
然后想到了三维的过原点立方体
就不会了—— ,主要是之前没碰到过,只做过二维的可以用setsetset整活
这次遇到了,积累!!
幸好有202020的两种颜色数据
可是我还是没拿到
因为忘记减去(0,0,0)(0,0,0)(0,0,0)三元组情况

发生这种过失性丢分的唯一原因就是没有好好分析样例
给自己敲个警钟!!!

没想到的点:

  1. 扫描线
  2. 线段树维护二维

注意的点:

  1. 仔细分析样例

最后说一下T3T3T3
其实很长一段时间是没有看懂题面的
样例也想不懂
是中午吃饭的时候去操场逛了两圈,才想懂了样例题面的意思
回来匆匆敲个暴力,还没过样例,害~

没想到的点:

  1. 后缀数组
  2. 同构字符串的转化——真的学到了!!

不过必须表扬自己认真磕出了样例
那为毛不磕一下T2T2T2的样例!!想穿越回去抽自己
在这里插入图片描述


说一下今天考试的自我感受

  1. 树立了自信心,因为整体来看自己对这套题目的正确性应该是有50%50\%50%的,省选并没有自己想象得那么恐怖
  2. 可以说这一场考试,是有史以来最认真的了,从头到尾都在努力思考,第一次写满了整整一张的思路推理验算,也发现其实在自己一步步的推演下,正解仿佛就只隔了一个教室而已,hhhh
  3. 真的跟着学长们一起,会有那种学习认真的氛围,而且今天确实学到了很多,也觉得他们和自己同班的同学都很强,自己也要继续努力!!!

在这里插入图片描述


matrix

在这里插入图片描述


在二进制下,加法等价于异或

∑k=1nA[i][k]×C[k][j]\sum_{k=1}^nA[i][k]\times C[k][j]k=1nA[i][k]×C[k][j]

∑k∈SC[k][j]=B[i][j]×C[i][j]\sum_{k∈S}C[k][j]=B[i][j]\times C[i][j]kSC[k][j]=B[i][j]×C[i][j]

都是第jjj列,说明每列是相互独立的,那么单独考虑每一列,统计答案时把所有列的方案数乘起来即可

B[i][j]=0B[i][j]=0B[i][j]=0,则等式右边为000

B[i][j]=1B[i][j]=1B[i][j]=1,则等式右边为C[i][j]C[i][j]C[i][j]

因为是异或,所以两边都可以再异或上C[i][j]C[i][j]C[i][j]

∑k∈S′C[k][j]=0\sum_{k∈S'}C[k][j]=0kSC[k][j]=0
在这里插入图片描述**这里尚有问题,提醒自己一下

#include <cstdio>
#include <bitset>
using namespace std;
#define maxn 205
#define mod 998244353
int n, cnt, ans = 1;
int A[maxn][maxn], B[maxn][maxn];
bitset < maxn > lib[maxn], t;int qkpow( int x, int y ) {int res = 1;while( y ) {if( y & 1 ) res = 1ll * res * x % mod;x = 1ll * x * x % mod;y >>= 1;}return res;
}int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )scanf( "%d", &A[i][j] );for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )scanf( "%d", &B[i][j] );for( int j = 1;j <= n;j ++ ) {for( int i = 1;i <= n;i ++ )lib[i].reset();cnt = 0;for( int i = 1;i <= n;i ++ ) {t.reset();for( int k = 1;k <= n;k ++ )if( A[i][k] ) t.flip( k );if( B[i][j] ) t.flip( i );for( int k = 1;k <= n;k ++ )if( t[k] ) {if( lib[k].any() ) t ^= lib[k];else {lib[k] = t;cnt++;break;}}}ans += n - cnt;}ans = qkpow( 2, ans );printf( "%lld\n", ans );return 0;
}

set

在这里插入图片描述


枚举所选集合中最小的权值,forforfor循环扫一遍求出[val,val∗2)[val,val*2)[val,val2) 里所有的物品,这些都是可选的

对于求出的数量用三元组表示r,g,br,g,br,g,b 那么每一种颜色的选择都是[0,r],[0,g],[0,b][0,r],[0,g],[0,b][0,r],[0,g],[0,b]

放在三维坐标里,就是求过原点的一个立方体的体积

考试的时候就只想到了立方体,发现自己只会平面的,所以这道题敲不来

用扫描线维护一维rrr

具体来说就是对于三元组(r,g,b)(r,g,b)(r,g,b)rrr时刻将(g,b)(g,b)(g,b)插进去

从大到小计算

因为在rrr时刻的(g,b)(g,b)(g,b)二元组,一定在r−1r-1r1时刻也是正确的

从小到大,有的二元组会涉及到删除,对于蒟蒻来说不好做,因为我扫描线就很困难了好吧

剩下两维的平面直角坐标系计算围成的面积,以前做过这种题

setsetset或者线段树都可以做

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 500005
struct node {int val, c;node(){}node( int Val, int C ) {val = Val, c = C;}
}v[maxn];
vector < pair < int, int > > G[maxn];
int n;
int tot[3];
long long tree[maxn << 2], tag[maxn << 2], maxx[maxn << 2];bool cmp( node x, node y ) {return x.val < y.val;
} int id( char c ) {if( c == 'R' ) return 0;if( c == 'G' ) return 1;if( c == 'B' ) return 2; 
}void pushdown( int num, int l, int r ) {if( tag[num] ) {maxx[num << 1] = tag[num << 1] = tag[num];maxx[num << 1  |1] = tag[num << 1 | 1] = tag[num];int mid = ( l + r ) >> 1;tree[num << 1] = tag[num] * ( mid - l + 1 );tree[num << 1 | 1] = tag[num] * ( r - mid );tag[num] = 0;}
}void modify( int num, int l, int r, int L, int R, int val ) {if( L <= l && r <= R && maxx[num] < val ) {tree[num] = 1ll * val * ( r - l + 1 );maxx[num] = tag[num] = val;return;}if( l == r ) return;int mid = ( l + r ) >> 1;pushdown( num, l, r );if( L <= mid && maxx[num << 1 | 1] < val )//如果是被完全包含的面积是不进行计算的  这里可以多想想modify( num << 1, l, mid, L, R, val );if( mid < R )modify( num << 1 | 1, mid + 1, r, L, R, val );tree[num] = tree[num << 1] + tree[num << 1 | 1];maxx[num] = max( maxx[num << 1], maxx[num << 1 | 1] );
}int main() {scanf( "%d", &n );int x; char color[3];for( int i = 1;i <= n;i ++ ) {scanf( "%d %s", &x, color );v[i] = node( x, id( color[0] ) );}sort( v + 1, v + n + 1, cmp );G[0].push_back( make_pair( 0, 0 ) );int j = 1;for( int i = 1;i <= n;i ++ ) {while( j <= n && v[j].val < ( v[i].val << 1 ) )tot[v[j].c] ++, j ++;G[tot[0]].push_back( make_pair( tot[1], tot[2] ) );tot[v[i].c] --;}long long ans = 0;for( int i = n;~ i;i -- ) {//扫描线去掉一维 相当于切立方体的厚度 切成厚度为1的多个面状for( int j = 0;j < G[i].size();j ++ )modify( 1, 0, n, 0, G[i][j].first, G[i][j].second + 1 ); //加1是因为这个面积是和原点相围成的 画画图会发现其实需要列拔高一层ans += tree[1];}printf( "%lld", ans - 1 );//不算(0,0,0)return 0;
}

string

在这里插入图片描述


对于一个字符串,将第一次新出现的字符设为000,其余位置赋值为该位置减去上一次字符出现的位置

这样的转化就将同构字符串改写成完全相同的数字串了

这里真的太巧妙了,第一次遇到,记下来!!!

求本质不同的子串就是后缀数组的基础了

所有子串长度−-heightheightheight数组之和

但是!!

题目是处理子串之间的问题

那么就有子串的改写会与原串的改写有出入的问题

就是说子串中第一次出现的某个字符不一定是原串整个串中第一次出现

那么子串该位置就需要修改为000

一共只有262626个字符,所以子串最多只会有262626个位置与原串不一样

可以人为暴力排序

将一段根据修改的000划分成若干段

两个子串的cmpcmpcmp比较,如果是相同的部分就用原串的后缀数组sasasa搞定,更改过的地方就暴力比较

总结一下,代码实现思路

  1. 对原串改写
  2. 对原串后缀数组
  3. 利用原串的后缀数组再次暴力排序后缀
  4. 求出按照新规定下排好的后缀之间的lcplcplcp之和
  5. 子串总长度减去lcplcplcp之和
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 100005struct node {int n, m;int x[maxn], id[maxn], rnk[maxn << 1], h[maxn], sa[maxn], tot[maxn];int st[maxn][20];void suffix( int N, int *s ) {n = N, m = N + 1;for( int i = 1;i <= n;i ++ ) tot[x[i] = s[i]] ++;for( int i = 1;i <= m;i ++ ) tot[i] += tot[i - 1];for( int i = n;i;i -- ) sa[tot[x[i]] --] = i;for( int k = 1;k <= n;k <<= 1 ) {int num = 0;for( int i = n - k + 1;i <= n;i ++ ) id[++ num] = i;for( int i = 1;i <= n;i ++ ) if( sa[i] > k ) id[++ num] = sa[i] - k;memset( tot, 0, sizeof( tot ) );for( int i = 1;i <= n;i ++ ) tot[x[i]] ++;for( int i = 1;i <= m;i ++ ) tot[i] += tot[i - 1];for( int i = n;i;i -- ) sa[tot[x[id[i]]] --] = id[i];for( int i = 1;i <= n;i ++ ) rnk[i] = x[i];x[sa[1]] = num = 1;for( int i = 2;i <= n;i ++ )x[sa[i]] = ( rnk[sa[i]] == rnk[sa[i - 1]] && rnk[sa[i] + k] == rnk[sa[i - 1] + k] ) ? num : ++ num;if( n == num ) break;m = num;}for( int i = 1;i <= n;i ++ ) rnk[sa[i]] = i;int k = 0;for( int i = 1;i <= n;i ++ ) {if( rnk[i] == 1 ) continue;if( k ) k --;int j = sa[rnk[i] - 1];while( i + k <= n && j + k <= n && s[i + k] == s[j + k] ) k ++;h[rnk[i]] = k;}for( int i = 1;i <= n;i ++ ) st[i][0] = h[i];for( int j = 1;j < 20;j ++ )for( int i = 1;i <= n;i ++ )if( i + ( 1 << j - 1 ) > n ) break;else st[i][j] = min( st[i][j - 1], st[i + ( 1 << j - 1 )][j - 1] );}int lcp( int l, int r ) {if( l <= 0 || r <= 0 || l > n || r > n ) return 0;if( l == r ) return n - l + 1;l = rnk[l], r = rnk[r];if( l > r ) swap( l, r );l ++;int i = log( r - l + 1 ) / log( 2 );return min( st[l][i], st[r - ( 1 << i ) + 1][i] );}}SA;
int n;
char s[maxn];
int last[maxn], idx[maxn], t[maxn];
int nxt[maxn][30];int LCP( int x, int y ) {int sx = x, sy = y;x --, y --;int len = 0;for( int i = 0;i < 26 && x + 1 <= n && y + 1 <= n;i ++ ) {int l = SA.lcp( x + 1, y + 1 );if( x + l + 1 < nxt[sx][i] && y + l + 1 < nxt[sy][i] ) return len + l;if( nxt[sx][i] - sx == nxt[sy][i] - sy ) {//如果一段都是相同 就一段段的跳len += nxt[sx][i] - x;x = nxt[sx][i], y = nxt[sy][i];}else {if( nxt[sx][i] - sx < nxt[sy][i] - sy )return len + nxt[sx][i] - x - 1;elsereturn len + nxt[sy][i] - y - 1;}}return len;
}bool cmp( int x, int y ) {int len = LCP( x, y );if( x + len > n || y + len > n ) return x + len > n;int vx = t[x + len], vy = t[y + len];for( int i = 0;i < 26;i ++ )if( nxt[x][i] == x + len ) { vx = 0; break; }for( int i = 0;i < 26;i ++ )if( nxt[y][i] == y + len ) { vy = 0; break; }return vx < vy;
}int main() {scanf( "%d %s", &n, s + 1 );for( int i = 1;i <= n;i ++ ) {int j = s[i] - 'a';if( ! last[j] ) t[i] = n + 1;else t[i] = i - last[j];last[j] = i, idx[i] = i;}SA.suffix( n, t );for( int i = 0;i < 26;i ++ ) nxt[n + 1][i] = n + 2;for( int i = n;i;i -- ) {for( int j = 0;j < 26;j ++ )nxt[i][j] = nxt[i + 1][j];nxt[i][s[i] - 'a'] = i;}for( int i = 1;i <= n;i ++ )sort( nxt[i], nxt[i] + 26 );sort( idx + 1, idx + n + 1, cmp );long long ans = 1ll * n * ( n + 1 ) / 2;for( int i = 1;i < n;i ++ )ans -= LCP( idx[i], idx[i + 1] );printf( "%lld\n", ans );return 0;
}

后记:大概会在周末进行再次复盘,重新消化吸收,顺便看看到时候自己是否会将好不容易转操场想懂的地方又搞懵
走了回家睡觉,现在时间2021/3/15 22:48

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云提供针对Nuget包管理器的缓存加速服务测试

在Visual Studio 2013、2015、2017中&#xff0c;使用的是Nuget包管理器对第三方组件进行管理升级的。而且 Nuget 是我们使用.NET Core的一项基础设施&#xff0c;.NET的软件包管理器NuGet.org是一项面向全球用户搭建的服务&#xff0c;不论用户身在何处&#xff0c;NuGet.org都…

Consumer

Consumer 题意&#xff1a; n个游戏机&#xff0c;有w钱 每个游戏机上有游戏&#xff0c;每个游戏有价格和娱乐值&#xff0c;游戏机有价格&#xff0c;没有娱乐值&#xff0c;玩游戏必须要用对应的游戏机&#xff0c;问娱乐值最大是多少 题解&#xff1a; 有依赖关系的背包…

Loj#6405-「ICPC World Finals 2018」征服世界【模拟费用流,左偏树】

正题 题目链接:https://loj.ac/p/6405 题目大意 给出nnn个点的一棵树&#xff0c;每个点有xix_ixi​个军队&#xff0c;需要yiy_iyi​个军队&#xff0c;你可以移动军队&#xff0c;求使得满足所有点要求的情况下&#xff0c;军队移动路径和的最小值。 1≤n≤2500001\leq n\l…

兰道定理(竞赛图)

所谓兰道定理&#xff0c;就是兰道定下的道理 &#xff08;逃&#xff09; 解析 每条边被规定了方向的完全图叫做竞赛图 竞赛图中&#xff0c;设每个点的出度为uiu_iui​ 显然有&#xff1a; ∑uin(n−1)2\sum u_i\dfrac{n\times(n-1)}{2}∑ui​2n(n−1)​ 而兰道定理的内容是…

test2 3-16 2021 模拟赛two

文章目录考试复盘染色问题芬威克树礼物考试复盘 先说T1T1T1 染色&#xff0c;以为是道数学题&#xff0c;推了有一会儿的公式&#xff0c;从颜色1到颜色m&#xff0c;感觉是dpdpdp转移 发现颜色重叠的方案可以转化为另外一种相邻不重叠的染色 但是推到颜色4的时候就发现自己…

ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案

ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说&#xff0c;差别还是很大的。上一篇ASP.NET Core;图解路由(2.1 earler)详细介绍了原版路由方案的运行机制&#xff…

郊区春游题解

郊区春游 题意&#xff1a; 给定一张图&#xff0c;求从某个起点出发&#xff0c;经过其中R个点&#xff08;R个点给出&#xff09;的最短路径&#xff08;每个点经过且只经过一遍&#xff09; 题解&#xff1a; 首先我们用floyed处理出任意两点的距离 dp[i][j]表示当前状态…

2021牛客暑期多校训练营3A-Guess and lies【dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11254/A 题目大意 现在有一个y∈[1,n]y\in[1,n]y∈[1,n]&#xff0c;BobBobBob每次可以选择问AliceAliceAlice是否y≥xy\geq xy≥x&#xff0c;AliceAliceAlice可以说一次谎。BobBobBob要在最少次数内确定yyy的值&#xf…

CF453C:Little Pony and Summer Sun Celebration(dfs、构造)

解析 比较巧妙的一道题 首先做一棵dfs生成树出来 尝试把它的欧拉序列作为答案 但是这样可能会有的地方不符合条件 如果x点的奇偶性不符合&#xff0c;就在序列中加入一个(x,fa) 同时改变x和fa的奇偶性 显然不会超过4*n 如果根需要改奇偶性怎么办&#xff1f; 最后一次回溯删掉…

开源中国 2018 新增开源软件最受欢迎 TOP 50

本周开源中国陆续公布了两个年度榜单&#xff0c;分别是国产新秀榜 TOP 30 和国产新增榜 TOP 50。由于两个榜单的数据来源都是国内开源项目&#xff0c;所以会有部分项目同时出现在两个榜单上。今天公布的这份榜单 —— 开源中国 2018 新增开源软件最受欢迎 TOP 50&#xff0c;…

简单环题解

简单环 题解: 题目求环的情况 如果我们直接枚举会有很多重复&#xff0c;为了避免重复&#xff0c;我们枚举起点&#xff0c;其他的点的序号都必须比起点大&#xff0c;也就是x->y&#xff0c;x一定小于y dp[i][j]表示的是以i的第一个点作为起点的链的数量&#xff0c;j是…

AT2339-[AGC011C]Squared Graph【黑白染色】

正题 题目链接:https://www.luogu.com.cn/problem/AT2339 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;然后有一张nnn\times nnn的图&#xff0c;每个点是一个二元组(a,b)(a,b)(a,b)。(a,b)(a,b)(a,b)和(c,d)(c,d)(c,d)连边当且仅当aaa和ccc有连边&#xff0c;bbb和…

[树链剖分]List wants to travel,Relief grain,hotel加强版,This world need more Zhu

文章目录B&#xff1a;Relief grainC&#xff1a;hotel加强版B&#xff1a;Relief grain 题目 将一段区间修改的标记变成差分&#xff0c;每次都是连续一段的dfndfndfn序修改 从小到大枚举dfndfndfn&#xff0c;在一段标记的最开头的dfndfndfn插入&#xff0c;最末尾的dfndf…

P4342:[IOI1998]Polygon(区间dp)

一道警钟一样的好题 解析 乍一看&#xff1a; “这不就能量项链嘛&#xff0c;这也蓝&#xff1f;” 然后就愉快的WA掉了… qwq 让我们回归本源&#xff0c;在什么时候可以动态规划&#xff1f; “局部最优解可以带动全局最优解的时候&#xff0c;我们可以使用动态规划算法”…

eShopOnContainers 知多少[8]:Ordering microservice

1. 引言Ordering microservice&#xff08;订单微服务&#xff09;就是处理订单的了&#xff0c;它与前面讲到的几个微服务相比要复杂的多。主要涉及以下业务逻辑&#xff1a;订单的创建、取消、支付、发货库存的扣减2. 架构模式如上图所示&#xff0c;该服务基于CQRS 和DDD来实…

P4229-某位歌姬的故事【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4229 题目大意 求有多少个长度为nnn的序列aaa&#xff0c;满足∀i∈[1,n],ai∈[1,A]\forall i\in[1,n],a_i\in[1,A]∀i∈[1,n],ai​∈[1,A]&#xff0c;还有QQQ个限制形如 max⁡{aj}(j∈[li,ri])mi\max\{a_j\}(j\in[l_i,r_i…

Most Powerful

Most Powerful 题意&#xff1a; n个原子&#xff0c;当其中两个原子碰撞时&#xff0c;其中一个会消失&#xff0c;产生大量能量。现在知道每两个原子的碰撞表现&#xff0c;求出产生的能量总和的最大值 题解: 设dp[i]表示i状态下所获得的能量 i为二进制&#xff0c;第x位…

[树套树] 网络管理

A&#xff1a;[CTSC2008]网络管理 此题本来是平衡树板块的&#xff0c;但俺写的是树套树&#xff0c;平衡树会多个log 题目 查询第kkk大&#xff0c;天然主席树可以维护 就不用了平衡树二分&#xff0c;多个logloglog了 将树上(u,v)(u,v)(u,v)的路径转化为 uuu到根 vvv到根…

[翻译] Entity Framework Core in Action 关于这本书

Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天一篇更新 PS: 翻译难免限于本人水平…

CF573E-Bear and Bowling【dp,平衡树】

正题 题目链接:https://www.luogu.com.cn/problem/CF573E 题目大意 给出一个长度为nnn的序列aaa&#xff0c;求它的一个子序列bbb&#xff0c;要求最大化 ∑i1∣b∣bii\sum_{i1}^{|b|}b_i\times ii1∑∣b∣​bi​i 1≤n≤105,∣ai∣≤1071\leq n\leq 10^5,|a_i|\leq 10^71≤n…