NOIP2024 前集训:NOIP2024加赛 8

news/2024/11/27 21:35:56/文章来源:https://www.cnblogs.com/Charlieljk/p/18573154

前言

music
《铃芽之旅》du du du du du du du du du du du du du du du dudu du du du du du du du du du du du du du du dudu du du du du du du du du du du du du du du dudu du du du du du du du du du du du du du du du于 你的生命之中红与蓝的线缠绕交错在 心间划上最后一笔勾勒出你的脉络那 随风飘荡的声音 从不曾被吹散片刻是 藏在心中的话 想对你说却还没能说人生啊 短暂如花微风啊 拂过脸颊星光啊 照谁的家我们是 宇宙一刹别再问 别再问 这样的我 为什么哭着眼泪替我诉说意义是你 意义是我意义总是 难以追寻的是我们相遇过 谁奋力呐喊着却吼不破命运的壳只能是你 只能由你触碰双手轻轻唤醒我沉睡千年的心搏意义是你 意义是我意义是否 最终跨越呢相隔时空的你我是愚昧又如何 是丑恶又如何 是望着前方正确的因果是想与你携手走过如今我已想不起曾经珍惜的回忆却似有万千言语深深埋葬在我心底或许就这样吧 或许就这样了还有什么遗憾的 我已交付所有的自己或许就这样吧 或许就这样了多么想让你听见这颗破碎又顽强的心只想靠近你别再问 别再问 这样的我 为什么哭着眼泪替我诉说意义是你 意义是我 意义总是 难以追寻的是我们相遇过 谁奋力呐喊着却吼不破命运的壳只能是你只能由你触碰双手轻轻唤醒我沉睡千年的心搏意义是你 意义是我意义是否 最终跨越呢相隔时空的你我是愚昧又如何 是丑恶又如何是望着前方 正确的因果是想与你携手走过

今天中午打电话我妈告诉我遇到诈骗了,诈骗的不知道从哪儿弄来我的短信给我妈发消息交钱,不过我这辈子没用过短信,再说我有事儿肯定打电话,最主要的是我从来没朝我妈要过钱,所以我妈一眼看出来是诈骗了。

但是挺离谱的诈骗的为啥会搞到我手机号还能知道我妈是谁还能知道我是学 OI 的?

T1 赛时不知道贪心是对的,奔着随机数据去的结果 A 了;T2 忘初始化保龄了;T4 没开 long long(开了,但是不知道啥时候给删了)挂了 35。

明天不想打了呜呜呜,还没打板子呢,但是如果明天不打今天可能就是最后一场了。

T1 flandre

贪心的发现一定是优先选大的,然后肯定是把小的排在前面。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=1e6+10,mx=1e6;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char a=getchar_unlocked();for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,tot,top,a[N],pos[N],sta[N]; ll k,ans,sum; vector<int>e[N<<1];
signed main()
{freopen("flandre.in","r",stdin),freopen("flandre.out","w",stdout);read(n,k);for(int i=1;i<=n;i++) read(a[i]),e[a[i]+mx].push_back(i);for(int i=mx;~i;i--) if(!e[i+mx].empty()){ans+=1ll*e[i+mx].size()*(i+k*m),m+=e[i+mx].size();for(int j:e[i+mx]) pos[++tot]=j;}sum=ans; for(int i=-1,tmp=0;i>=-mx;i--,tmp=0) if(!e[i+mx].empty()){for(int j=1;j<=e[i+mx].size();j++) if(sum+j*(k*m+i)>ans){for(int h=1;h<=top;h++) pos[++tot]=sta[h];for(int h=tmp;h<j;h++) pos[++tot]=e[i+mx][h];ans=sum+j*(k*m+i),tmp=j,top=0;}for(int j=tmp;j<e[i+mx].size();j++) sta[++top]=e[i+mx][j];sum+=e[i+mx].size()*(i+k*m),m+=e[i+mx].size();}write(ans,tot),puts(""),reverse(pos+1,pos+1+tot);for(int i=1;i<=tot;i++) write(pos[i]),putchar_unlocked(' ');
}

