一个人有表里两面,你能看到的,仅仅是其中一面而已。

前言

看着这套题非常不可做,但是经历的所有的模拟赛中,这次还是第一次切题(惭愧)

本来 T1 我 1h 就码完了,交了一遍 TLE90 然后后来两个小时的时候感觉不太稳,就开了氧气又交了一遍。。。

然后,就比 yspm 的提交晚了 10min ,痛失首 A。

T1 遗忘之祭仪

解题思路

小水题一道。

我打的是 \(n^4\) 的做法,但是剪枝完也就是差不多 \(n^2\) 的复杂度了。。

直接暴力扫,判断是不是可以放符卡,可以的话直接放就好了。

然后对于所谓的 \(n^2\) 的做法无非是通过 X 进行配对而已(好像没啥差别)

code

#include<bits/stdc++.h>
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=1e3+10,INF=2e9;
int T,n,m,a,b,dsum,fksum;
bool s[N][N],opt[N][N];
char ch[N];
void solve()
{
for(int i=1;i<=n-a+1;i++)
for(int j=1;j<=m-b+1;j++)
{
if(!s[i][j]&&opt[1][1]) continue;
bool jud=false;
for(int p=1;p<=a;p++)
{
if(jud) break;
for(int q=1;q<=b;q++)
{
if(!s[i+p-1][j+q-1]&&opt[p][q])
{
jud=true;
break;
}
}
}
if(jud) continue;
for(int p=1;p<=a;p++)
for(int q=1;q<=b;q++)
s[i+p-1][j+q-1]^=opt[p][q];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(s[i][j])
{
printf("No\n");
return ;
}
printf("Yes\n");
}
void init()
{
dsum=0,fksum=0;
n=read();
m=read();
a=read();
b=read();
int aa=0,bb=0,pa=INF,pb=INF;
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=m;j++)
{
s[i][j]=(ch[j]=='x');
dsum+=s[i][j];
}
}
for(int i=1;i<=a;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=b;j++)
{
opt[i][j]=(ch[j]=='x');
fksum+=opt[i][j];
if(opt[i][j])
{
aa=max(aa,i);
pa=min(pa,i);
bb=max(bb,j);
pb=min(pb,j);
}
}
}
a=aa;
b=bb;
if(pa!=1)
{
for(int i=1;i<=a-pa+1;i++)
for(int j=1;j<=b;j++)
opt[i][j]=opt[i+pa-1][j];
a=a-pa+1;
}
if(pb!=1)
{
for(int i=1;i<=a;i++)
for(int j=1;j<=b-pb+1;j++)
opt[i][j]=opt[i][j+pb-1];
b=b-pb+1;
}
}
signed main()
{
T=read();
while(T--)
{
init();
if(a>n||b>m||(!fksum&&dsum)||(fksum&&dsum%fksum!=0))
{
printf("No\n");
continue;
}
solve();
}
return 0;
}

T2 客星璀璨之夜

解题思路

期望题,考场上看错题面,然后暴力就码错了,挂了 30pts

这个题目,正着推好像有些艰难,考虑逆推。

首先枚举星球的个数,然后枚举每一个位置上的坐标从上一层转移过来的概率,进而求出期望值。

对于每一个位置,从上一层转移过来的概率设为 p 则 \(p=\lfloor\frac{2n+1-i}{2}\rfloor\)

对于恒星有如下转移方程:

\[f_{n,i}=(f_{n-1,i}\times p+f_{n-1,i-2}\times (n-p-1)+\dfrac{f_{n-1,i-1}+f_{n-1,i-2}+1}{2})\div n
\]

对于行星有如下转移方程:

