状态很垃圾的一场考试。感觉“这么多分就够了”的心态很是在给自己拖后腿。

打开题面,第一页赫然写着:$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]反思+题解的更多相关文章

  1. [CSP-S模拟测试50]反思+题解

    ??大部分人都觉得T3是道不可做题去刚T1T2了,于是我就侥幸苟到了前面? 这场考试比较成功的就是快速水掉了T1T2的部分分,1h拿到88分起码为之后硬肝T3上了保险(赛后发现就算T3爆零也能rank ...

  2. [CSP-S模拟测试47]反思+题解

    打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...

  3. [NOIP模拟测试37]反思+题解

    一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...

  4. [NOIP模拟测试34]反思+题解

    不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...

  5. [NOIP模拟测试32]反思+题解

    又考挂了QAQ 总rank直接滑出前20 晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了. T1一眼推柿子,然而并没有头绪所以先码了个暴力.然后…… 一个垃圾暴力我调了1h,大概解决了两位数 ...

  6. 2019.9.20 csp-s模拟测试48 反思总结

    头疼,不说废话了,祝大家rp++. T1: 暴力枚举,n3. 枚举两个串开始匹配的位置,每一次尽量修改. #include<iostream> #include<cstdio> ...

  7. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  8. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  9. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

随机推荐

  1. delphi 解决RichViewEdit乱码问题

    ⑴ 设置RichViewEdit下面的几个属性: ① RTFReaderProperties → ParaStyleMode → rvrsAddIfNeeded ② RTFReaderProperti ...

  2. opencc模块用langconv替换

    将一下两个py下载并放入代码目录:https://raw.githubusercontent.com/skydark/nstools/master/zhtools/langconv.py https: ...

  3. NGINX配置之二: nginx location proxy_pass 后面的url 加与不加/的区别.

    这里我们分4种情况讨论 这里我们请求的网站为:192.168.1.123:80/static/a.html 整个配置文件是 server{ port 80, server name 192.168.1 ...

  4. (转)使用InfluxDB+cAdvisor+Grafana配置Docker监控

    文档来源 文档来源:How to setup Docker Monitoring 由garyond翻译.校正及整理 Docker监控简介 我们提供的Docker主机和容器越来越多,对Docker服务器 ...

  5. Thrift报错:Error: Thrift compiler: Failed to translate files. Error: Cannot run program thrift error=2

    文章目录 报错: 原因: 解决: 报错: Error: Thrift compiler: Failed to translate files. Error: Cannot run program th ...

  6. Html5 学习笔记 【PC固定布局】 实战3 热门旅游展示区

    最终效果图: html 代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta char ...

  7. RQNOJ PID331 家族

    题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是 ...

  8. C# 获取微信小程序access_token

    /// <summary> /// 获取access_token /// </summary> /// <returns></returns> publ ...

  9. Redis 系列(02)数据结构

    目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...

  10. BZOJ 4657 (网络流)

    题面 Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. 攻击方法是:对于 ...