7.30考试总结(NOIP模拟28)[遗忘之祭仪·客星璀璨之夜·割海成路之日]
一个人有表里两面,你能看到的,仅仅是其中一面而已。
前言
看着这套题非常不可做,但是经历的所有的模拟赛中,这次还是第一次切题(惭愧)
本来 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\)
对于恒星有如下转移方程:
\]
对于行星有如下转移方程:
\]
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)[遗忘之祭仪·客星璀璨之夜·割海成路之日]的更多相关文章
- NOIP 模拟 $28\; \rm 割海成路之日$
题解 \(by\;zj\varphi\) 用两个集合分别表示 \(1\) 边联通块,\(1,2\) 边联通块 . \(\rm son_x\) 表示当前节点通过 \(3\) 类边能到的 \(2\) 联通 ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- 5.23考试总结(NOIP模拟2)
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- [考试总结]noip模拟23
因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...
- 2021.8.4考试总结[NOIP模拟30]
T1 毛衣衬 将合法子集分为两个和相等的集合. 暴力枚举每个元素是否被选,放在哪种集合,复杂度$O(3^n)$.考虑$\textit{meet in the middle}$. 将全集等分分为两部分分 ...
- 2021.7.28考试总结[NOIP模拟26]
罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...
- NOIP 模拟 $28\; \rm 遗忘之祭仪$
题解 \(by\;zj\varphi\) 直接贪心模拟即可,对于每个点,如果它未被覆盖,直接在这覆盖一次. 每个黑点只会被扫一次,所以总复杂度为 \(\mathcal O\rm (nm)\) Code ...
- 2021.9.28考试总结[NOIP模拟64]
T1 三元组 发现确定\(b,c\)的情况下,\(a\)的值域是连续的.确定\(b\)后\(a+b\)的取值是\([1+b,b+b]\).树状数组维护对每个\(b\)可行的\(c\). 注意取模后取值 ...
随机推荐
- redis 简单整理——主从拓扑图[二十二]
前言 Redis的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性 可以分为以下三种:一主一从.一主多从.树状主从结构,下面分别介绍. 正文 一主一从结构 一主一从结构是最简单的复制拓扑结构,用 ...
- redis 简单整理——持久化的问题定位和优化[二十一]
前言 Redis持久化功能一直是影响Redis性能的高发地,简单介绍一下持久化的问题定位和优化. 正文 当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创 建子进程,对于大多 ...
- Java:使用POI和泛型生成excel表格
首先创建一个maven项目,导入POI依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifact ...
- 《Effective C#》系列之(六)——提高多线程的性能
一.综述 <Effective C#>中提高多线程性能的方法主要有以下几点: 避免锁竞争:锁的使用会导致线程阻塞,从而影响程序的性能.为了避免锁竞争,可以采用无锁编程技术,如CAS(Com ...
- 力扣283(java)-移动零(简单)
题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 请注意 ,必须在不复制数组的情况下原地对数组进行操作. 示例 1: 输入: nums = [0, ...
- IIncrementalGenerator 增量 Source Generator 生成代码入门 读取 csproj 项目文件的属性配置
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,读取项目里的项目文件属性,从而实现为项目定制的逻辑.或者是读取 NuGet ...
- IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完全限定名
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何从语法分析过程,将获取的语法 Token 转换到语义分析上,比如获取类 ...
- 从改一个老项目开始的PHP踩坑记
php所有版本的地址: https://windows.php.net/downloads/releases/archives/ 访问控制器时省略了index.php报No input file sp ...
- Vue2源码解析-源码调试与核心流程梳理图解
现在VUE3已经有一段时间了,也慢慢普及起来了.不过因为一直还在使用VUE2的原因还是去了解和学了下它的源码,毕竟VUE2也不会突然就没了是吧,且VUE3中很多原理之类的也是类似的.然后就准备把VUE ...
- SpringMVC拦截器配置后端登录校验
引 创建拦截器的方法有多种,可以继承HandlerInterceptorAdapter类,也可实现HandlerInterceptor接口.接口中有三个方法: preHandle:在业务处理器处理请求 ...