T2 meirin

往数据结构上想了,实际上是道数学题。

考虑把式子拆开,这是简单的,有很多种方式可以把他拆成单词 \(O(n)\) 的,但是需要把他拆成修改 \(O(1)\sim O(\log)\) 的。

发现 \(a_i\) 始终不变,考虑把 \(a_i\) 当成系数拎出来,转换后有:

\[\sum_{l=1}^r\sum_{r=l}^n(\sum_{i=l}^ra_i)\times (\sum_{i=l}^rb_i)=\sum_{i=1}^n((i\times \sum_{j=i}^nsum_j)-((n-i+1)\times \sum_{j=1}^isum_{j-1}))b_i \]

\(sum_i\) 表示前缀和,发现转换为了 \(b_i\) 系数的形式,于是就可以直接算贡献了。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=5e5+10,P=1e9+7;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char a=getchar_unlocked();for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,ans,a[N],b[N];
inline int mod(int x,int y) {return (x+=y)>=P?x-P:x;}
signed main()
{freopen("meirin.in","r",stdin),freopen("meirin.out","w",stdout);read(n,m);for(int i=1,x;i<=n;i++) read(x),a[i]=mod(a[i-1],mod(x,P));for(int i=1;i<=n;i++) a[i]=mod(a[i-1],a[i]);for(int i=1,x;i<=n;i++){b[i]=mod(1ll*mod(a[n],P-a[i-1])*i%P,P-1ll*a[i-1]*(n-i+1)%P);read(x),ans=mod(ans,1ll*b[i]*mod(x,P)%P),b[i]=mod(b[i-1],b[i]);}for(int l,r,x;m;m--){read(l,r,x);write(ans=mod(ans,1ll*mod(b[r],P-b[l-1])*mod(x,P)%P)),puts("");}
}

T3 sakuya

考虑统计边 \((x,y)\) 出现的次数,断开这条边树会分成两部分,这条边被计算当且仅当相邻的两点分别在两部分中,那么这部分可以用树形 DP 做了。

考虑两点相邻的概率,用捆绑法求出两点相邻的概率为 \(\dfrac{2(m-1)!}{m!}=\dfrac{2}{m}\)

加贡献的时候直接根据求出的 DP 加就可以了。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=5e5+10,P=998244353;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char a=getchar_unlocked();for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,tot,ans,f[N],sz[N]; ll inv; int head[N],nxt[N<<1],to[N<<1],w[N<<1];
inline int mod(int x,int y) {return (x+=y)>=P?x-P:x;}
inline int qpow(ll a,int b)
{ll res=1; for(;b;(a*=a)%=P,b>>=1) (b&1)&&((res*=a)%=P); return res;}
inline void add(int x,int y,int z)
{nxt[++tot]=head[x],to[tot]=y,w[tot]=z,head[x]=tot;}
inline void dfs1(int x,int t)
{for(int i=head[x],y;y=to[i];i=nxt[i]) if(y!=t) dfs1(y,x),sz[x]+=sz[y];}
inline void dfs2(int x,int t)
{f[t]=mod(f[t],1ll*sz[x]*(m-sz[x])%P);for(int i=head[x],y,tmp;y=to[i];i=nxt[i]) if(y!=t){f[y]=mod(f[y],tmp=1ll*sz[y]*(m-sz[y])%P);ans=mod(ans,1ll*tmp*w[i]%P),dfs2(y,x);}
}
signed main()
{freopen("sakuya.in","r",stdin),freopen("sakuya.out","w",stdout);read(n,m),inv=qpow(m,P-2)*2%P;for(int i=1,x,y,z;i<n;i++) read(x,y,z),add(x,y,z),add(y,x,z);for(int i=1,x;i<=m;i++) read(x),sz[x]=1; dfs1(1,0),dfs2(1,0),read(m);for(int x,k;m;m--,write(ans*inv%P),puts(""))read(x,k),ans=mod(ans,1ll*f[x]*k%P);
}