\[f_{n,i}=(f_{n-1,i}\times p+f_{n-1,i-2}\times (n-p-1)+\dfrac{f_{n-1,i}+f_{n-1,i-1}+1}{2})\div n
\]

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=6e3+10,mod=998244353;
int n,ans,s[N],inv[N],f[N][N];
void INV()
{
inv[0]=inv[1]=1;
for(int i=2;i<=n*2+1;i++)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
signed main()
{
n=read();
INV();
for(int i=1;i<=2*n+1;i++)
s[i]=read();
for(int i=1;i<=n;i++)
for(int j=2,p=(2*i+1-j)/2;j<=2*i+1;j++,p=(2*i+1-j)/2)
if(j&1) f[i][j]=(f[i-1][j]*p%mod+f[i-1][j-2]*(i-p-1)%mod+(f[i-1][j-1]+f[i-1][j-2]+1)%mod*inv[2]%mod)%mod*inv[i]%mod;
else f[i][j]=(f[i-1][j]*p%mod+f[i-1][j-2]*(i-p-1)%mod+(f[i-1][j]+f[i-1][j-1]+1)%mod*inv[2]%mod)%mod*inv[i]%mod;
for(int i=2;i<=2*n+1;i++)
ans=(ans+f[n][i]*(s[i]-s[i-1])%mod)%mod;
printf("%lld",ans);
return 0;
}

T3 割海成路之日

解题思路

挺好的一个题。

一般的题都是通过链的操作联想到树上。

但是,这个题对于链的操作用的线段树需要有区间的性质,似乎不能上树。。。

因此考虑别的算法。

最容易想到的就是冰茶几,毕竟所有点之间为 1 的边都可以直接缩起来。

但是这个优化好像并没有什么用。

于是我们考虑把 2 也给压进去,但是显然要和 1 做区分。

因此,开两个冰茶几,分别维护压缩路径 1 以及压缩路径 1 和 2 的情况。

接下来有了这个思路就是维护冰茶几的大小。

但是问题又出现了,对于路径 3 我们似乎无法维护。

总不能在搞一个 冰茶几吧。。。。

于是我们选择在每一条 3 所联通的节点上存储下 3 所连接的节点的贡献就好了。

代码实现上有亿点难度。。。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=3e5+10;
int n,m,ans,die[N],s[N],f[N];
int siz[2][N],fa[2][N];//0->1;1->1,2
int tot,head[N],nxt[N<<1],ver[N<<1],edge[N<<1];
void add_edge(int x,int y,int val)
{
ver[++tot]=y;
edge[tot]=val;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int fat,int val)
{
die[x]=fat;
s[x]=val;
for(int i=head[x];i;i=nxt[i])
{
int to=ver[i];
if(to==fat) continue;
dfs(to,x,edge[i]);
}
}
int find(int opt,int x)
{
if(fa[opt][x]==x) return x;
return fa[opt][x]=find(opt,fa[opt][x]);
}
void connect(int opt,int x,int y)
{
int fx=find(opt,x),fy=find(opt,y);
if(fx==fy) return ;
fa[opt][fx]=fy;
siz[opt][fy]+=siz[opt][fx];
}
signed main()
{
n=read();
m=read();
for(int i=1,x,y,val;i<n;i++)
{
x=read();
y=read();
val=read();
add_edge(x,y,val);
add_edge(y,x,val);
}
for(int i=1;i<=n;i++)
{
fa[0][i]=fa[1][i]=i;
siz[0][i]=siz[1][i]=1;
}
dfs(1,0,0);
for(int i=1;i<=n;i++)
{
if(s[i]==1||s[i]==2) connect(1,i,die[i]);
if(s[i]==1) connect(0,i,die[i]);
}
for(int i=1;i<=n;i++)
if(s[i]==3)
f[find(0,die[i])]+=siz[1][i];
for(int i=1,a,b,fro,to;i<=m;i++)
{
a=read();
b=read();
fro=read();
to=read();
if(die[a]==b) swap(a,b);
if(s[b]==3)
{
f[find(0,a)]-=siz[1][b];
f[find(0,die[find(1,a)])]+=siz[1][b];
connect(1,b,a);
s[b]=2;
}
else if(s[b]==2)
{
f[find(0,a)]+=f[b];
connect(0,b,a);
s[b]=1;
}
if(find(1,fro)==find(1,to)) printf("1 ");
else if(find(0,die[find(1,to)])==find(0,fro)) printf("1 ");
else if(find(1,die[find(0,fro)])==find(1,to)) printf("1 ");
else printf("0 ");
ans=siz[1][find(1,fro)]+f[find(0,fro)];
if(s[find(0,fro)]==3) ans+=siz[1][find(1,die[find(0,fro)])];
printf("%lld\n",ans);
}
return 0;
}

7.30考试总结(NOIP模拟28)[遗忘之祭仪·客星璀璨之夜·割海成路之日]的更多相关文章

  1. NOIP 模拟 $28\; \rm 割海成路之日$

    题解 \(by\;zj\varphi\) 用两个集合分别表示 \(1\) 边联通块,\(1,2\) 边联通块 . \(\rm son_x\) 表示当前节点通过 \(3\) 类边能到的 \(2\) 联通 ...

  2. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  3. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  4. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  5. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  6. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  7. 2021.8.4考试总结[NOIP模拟30]

    T1 毛衣衬 将合法子集分为两个和相等的集合. 暴力枚举每个元素是否被选,放在哪种集合,复杂度$O(3^n)$.考虑$\textit{meet in the middle}$. 将全集等分分为两部分分 ...

  8. 2021.7.28考试总结[NOIP模拟26]

    罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...

  9. NOIP 模拟 $28\; \rm 遗忘之祭仪$

    题解 \(by\;zj\varphi\) 直接贪心模拟即可,对于每个点,如果它未被覆盖,直接在这覆盖一次. 每个黑点只会被扫一次,所以总复杂度为 \(\mathcal O\rm (nm)\) Code ...

  10. 2021.9.28考试总结[NOIP模拟64]

    T1 三元组 发现确定\(b,c\)的情况下,\(a\)的值域是连续的.确定\(b\)后\(a+b\)的取值是\([1+b,b+b]\).树状数组维护对每个\(b\)可行的\(c\). 注意取模后取值 ...

随机推荐

  1. mysql 必知必会整理—数据插入和更新还有删除[十]

    前言 简单整理数据插入更新还有删除. 正文 插入: INSERT INTO customers( customers.cust_address, customers.cust_city, custom ...

  2. 力扣610(MySQL)-判断三角形(简单)

    题目: 表: Triangle 写一个SQL查询,每三个线段报告它们是否可以形成一个三角形. 以 任意顺序 返回结果表. 查询结果格式如下所示. 示例1:  解题思路: 判断是否形成三角形的准则是:两 ...

  3. 五分钟学会使用 go modules(含在家办公使用技巧)

    导读:go modules 是 golang 1.11 新加的特性.如今 1.13 都已经发布了第 7 个小版本了,几乎所有大项目均已开始使用,这自然也包括 Kubernetes 生态中的众多项目.笔 ...

  4. AI圈内卷?天池团聚请来专家集体“问诊”

    ​简介: 近期杭州云栖大会上出现了一个"数据博物馆",最吸引眼球的"展品",竟是行业大规模开源数据集.不仅数量多达上百个,还覆盖零售.文娱.工业.医疗.自然科学 ...

  5. [Gin] 传统 for 循环中的语义通用化,在 golang 中使用分号 ; 替代 && 流程控制

    // gin.go // HandlerFunc defines the handler used by gin middleware as return value. type HandlerFun ...

  6. 13.prometheus监控tengine(无用)

    一.环境准备 1.1 docker安装tengine带nginx-module-vts模块(二选一) mkdir /data/ -p cd /data/ # 通过git clone下载已经创建好的do ...

  7. 最强AI直播换脸软件,DeepFaceLive下载介绍

    DeepFaceLive是一款专注于直播实时换脸的AI软件,使用经过长时间训练的人脸模型替换摄像头中的人脸,能够产生接近电影质量的面部合成效果,提供高保真的视觉体验,在新版本中也支持了图片换脸(视频换 ...

  8. Multisim 14.0 安装教程

    1.  安装环境: win 7 64bit + Multisim 14.0 教育版. 2. 安装步骤: step 1:下载安装包NI_Circuit_Design_Suite_14.0***,解压后如 ...

  9. Solution Set - NOI级别真题选做

    [NOI2007] 社交网络 Link&Submission. key:Floyd Floyd求出任意两点间最短路,以及最短路的条数.求点 \(k\) 的答案时枚举所有点对 \(i,j\),若 ...

  10. JUC并发编程学习笔记(一)认知进程和线程

    进程和线程 进程 一个程序,如QQ.exe,是程序的集合 一个进程往往可以包含多个线程,至少包含一个 java默认有两个线程,GC垃圾回收线程和Main线程 线程:一个进程中的各个功能 java无法真 ...