NOIP模拟21+22
模拟21确实毒瘤。。。考场上硬刚T3 2.5h,成功爆零
T1.数论
看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律。
正解貌似是乱搞,我们考虑一个比较显然的结论:
对于一个质数 p,我们考虑所有仅包含小于 p 的质因子的正整数集 G。不难发现:
• 若 x ∈ G,且在 G 中已经有超过 K 个小于 x 的整数约数个数多于 x,即 x 一定不是良好的,
则 xp^c (c ≥ 0) 也一定不可能是良好的。
于是我们可以利用已知的良好的数筛出接下来“可能良好”的数,再在这些数里面排除,除去确定的不是良好的数,即可得到所有良好的数。
T2.
大概是这三道题里最水的?
思路卡壳点:最终的答案与c的大小无关,只与c二进制位中1的个数有关。
发现了这个结论,我们就可以很愉快的dp了。
T3.
我们可以采取逐位确定的方法,首先求出以每个点为根时dfs序的总方案数,接下来:
设当前点所要对应b数列中的p位置,若当前点<b[p],那么直接累加随便走的方案数;若当前点>b[p],break;否则,p++,去当前点的子树中寻找进行同样的过程。
说起来很容易,实际操作挺shi的,反正我调了一晚上。。。。
#include<bits/stdc++.h>
#define mod 1000000007
#define ll long long
using namespace std;
int n,fi[],ne[],to[],b[],du[],tot,p,siz[],tt,sum[],r[],lc[],rc[];
ll f[],js[],ans,ni[],ff[],fc[];
vector<int>h[];
bool v[];
inline int read(){
int x=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
}
inline ll qpow(ll x,ll y){
ll ans=;
while(y){
if(y&)ans=ans*x%mod;
x=x*x%mod;
y>>=;
}
return ans;
}
inline void add(int x,int y){
ne[++tot]=fi[x];
fi[x]=tot;
to[tot]=y;
}
ll dfs(int x,int fa){
ff[x]=;siz[x]=;
for(int i=fi[x];i;i=ne[i]){
int y=to[i];
if(y!=fa){
ff[x]=ff[x]*dfs(y,x)%mod;
siz[x]+=siz[y];
}
}
ff[x]=ff[x]*js[fa?du[x]-:du[x]]%mod;
return ff[x];
}
void insert(int &x,int l,int r,int pos,int val){
if(!x)x=++tt;
if(l==r){
sum[x]+=val;
return;
}
int mid=(l+r)>>;
if(pos<=mid)insert(lc[x],l,mid,pos,val);
else insert(rc[x],mid+,r,pos,val);
sum[x]=sum[lc[x]]+sum[rc[x]];
}
int query(int x,int l,int r,int pos){
if(pos<=)return ;
if(l==r)return sum[x];
int mid=(l+r)>>;
if(pos<=mid)return query(lc[x],l,mid,pos);
return query(rc[x],mid+,r,pos)+sum[lc[x]];
}
bool check(int x,int l,int r,int pos){
if(l==r)return sum[x];
int mid=(l+r)>>;
if(pos<=mid)return check(lc[x],l,mid,pos);
return check(rc[x],mid+,r,pos);
}
bool dfs2(int x,int fa){
int la=p+,num=fa?du[x]-:du[x];
fc[x]=;p++;
ll t=;
sort(h[x].begin(),h[x].end());
for(int i=fi[x];i;i=ne[i])
if(to[i]!=fa)
insert(r[x],,n,to[i],);
while(p-la!=siz[x]-){
num--;int y=b[p+];
ff[x]=ff[x]*qpow(num+,mod-)%mod;
fc[x]=(fc[x]+query(r[x],,n,b[p+]-)*ff[x])%mod;
if(!check(r[x],,n,b[p+])){
p=siz[x]+la-;
return false;
}
insert(r[x],,n,b[p+],-);
ff[x]=ff[x]*qpow(ff[y],mod-)%mod;
if(!dfs2(b[p+],x)){
p=siz[x]-+la;
fc[x]=(fc[x]+fc[y]*ff[x])%mod;
return false;
}
fc[x]=(fc[x]+fc[y]*ff[x])%mod;
}
return true;
}
int main(){
// freopen("t.in","r",stdin);
n=read();js[]=;ni[]=;
for(int i=;i<=n;i++)
b[i]=read();
for(int i=,x,y;i<n;i++){
x=read(),y=read();
add(x,y);add(y,x);
du[x]++,du[y]++;
}
for(int i=;i<=n;i++)
js[i]=js[i-]*i%mod,ni[i]=qpow(js[i],mod-);
f[]=js[du[]];
for(int i=;i<=n;i++)f[]=f[]*js[du[i]-]%mod;
for(int i=;i<=b[];i++)
f[i]=f[]*ni[du[i]-]%mod*js[du[i]]%mod*ni[du[]]%mod*js[du[]-]%mod;
for(int i=;i<=b[];i++){
if(i<b[]){
ans=(ans+f[i])%mod;
}
if(i==b[]){
p=;
dfs(i,);
dfs2(i,);
ans=(ans+fc[i])%mod;
}
}
printf("%lld\n",ans);
return ;
}
模拟23
T1.
简单dp,没了.
T2.
这题做法非常的多,我可能是唯一一个二分AC的,细节很多,考试时少剪一个枝T成了60
对于每一个点他的积水高度显然单调,我们可以二分这个高度,然后从这个点开始dfs,若成立,将与该点相连的所有高度小于ans的全部改成这个高度,注意不要重复遍历同一点,会将复杂度从n^2变成n^3
二分挺恶心的,不重复遍历特判错了很容易wa,重复遍历就会T
总复杂度nmlognm,复杂度还是正确的.
#include<bits/stdc++.h>
#define cri const register int
using namespace std;
const int zx[]={,-,,},zy[]={,,-,};
int n,m,a[][],res[][],tim;
int vv[][],tot;
char v[][];
bool dfs2(cri x,cri y,cri val){
if(a[x][y]>=val)return true;
vv[x][y]=tim;
for(int i=;i<=;i++){
int ax=x+zx[i],ay=y+zy[i];
if(ax<||ay<||ax>n+||ay>n+)return false;
if(v[ax][ay]&&a[ax][ay]+res[ax][ay]<val)return false;
if(v[ax][ay]&&a[ax][ay]>=val)continue;
if(vv[ax][ay]!=tim){
if(!dfs2(ax,ay,val))return false;
}
}
return true;
}
inline bool check(int x,int y,int val){
tim++;
return dfs2(x,y,val);
}
void dfs(cri x,cri y,cri val){
res[x][y]=max(val-a[x][y],);
v[x][y]=true;
if(a[x][y]>=val)return;
for(int i=;i<=;i++){
int ax=x+zx[i],ay=y+zy[i];
if(v[ax][ay]||ax<=||ay<=||ax>n||ay>m)continue;
dfs(ax,ay,val);
}
}
struct keng{
int x,y,a;
friend bool operator < (keng a,keng b){
return a.a<b.a;
}
}aa[];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&aa[++tot].a),aa[tot].x=i,aa[tot].y=j,a[i][j]=aa[tot].a;
sort(aa+,aa+tot+);
for(int i=;i<=tot;i++){
if(!v[aa[i].x][aa[i].y]){
int l=,r=1e9,ans=-1e9;
while(l<=r){
int mid=(l+r)>>;
if(check(aa[i].x,aa[i].y,mid))ans=max(ans,mid),l=mid+;
else r=mid-;
}
dfs(aa[i].x,aa[i].y,ans);
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
printf("%d ",res[i][j]);
puts("");
}
return ;
}
T3,
容斥好题
我是看题解做的,主要解释一下f (i) = ∑ d μ(d)g(d)
算了不想打公式了,自己反演去吧
NOIP模拟21+22的更多相关文章
- Noip模拟21(持续翻车)2021.7.20
读题总是读错是不是没救了... T1 Median 中位数:按顺序排列的一组数据中居于中间位置的数. 能用上的高亮符号都用上了... 当时忘了就离谱.... 理解什么是中位数(真是个憨憨)后就可以开始 ...
- NOIP 模拟 $21\; \rm Median$
题解 \(by\;zj\varphi\) 对于这个序列,可以近似得把它看成随机的,而对于随机数列,每个数的分布都是均匀的,所以中位数的变化可以看作是常数 那么可以维护一个指向中位数的指针,同时维护有多 ...
- NOIP 模拟 $21\; \rm Park$
题解 \(by\;zj\varphi\) 首先,分析一下这个答案:本质上是求在一条路径上,选择了一些点,这些点的贡献是它周围的点权和 - 它上一步的点权 对于一棵树,可以先确定一个根,然后每条路径就可 ...
- NOIP 模拟 $21\; \rm Game$
题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...
- NOIP模拟 21
可爱的Dybala走了..(当然只是暂时) 又考了大众分.从rank5到rank17一个分. T1 折纸 秒切,爽啊 天皇偷看我代码,结束看见我A了还很惊讶,说我代码有锅 好沙雕哦 就跟个2b似的. ...
- [考试总结]noip模拟21
中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 中位数要排序!!!!!! 分差不加绝对值!!!! 分差不加绝对值!!!! 分差不加绝对值!!!! ...
- noip模拟测试22
考试总结:这次考试题,有好多部分分,导致了我在考试过程中一心想拿到这些部分分,对于正解没有留出时间进行思考,这是一个教训,在以后的考试中我一定要留出足够的思考时间,不要被部分分限制.还有,我的部分分也 ...
- noip模拟21
开题发现这场考过,定睛一看,发现是省选前最后一场,没改过呀--但是还是讲武德的赛时没提交 A. Median 神奇之处在于 \(1e7\) 个质数居然能线性筛出来~ 那么 \(S2\) 可以直接筛出来 ...
- NOIP模拟21:「Median·Game·Park」
T1:Median 线性筛+桶+随机化(??什么鬼?). 首先,题解一句话秀到了我: 考虑输入如此诡异,其实可以看作随机数据 随机数据?? 这就意味着分布均匀.. 又考虑到w< ...
随机推荐
- scalikejdbc 学习笔记(3)
重用connection: package com.citi.scalikejdbc import scalikejdbc._ import scalikejdbc.config._ object C ...
- ADB命令无法导出文件到物理机上处理办法
因为想查看一下脚本生成的sqlite文件.就想导出文件,,结果导出adb pull命令一直报错.使用su也是错误的..最后发现adb pull 不能再adb的命令状态下执行.需要退出adb命令.然后直 ...
- android设置透明状态栏
先是半透明效果(两种方法): 第一种(简单): //直接将下面的代码放在activity中的setContentView(R.layout.activity_main);中之前就行了 if (Buil ...
- 使用Newspaper3k框架快速抓取文章信息
一.框架介绍 Newspaper是一个python3库,但是Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url.新闻信息等,但对于想获 ...
- 继续学习freertos消息队列
写在前面:杰杰这个月很忙~所以并没有时间更新,现在健身房闭馆装修,晚上有空就更新一下!其实在公众号没更新的这段日子,每天都有兄弟在来关注我的公众号,这让我受宠若惊,在这里谢谢大家的支持啦!!谢谢^ 在 ...
- 声学回声消除(Acoustic Echo Cancellation)
回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声.一些回声是必要的,比如剧院里的音乐回声以及延迟时间较短的房间回声:而大多数回声会造成负面影响,比如在有线或者无线通信时重复听到自 ...
- 【Cocos2d-x】学习笔记目录
从2019年7月开始学习游戏引擎Cocos2dx,版本3.17. 学习笔记尽量以白话的形式表达自己对源码的理解,而不是大篇幅复制粘贴源码. 本人水平有限,欢迎批评指正! Cocos2d-x 学习笔记 ...
- 自力更生Collections.sort发现比较结果混乱?Comparator的锅还是强转类型导致?
近日开发任务时间充裕一些,于是有时间回顾一下项目. 我关注到了项目中使用的七牛云的对象存储服务. 作为测试需要上传了一些图片,但七牛的控制台却无法将内容按照上传时间排序或者是按照日期查询,由于buck ...
- python学习-模块与包(九)
9.4查看模块内容 dir(): 返回模块或类所包含的全部程序单元(包括变量.函数.类和方法等) __all__:模块本身提供的变量,不会展示以下划线开头的程序单元.另使用from xx import ...
- MyBatis 之源码浅读
环境简介与入口 记录一下尝试阅读Mybatis源码的过程,这篇笔记是我一边读,一遍记录下来的,虽然内容也不多,对Mybatis整体的架构体系也没有摸的很清楚,起码也能把这个过程整理下来,这也是我比较喜 ...