T4 红楼 ~ Eastern Dream

已经把根号分治写脸上了,问题在于怎么分别处理。

对于 \(x\le \sqrt n\) 的因为这种点最多只有 \(\sqrt n\) 个,所以直接算即可。

对于 \(x>\sqrt n\) 的,直接线段树会多个 \(\log\) 过不去,考虑序列分块加差分,从而做到每个块 \(O(1)\) 更新 \(O(\sqrt n)\) 查询,维护差分的方式和树状数组维护区间改区间查相同。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=2e5+10,M=300,L=1000;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char a=getchar_unlocked();for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,len,vl[N],vr[N],pos[N]; ll ans,a[N],b[N],c[N],s1[L],s2[L],d[M][M];
inline void add(int l,int r,int k)
{c[l]+=k,s1[pos[l]]+=k,s2[pos[l]]+=1ll*(vr[pos[l]]-l+1)*k;c[++r]-=k,s1[pos[r]]-=k,s2[pos[r]]-=1ll*(vr[pos[r]]-r+1)*k;
}
inline ll ask1(int x,int y) {return ~y?(y/x)*b[x]+d[x][y%x]:0;}
inline ll ask2(int l,int r)
{ll res=0; int x=pos[l],y=pos[r];for(int i=1;i<x;i++) res+=s1[i]*(r-l+1);for(int i=vl[x];i<l;i++) res+=c[i]*(r-l+1);if(x==y) {for(int i=l;i<=r;i++) res+=c[i]*(r-i+1); return res;}for(int i=l;i<=vr[x];i++) res+=c[i]*(r-i+1);for(int i=x+1;i<y;i++) res+=s1[i]*(r-vr[i])+s2[i];for(int i=vl[y];i<=r;i++) res+=c[i]*(r-i+1); return res;
}
signed main()
{freopen("scarlet.in","r",stdin),freopen("scarlet.out","w",stdout);read(n,m),len=max(1,(int)sqrt(n)/2);for(int i=1;i<=n;i++) read(a[i]),a[i]+=a[i-1],pos[i]=(i-1)/len+1;for(int i=1;i<=pos[n];i++) vl[i]=vr[i-1]+1,vr[i]=min(n,i*len);for(int op,x,y,k;m;m--){read(op,x,y); if(op&1){read(k),y=min(x-1,y); if(x<=len){b[x]+=1ll*k*(y+1);for(int i=0;i<=y;i++) d[x][i]+=1ll*(i+1)*k;for(int i=y+1;i<x;i++) d[x][i]+=1ll*(y+1)*k;}else for(int i=1;i<=n;i+=x) add(i,min(n,i+y),k); continue;}for(int i=1;i<=len;i++) ans+=ask1(i,y-1)-ask1(i,x-2);write(ans+a[y]-a[x-1]+ask2(x,y)),puts(""),ans=0;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842513.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

manim边做边学--圆柱体

Cylinder是Manim中用于创建圆柱体对象的类。 Cylinder类在制作数学、物理或工程领域的动画时,可用于以下的场景中:演示几何概念:使用Cylinder类创建圆柱体,并通过改变其参数和方法来演示圆柱体的各种几何性质,如体积、表面积等。 模拟物理现象:使用Cylinder类来模拟圆柱体…

基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现十一

运行环境:windows/Linux均可、jdk1.8、mysql5.7、redis3.0、idea/eclipse均可。 技术点:SpringBoot+SpringDataJPA+Mysql+Freemaker+Bootstrap+JS+CSS+HTML 部分功能:前台竞价商品信息控制器Controller(商品列表、商品详情、报名、拍价、查看报名记录等 )一、前言介绍: 免…

Docker 实战:搭建本地 Registry 私有镜像仓库及批量导入脚本

前言:在我之前的博客中,我分享了 Harbor 仓库搭建的详细操作步骤。然而,在实际的生产环境中,并非每个 Docker 环境都需要部署一个规模庞大的 Harbor 仓库。有时,一个轻量级的本地 Registry 私有镜像仓库会更为便捷。本文将介绍如何搭建一个本地 Registry 私有镜像仓库,并…

Chrome联合Opera/Vivaldi/Waterfox等成立联盟对抗Microsoft Edge

日前在欧盟有个新的行业联盟成立,这个行业联盟名为浏览器选择联盟,主要成员包括 Google Chrome、Opera、Vivaldi、Waterfox 和 Wavebox。 成立联盟的主要目的是对抗微软的 Microsoft Edge 浏览器,该联盟致力于呼吁 / 游说欧盟将 MicROSoft Edge 按照数字市场法案列为看门人…

MySQL原理简介—12.MySQL主从同步

大纲 1.异步复制为MySQL搭建一套主从复制架构 2.半同步复制为MySQL搭建一套主从复制架构 3.GTID为MySQL搭建一套主从复制架构 4.并行复制降低主从同步延迟或强制读主库1.异步复制为MySQL搭建一套主从复制架构 (1)MySQL主从复制的原理 (2)搭建主从复制架构的配置(1)MySQL主从复制…

java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)

java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)@目录说明:基础工具类MsgPageResultResponseBusinessDomainEnum(枚举)EsDocumentConstants(常量)本人其他文章链接 说明:基础工具类Msg package com.geespace.microservices.data.computing.model.…

