NOIP模拟56
前言
话说, T2 和 T3 的题面好像放反了。
T1 爆零
解题思路
是个原题。。
当时 WindZR 25分钟就码完了,然后我就慌死,写完就开始调,诶,我当时场上不是切了吗,怎么现在打不对了。。
然后我突然发现 sort 的时候 comp 函数压根没有调用,我***。。。
出于内心的各种因素,我造了组 \(10^6\) 的最大的数据,然后不吸氧 1.5s 吸了 0.9s 险些超时。。
我就有造了一组 \(10^6\) 的链,然后就愉快的发现 段错误 开大栈空间也无济于事。
于是我就对着这个 段错误 干了 1h 最后实在是不知道哪里错了,果断溜走。
考完之后拿别人的程序一测 都是 段错误 ,我***
那么我们看看 NB 的 WindZR 的 T1 有多少分 ,诶, 15pts
至于题解,请移步 blog
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<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=1e6+10;
int n,ans,dep[N],mxdep[N],fa[N],f[N];
multiset<int> se[N];
vector<int> v[N];
bool comp(int x,int y){return mxdep[x]<mxdep[y];}
void merge(multiset<int> &x,multiset<int> &y)
{
for(auto it=y.begin();it!=y.end();it++)
x.insert((*it)+1);
}
void dfs(int x)
{
sort(v[x].begin(),v[x].end(),comp);
for(int i=0;i<v[x].size();i++) if(v[x][i]!=fa[x]) dfs(v[x][i]);
for(int i=0;i<v[x].size();i++)
{
int to=v[x][i]; if(to==fa[x]) continue;
for(auto it=se[x].begin();it!=se[x].end();it++)
{
if(se[to].begin()==se[to].end()) break;
int temp=(*it);
if(temp>dep[x]) break;
f[x]+=2*temp;
se[x].erase(it);
se[x].insert((*se[to].begin())+1);
se[to].erase(se[to].begin());
}
merge(se[x],se[to]);
}
if(!v[x].size()) se[x].insert(0);
}
void dfs1(int x)
{
mxdep[x]=dep[x];
for(int i=0;i<v[x].size();i++)
if(v[x][i]!=fa[x])
{
dep[v[x][i]]=dep[x]+1;
dfs1(v[x][i]);
mxdep[x]=max(mxdep[x],mxdep[v[x][i]]);
}
}
signed main()
{
freopen("a.in","r",stdin); freopen("a.out","w",stdout);
n=read();
for(int i=2;i<=n;i++) fa[i]=read(),v[fa[i]].push_back(i);
dfs1(1); dfs(1);
for(int i=1;i<=n;i++) ans+=f[i];
for(auto it=se[1].begin();it!=se[1].end();it++) ans+=(*it);
printf("%lld",ans);
return 0;
}
T2 底垫
解题思路
按照题解说的运用类似于珂朵莉树的操作,对于区间贡献的 l,r,lr 的系数以及常数项进行维护。
运用求后缀和的后缀数组可以胜任这个区间修改但点查询的操作。
注意珂朵莉树分裂先分裂右端点再分裂左端点,否则右端点的地址会失效。
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<endl
using namespace std;
inline int read()
{
int x;scanf("%lld",&x); return x;
}
const int N=1e6+10,mod=1e9+7,INF=1e9;
int n,q,li[N],ri[N],ans[N];
struct BIT
{
int tre[N<<2];
int lowbit(int x){return x&(-x);}
void add(int x,int val){for(int i=x;i;i-=lowbit(i)) tre[i]=(tre[i]+val)%mod;}
int ask(int x){int sum=0;for(int i=x;i<=n;i+=lowbit(i)) sum=(sum+tre[i])%mod;return sum;}
}l,r,lr,c;
struct Node
{
int l,r,tim;
bool friend operator < (Node x,Node y){return x.l<y.l;}
}s[N];
set<Node> se;
bool comp(Node x,Node y){return x.r<y.r;}
int power(int x,int y){int temp=1;while(y){if(y&1)temp=temp*x%mod;x=x*x%mod;y>>=1;}return temp;}
set<Node>::iterator split(int x)
{
auto it=se.lower_bound((Node){x,0,-1});
if(it!=se.end()&&it->l==x) return it; it--;
int l=it->l,r=it->r,tim=it->tim;
se.erase(it); se.insert((Node){l,x-1,tim});
return se.insert((Node){x,r,tim}).first;
}
void insert(int li,int ri,int tim)
{
auto to=split(ri+1),fro=split(li);
while(fro!=to)
{
int len=fro->r-fro->l+1,t=fro->tim;
lr.add(tim,(mod-len)%mod);
lr.add(t,len);
l.add(tim,(tim-1)*len%mod);
l.add(t,(1-tim+mod)%mod*len%mod);
r.add(tim,(tim+1)*len%mod);
r.add(t,(mod-t-1)*len%mod);
c.add(tim,(1-tim*tim%mod+mod)%mod*len%mod);
c.add(t,(tim+tim*t-t-1+mod)%mod*len%mod);
fro=next(fro); se.erase(prev(fro));
}
se.insert((Node){li,ri,tim});
}
signed main()
{
freopen("b.in","r",stdin); freopen("b.out","w",stdout);
n=read(); q=read();
for(int i=1;i<=n;i++) li[i]=read(),ri[i]=read()-1;
for(int i=1;i<=q;i++) s[i].l=read(),s[i].r=read(),s[i].tim=i;
sort(s+1,s+q+1,comp); se.insert((Node){0,INF,0});
for(int i=1,pos=1;i<=q;i++)
{
while(pos<=s[i].r) insert(li[pos],ri[pos],pos),pos++;
int inv=power((s[i].r-s[i].l+1)*(s[i].r-s[i].l+2)/2%mod,mod-2),sum=0;
sum=(sum+lr.ask(s[i].l)*s[i].l%mod*s[i].r)%mod;
sum=(sum+s[i].r*r.ask(s[i].l))%mod;
sum=(sum+s[i].l*l.ask(s[i].l))%mod;
sum=(sum+c.ask(s[i].l))%mod;
ans[s[i].tim]=sum*inv%mod;
}
for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
return 0;
}
T3 高考
解题思路
题解的柿子有一点小锅,对于 r 答案应该是
\]
然后后面的 g 的柿子是一个至少形式的二项式反演,别的就没有啥好注意的了。。(又水了一篇 blog
code
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Failed"<<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=5e3+10,mod=1e9+7;
int n,m,inv,fac[N<<1],ifac[N<<1],g[N][N],f[N][N];
int C(int x,int y){return fac[y]*ifac[x]%mod*ifac[y-x]%mod;}
int power(int x,int y){int temp=1;while(y){if(y&1)temp=temp*x%mod;x=x*x%mod;y>>=1;}return temp;}
signed main()
{
freopen("c.in","r",stdin); freopen("c.out","w",stdout);
n=read(); m=read();
fac[0]=ifac[0]=1; for(int i=1;i<=n+m;i++) fac[i]=fac[i-1]*i%mod;
ifac[n+m]=power(fac[n+m],mod-2); for(int i=n+m-1;i>=1;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=i,base=1;k<=m/j;k++,base*=-1)
(g[i][j]+=base*C(i,k)*C(k,n)%mod*C(n-1,m+n-1-j*k)%mod+mod)%=mod;
for(int i=n;i>=1;i--)
for(int j=1;j<=m/i;j++)
f[i][j]=(f[i+1][j]+g[i][j])%mod;
inv=power(C(n-1,n+m-1),mod-2);
for(int i=1,sum=0;i<=n;i++)
{
for(int j=1;j<=m;j++)
(sum+=f[i][j])%=mod;
printf("%lld\n",(sum*inv%mod+i)%mod);
}
return 0;
}
T4 种田
考场上卡时得了 45pts ,尽管有许多强者骗到了 70pts,但是正解好像无人搞出。。
大坑未补
NOIP模拟56的更多相关文章
- 2021.9.18考试总结[NOIP模拟56]
T1 爆零 贪心地想,肯定要先走完整个子树再走下一个,且要尽量晚地走深度大的叶子.所以对每个点的儿子以子树树高为关键字排序$DFS$即可. 也可$DP$. $code:$ T1 #include< ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
随机推荐
- EDA(Exploratory Data Analysis)数据探索性分析
EDA目的:通过了解数据集的分布情况,数据之间的关系,来帮我们更好的后期进行特征工程和建立模型. 本文主要是一个根据coco数据集格式的json文件,来分析数据集中图片尺寸,宽高比,bbox尺寸,宽高 ...
- 深度解读《深度探索C++对象模型》之拷贝构造函数
接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文. 写作不易,请有心人到我的公众号上 ...
- MySQL—一条查询SQL语句的完整执行流程
MySQL-一条查询SQL语句的完整执行流程 表结构和数据如下: 我们分析的sql语句如下: select tb_id,tb_name,tb_address from tb_user where tb ...
- 牛客网-SQL专项训练14
①通过子查询的方式从衬衫表SHIRTABLE中选取出销售单价shirt_price高于全部衬衫的平均价格的衬衫名字:B 解析: 题目要求需要用到子查询,故排除AC选项,而D选项在where子句中使用了 ...
- 【pytorch学习】之线性代数
3 线性代数 3.1 标量 如果你曾经在餐厅支付餐费,那么应该已经知道一些基本的线性代数,比如在数字间相加或相乘.例如,北京的温度为52◦F(华氏度,除摄氏度外的另一种温度计量单位).严格来说,仅包含 ...
- 一位 sealer maintainer 的心路历程
简介: 本文作者将回顾个人参与 sealer 开源项目的机缘巧合,参与过程中的挑战,以及从中获取的所悟所感,写下一段文字进行分享,希望对开源新人有所帮助,能够激励想参与开源工作但还未踏出第一步的同学. ...
- 使用 Databricks 进行营销效果归因分析的应用实践【Databricks 数据洞察公开课】
简介: 本文介绍如何使用Databricks进行广告效果归因分析,完成一站式的部署机器学习,包括数据ETL.数据校验.模型训练/评测/应用等全流程. 作者:冯加亮 阿里云开源大数据平台技术工程师 ...
- Flutter+FaaS一体化任务编排的思考与设计
作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业务闭环.在新的研发模式落地与实践的过程中,一直在思考如 ...
- 让微服务开源更普惠,阿里云微服务引擎MSE全球开服
简介:MSE 于2020年10月在国内开启商业化服务,目前已吸引近万客户使用,用于在云上更低成本构建.更稳定运行微服务架构.此次,MSE 向阿里云国际站开放服务,旨在帮助更多客户享受到更加普惠的微服 ...
- 免费体验!阿里云智能LOGO帮你解决设计难题
简介:超实用!零基础搞定一个高大上的智能logo设计 新年过后,往往是大家一年中士气最足的时候,散去了年末的疲惫和emo,重燃对新一年的热情和希望. 想创业的朋友们同样意气风发,趁着新年的劲头想大干 ...