[CSP-S模拟测试48]反思+题解
状态很垃圾的一场考试。感觉“这么多分就够了”的心态很是在给自己拖后腿。
打开题面,第一页赫然写着:$Claris' Contest$。
吓得我差点手一抖关掉。不过后来想想似乎强到变态的人出的题都不是很不可做?大概是实力越强越能体会弱者的难处吧。
看T1:woc 字符串?完蛋完蛋。
T2:什么啊?图上乱搞?
T3:最短路?边都建不出来。
回去又读了一遍T1发现是sbDP,一眼切了开始码。结果死调不出来,考试开始25min的时候真的是有点慌,这么水的题别人估计都10min以内解决,我都调了快20min还是过不了手玩样例。好在用了35min调过了。
T2无向图的限制让我很是没思路,于是先把T3暴力打了。打的时候想到可以拆点考虑每个二进制位,但是没想具体实现。
回来搞T2发现$O(n^4)$的暴力很好打,淼之。
然后就假装自己在想题实际上无所事事的过了1h……一直没想出T2其他的可行思路,主要是不知道无向图怎么传递信息(没有拓扑这种好东西)。
之后突然想到可以把$O(n^4)$优化到$O(n^3)$,码了个对拍没出错。$210pts\ get!$
优化到$n^3$之后发现这已经是优化枚举的瓶颈了,更加确定正解不是这个。想了一下$bitset$用于传递环信息但是好像不行。
T3也没有想着拿下一档分,拆点的思路有点偏了。
然而T2正解就是$bitset$优化三元环计数,T3就是拆点……而且70分很好拿……
A.String Master
无脑dp。LCS加一维、多一层循环枚举修改次数即可。复杂度$O(n^3)$。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=305;
int n,K,dp[N][N][N];
char a[N],b[N];
int main()
{
scanf("%d%d",&n,&K);
scanf("%s",a+1);scanf("%s",b+1);
int ans=0;
for(int k=0;k<=K;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j])dp[i][j][k]=max(dp[i-1][j-1][k]+1,dp[i][j][k]);
else if(k)
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k-1]+1);
ans=max(ans,dp[i][j][k]);
}
}
}
cout<<ans<<endl;
return 0; }
B.Tourist Attractions
最暴力的方法当然是四层循环枚举方案。如果记录一下每个点的度数,统计时直接用$deg[x]-1$减去三元环的情况就可以去掉一层循环。但显然我们不能用这样的方式再去一层了。
那么可以只枚举四元环中间的两个点,把他们的度数-1再相乘后减去三元环的情况。怎么求三元环的情况数呢?用bitset维护每个点的联通集合,两个点的bitset与一下就是答案了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<bitset>
using namespace std;
const int N=1505,M=2500000;
typedef long long ll;
int n;
int to[M],head[N],nxt[M],deg[N],tot;
ll ans;
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
deg[y]++;
}
char s[N];
bitset<N> link[N];
int main()
{
/*freopen("dt.in","r",stdin);
freopen("my.out","w",stdout);*/
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=n;j++)
{
int e=s[j]-'0';
if(e)add(i,j),link[i][j]=1;
}
}
for(int x=1;x<=n;x++)
{
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
ans+=1LL*(deg[x]-1)*(deg[y]-1)-(link[x]&link[y]).count();
}
}
cout<<ans<<endl;
return 0;
}
C.Walk
边权为1所以求最短路直接bfs就好了。把二进制数看作集合,那么题目要求的就是一个点要与$val$值是它$val$的子集的点连边。把所有$val$都看作点,对于每个点,让它的$val$对它连边。bfs入队的时候暴力枚举子集就可以让所有相连的点入队,由于每个点只有首次入队是有用的,所以可以把枚举过的子集记忆化一下减少重复操作。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=200005,M=300005;
int n,m,w[N];
int to[M],head[N],nxt[M],tot;
vector<int> g[(1<<20)+5];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int dis[N],vis[(1<<20)+5];
queue<int> q;
void relink(int val,int x,int pre)
{
if(vis[val])return ;
vis[val]=1;
for(int i=0;i<g[val].size();i++)
{
int y=g[val][i];
if(dis[y]==-1)dis[y]=dis[x]+1,q.push(y);
}
for(int i=pre+1;i<=20;i++)
if((val>>i)&1)relink(val^(1<<i),x,pre+1);
} int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
w[i]=read(),g[w[i]].push_back(i);
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y);
}
memset(dis,0xFF,sizeof(dis));
q.push(1);dis[1]=0;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(dis[y]==-1)dis[y]=dis[x]+1,q.push(y);
}
relink(w[x],x,-1);
}
for(int i=1;i<=n;i++)
printf("%d\n",dis[i]);
return 0;
}
[CSP-S模拟测试48]反思+题解的更多相关文章
- [CSP-S模拟测试50]反思+题解
??大部分人都觉得T3是道不可做题去刚T1T2了,于是我就侥幸苟到了前面? 这场考试比较成功的就是快速水掉了T1T2的部分分,1h拿到88分起码为之后硬肝T3上了保险(赛后发现就算T3爆零也能rank ...
- [CSP-S模拟测试47]反思+题解
打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...
- [NOIP模拟测试37]反思+题解
一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...
- [NOIP模拟测试34]反思+题解
不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...
- [NOIP模拟测试32]反思+题解
又考挂了QAQ 总rank直接滑出前20 晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了. T1一眼推柿子,然而并没有头绪所以先码了个暴力.然后…… 一个垃圾暴力我调了1h,大概解决了两位数 ...
- 2019.9.20 csp-s模拟测试48 反思总结
头疼,不说废话了,祝大家rp++. T1: 暴力枚举,n3. 枚举两个串开始匹配的位置,每一次尽量修改. #include<iostream> #include<cstdio> ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
随机推荐
- Java总结第一期
神奇的小阳阳阳再度归来,大家一定想我了吧~哦,谢谢,谢谢,谢谢各位的掌声,thank you,thank you@ 第一章: 下面给大家简单介绍Java: Java技术可以应用在几乎所有类型和规模的设 ...
- 4 November in ss
Contest A. 输油管道问题 某石油公司计划建造一条由东向西的主输油管道.该管道要穿过一个有 \(n\) 口油井的油田.从每口油井都要有一条输油管道沿最短路经 (或南或北) 与主管道相连.如果给 ...
- laravel框架手动删除迁移文件后再次创建报错
手动删除laravel框架数据表迁移文件后再次创建报错 如下图: 执行创建操作之后会在autoload_static.php及autoload_classmap.php这两个文件中添加迁移文件的目录. ...
- Design:设计目录
ylbtech-Design:设计目录 1.返回顶部 1.0 蚂蚁设计 https://design.alipay.com 1.1 Ant Design - 一个 UI 设计语言 https://an ...
- Javascript对checkbox勾选判断,错误提示和按钮变色操作
同意相关条款未打钩时,登录按钮为灰色且无法提交,点击灰色的登录按钮提示同意相关条款,打钩后变成亮色且可以提交信息. 勾选框及文字: <div class="check-rule&quo ...
- 如何理解c++迭代器(上)
1.如何理解迭代器?迭代器不是指针,也似乎不是string这种类型 参考:迭代器与指针的区别是? C++map迭代器的++操作是如何实现的?讨论.iterator提供了遍历STL容器里元素的方式,no ...
- 4.jmeter在线并发的怎样设置
4.1Jmeter 快速入门教程(一) - 认识jmeter和google插件 4.2Jmeter 快速入门教程(二)--创建简单web测试 打印 E-mail 4.3Jmeter 快速入门教程(三- ...
- Vue中src属性绑定的问题
地址:https://blog.csdn.net/qq_25479327/article/details/80082520 地址:https://blog.csdn.net/sinat_3655513 ...
- [fw]awk求和
suse11:~ # cat tmp.lst 4096 4 4096 4 4096 2 4096 4 8192 1 8192 4 8192 4 8192 4 8192 4 8192 4 8192 4 ...
- Vue证明题
看来我需要对我的vue能力做一个证明了~~ 最近辞职了,又逢病重,找工作的时候发现对vue要求蛮高的,说会不行,还必须要有过vue的项目. 我这种半路出家的哪里来的vue的项目,公司又不是那种一线互联 ...