[MYSQL] MYSQL 时间与时区

MYSQL 版本:MYSQL 5.7.38-221001-logMYSQL 时间与时区概述 GMT(格林尼治标准时间、世界时间) 与 UTC(协调世界时间)‌GMT(Greenwich Mean Time,格林威治标准时间)‌:GMT是基于地球自转和对恒星的观测来定义的时间标准,将地球划分为24个时区。它以英国伦敦郊区的格林尼治天文…

51单片机入门:数码管(3)

数码管简介数码管每段其本质就是个LED灯,只需要控制特定的LED灯亮就能显示数据。普中开发版所使用的是两个并在一起共阴极连接的“4位数码管”,可以同时显示8个数字。数码管的显示可以分成静态显示和动态显示,这里先介绍最简单的静态显示。数码管分为共阴极连接和共阳极连接…

使用java在未知表字段情况下通过sql查询信息

使用java在未知表字段情况下通过sql查询信息场景 在只知道表名,不知道表包含哪些字段情况下,查询该表信息的场景 解决方案 @Testpublic void test() {Connection connection;String DB_URL = "jdbc:mysql://192.168.20.75:9950/geespace_bd_platform_dev?characterEnco…

WnRAR将rar后缀格式文件转成zip后缀格式

前言全局说明使用 winRAR 自带的转换功能,可以最大程度的保留原始信息, 比如: 打包时间、CRC32值等一、说明 环境: Windows 11 家庭版 23H2 22631.3737 WinRAR 6.00(32位)二、rar 转 zip 2.12.2 选择要转换的文件 右边可以根据类型筛选2.3 选择要转成的格式 zip2.4 选择转成输…

opensuse系统下QtCreator中文输入法失效解决,亲测有效

首先安装QTCreator,这里不再详细赘述。克隆fcitx-qt5仓库,然后在该目录下新建build文件 克隆命令如下git clone https://gitcode.com/gh_mirrors/fc/fcitx-qt5.git安装cmakezypper install cmake进入到build目录 运行命令cmake ..报错如下 解决办法 运行如下指令 sudo zypper…

数值分析:线性方程组的直接解法(上)

提纲背景介绍 三角方程组 Gauss消去法 附录一、背景介绍 1.1 线性方程组的相关概念 线性方程组在解决现实师姐问题中直接产生,最小二乘数据拟合、微分方程边值问题和初边值问题的数值解产生了大量的线性方程组。 线性方程组系数矩阵的类型分别有稠密型(dense):几乎所有元素都…