2024暑假集训测试4

news/2024/11/15 10:00:02/文章来源:https://www.cnblogs.com/Charlieljk/p/18299249

前言

  • 比赛链接

image

这次和高中一起打的,排名一次比一次低了,差点出前一半了……

主要是 T1 \(dijkstra\) 唐氏复杂度打假了,T2 挂分,T3 没想出来压位,T4 题都没看。

T1 最短路

  • 原题:luogu P2966 [USACO09DEC] Cow Toll Paths G。

本题考察对 \(Floyed\) 的理解,\(Floyed\) 数组在没有优化之前实际是有三维的,\(f_{k,i,j}\) 表示从 \(i\)\(j\) 的路径中只可能经过 \(1\sim k\) 作为中转点时的最短路,也就是说不可能以 \(k+1\sim n\) 为中转点,其中 \(k\) 这一维可以省略。

那么将 \(k\) 这一维按照点权从小到大排序,于是有 \(a_k=\max\limits_{i=1}^k\{a_i\}\),所以对于 \(f_{k,i,j}\),其路径最大点权为 \(\max(a_i,a_j,a_k)\)

可以开两个数组 \(f,g\) 分别表示只计算边权和包括点权的,于是有:

\[\begin{cases} f_{i,j}=\min\limits_{k=1}^n\{f_{i,k}+f_{k,j}\} \\ g_{i,j}=\min\limits_{k=1}^n\{f_{i,k}+f_{k,j}+max(a_i,a_j,a_k)\} \end{cases}\]

\(g_{s,t}\) 即为所求。

点击查看代码
#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=310,M=1e4+10;
template<typename Tp> inline void read(Tp&x)
{x=0;register bool z=true;register char c=getchar();for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
}
void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');}
void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);}
int n,m,q,f[N][N],g[N][N],a[N];
struct aa {int a,id;}e[N];
bool cmp(aa a,aa b) {return a.a<b.a;}
signed main()
{freopen("path.in","r",stdin);freopen("path.out","w",stdout);read(n),read(m),read(q);for(int i=1;i<=n;i++)read(e[i].a),e[i].id=i,a[i]=e[i].a;memset(f,0x3f,sizeof(f));memset(g,0x3f,sizeof(g));for(int i=1;i<=n;i++) f[i][i]=0,g[i][i]=a[i];for(int i=1,x,y,z;i<=m;i++)read(x),read(y),read(z),f[x][y]=f[y][x]=min(f[x][y],z),g[x][y]=g[y][x]=f[x][y]+max(a[x],a[y]);sort(e+1,e+1+n,cmp);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)if(i!=e[k].id)for(int j=1;j<=n;j++){if(i==j||e[k].id==j) continue;g[i][j]=min(g[i][j],f[i][e[k].id]+f[e[k].id][j]+max({e[k].a,a[i],a[j]}));f[i][j]=min(f[i][j],f[i][e[k].id]+f[e[k].id][j]);}for(int i=1,s,t;i<=q;i++)read(s),read(t),write(g[s][t]>=0x7f7f7f7f7f?-1:g[s][t]),puts("");
}

T2

  • 原题:luogu P3474 [POI2008] KUP-Plot purchase。

  • 部分分 \(100pts\),唐氏做法:

    这是一个舍弃部分正确性换取复杂度的做法,在随机的大数据下几乎不可能卡掉,小数据下极容易死,但是小数据可以暴力冲过去。

    对于大数据,现在预处理时符合答案的直接结束,以增加部分正确性。

    只考虑正方形的答案,之后二分边长即可。

    复杂度 \(O(n^2\log(n))\)

    考虑到学校 OJ 数据向来比较水且没有捆绑,可以通过此题。

    然后赛时加了点优化想增加点正确性,结果挂了 \(60pts\)

    点击查看代码
    #include<bits/stdc++.h>
    #define int long long
    #define endl '\n'
    #define sort stable_sort
    using namespace std;
    const int N=2010;
    template<typename Tp> inline void read(Tp&x)
    {x=0;register bool z=true;register char c=getchar();for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
    }
    void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');}
    void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);}
    int n,k,a[N][N],sum[N][N];
    bool check(int mid)
    {int x1=1,y1=1,x2=mid,y2=mid,minn=0x7f7f7f7f,nowx=0,nowy=0;while(x2<=n&&y2<=n){int ans=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];if(ans>=k&&ans<=2*k) {cout<<x1<<' '<<y1<<' '<<x2<<' '<<y2<<endl;exit(0);}minn=min(minn,ans);if(y2==n) {x2++,y2=mid;x1=x2-mid+1,y1=y2-mid+1;nowy=0;}else {y2++;x1=x2-mid+1,y1=y2-mid+1;}}return minn<k;
    }
    signed main()
    {freopen("matrix.in","r",stdin);freopen("matrix.out","w",stdout);read(n),read(k);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){read(a[i][j]);if(a[i][j]>=k&&a[i][j]<=2*k){cout<<i<<' '<<j<<' '<<i<<' '<<j<<endl;return 0;}}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];if(sum[i][j]>=k&&sum[i][j]<=2*k) {cout<<1<<' '<<1<<' '<<i<<' '<<j<<endl;return 0;}}if(n<=200){for(int x2=1;x2<=n;x2++)for(int y2=1;y2<=n;y2++)for(int x1=1;x1<=x2;x1++)for(int y1=1;y1<=y2;y1++){int ans=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];if(ans>=k&&ans<=2*k){cout<<x1<<' '<<y1<<' '<<x2<<' '<<y2<<endl;return 0;}}puts("-1");return 0;}int l=1,r=n;while(l<=r){int mid=(l+r)>>1;if(check(mid)) l=mid+1;else r=mid-1;}puts("-1");
    }
    
  • 正解:

    暂无。

T3 数组

  • 原题:CF1114F Please, another Queries on Array?。

  • 部分分 \(20pts\):暴力。

  • 部分分 \(10pts\):对于没有修改的操作,主席树,详见 BZOJ4026 dC Loves Number Theory。

  • 正解:

    和主席树的思想一样,根据公式 \(\varphi(n)=n\prod\limits_{p\in\mathbb{p},p|n}\frac{p-1}{p}\),只需要处理出区间 \([l,r]\) 的乘积和其所包含的质因数即可。

    根据 \(a_i,x\le 300\),所以只可能有 \(62\) 个质因数,考虑压成一个 \(01\) 串,类似状压处理。

    让后赛时虽然看到了 \(300\) 的数据范围但是想他乘上好几次数值就极大了,但是没有想到他乘多少次质因数也是 \(\le 300\) 的,于是没有想到状压,就很唐。

    需要略微卡常,提前处理出每个 \(c_i=\dfrac{prime_i-1}{prime_i}\),不然在本就常数巨大的线段树上再在每次输出再加一个 \(\log(1e9)\) 简直是雪上加霜。

    复杂度理论上 \(O(n\log(n))\)

    点击查看代码
    #include<bits/stdc++.h>
    #define ll long long 
    #define endl '\n'
    #define sort stable_sort
    #define f t[p]
    #define ls p<<1
    #define rs p<<1|1
    using namespace std;
    const int N=1e5+10,P=1e9+7;
    template<typename Tp> inline void read(Tp&x)
    {x=0;register bool z=true;register char c=getchar();for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);x=(z?x:~x+1);
    }
    void wt(int x){if(x>9)wt(x/10);putchar((x%10)+'0');}
    void write(int x){if(x<0)putchar('-'),x=~x+1;wt(x);}
    int n,m,a[N],tot,prime[N],c[N];
    bool vis[N];
    void pre()
    {vis[1]=1;for(int i=2;i<=300;i++)if(vis[i]==0){prime[++tot]=i;for(int j=2;j<=300/i;j++)vis[i*j]=1;}
    }
    ll qpow(ll a,ll b) 
    {ll ans=1;for(;b;b>>=1){if(b&1) (ans*=a)%=P;(a*=a)%=P;}return ans;
    }
    struct aa 
    {int l,r;ll val,add=1,pri,lazy;
    }t[N<<2];
    void pushup(int p)
    {f.val=t[ls].val*t[rs].val%P;f.pri=t[ls].pri|t[rs].pri;
    }
    void build(int p,int l,int r)
    {f.l=l,f.r=r;if(l==r){f.val=a[l];for(int i=1;i<=tot&&prime[i]<=a[l];i++)if(a[l]%prime[i]==0)f.pri|=(1ll<<(i-1));return ;}int mid=(l+r)>>1;build(ls,l,mid),build(rs,mid+1,r);pushup(p);
    }
    void spread(int p)
    {if(f.add==1&&f.lazy==0) return ;ll &x=f.add,&y=f.lazy;(t[ls].val*=qpow(x,t[ls].r-t[ls].l+1))%=P,(t[ls].add*=x)%=P;(t[rs].val*=qpow(x,t[rs].r-t[rs].l+1))%=P,(t[rs].add*=x)%=P;t[ls].pri|=y,t[ls].lazy|=y;t[rs].pri|=y,t[rs].lazy|=y;x=1,y=0;
    }
    void change(int p,int l,int r,ll d)
    {if(l<=f.l&&r>=f.r){(f.val*=qpow(d,f.r-f.l+1))%=P;(f.add*=d)%=P;ll dis=0;for(int i=1;i<=tot&&prime[i]<=d;i++)if(d%prime[i]==0)dis|=(1ll<<(i-1));f.pri|=dis;f.lazy|=dis;return ;}spread(p);int mid=(f.l+f.r)>>1;if(l<=mid) change(ls,l,r,d);if(r>mid) change(rs,l,r,d);pushup(p);
    }
    aa ask(int p,int l,int r)
    {if(l<=f.l&&r>=f.r) return f;spread(p);int mid=(f.l+f.r)>>1;aa ans;ans.val=1,ans.pri=0;if(l<=mid){aa x=ask(ls,l,r);(ans.val*=x.val)%=P;ans.pri|=x.pri;}if(r>mid){aa x=ask(rs,l,r);(ans.val*=x.val)%=P;ans.pri|=x.pri;} return ans;
    }
    signed main()
    {freopen("array.in","r",stdin);freopen("array.out","w",stdout);pre();for(int i=1;i<=tot;i++)c[i]=(prime[i]-1)*(qpow(prime[i],P-2))%P;read(n),read(m);for(int i=1;i<=n;i++) read(a[i]);build(1,1,n);for(int i=1,op,l,r,d;i<=m;i++){read(op),read(l),read(r);if(op==1) read(d),change(1,l,r,d);else {aa ans=ask(1,l,r);ll val=ans.val;ll sta=ans.pri;for(int j=1;j<=tot;j++) if((sta>>(j-1))&1)val=val*c[j]%P;write(val),puts("");}}
    }
    

T4 树

暂时还没打。

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

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

相关文章

Bootstrap图片样式使用方法

在Bootstrap中自带了几种图片样式,能够让你很快地对其进行使用,这几种样式使用起来相当简单,让我们一起来看看怎么快速调用Bootstrap图片样式。Bootstrap图片圆角样式 在现今的网站建设中,由于扁平化设计的趋势,我们经常会用用到一些CSS3的特性,例如圆角、渐变、阴影等。…

SQL中“ ` ”的作用是什么?

避免和 mysql 的本身的关键字 冲突 所以 用这个符号括起来 虽然有时候不影响 查询 但是最好是要 加上的

《三体开源传》第二章 科技图谱

科技树?汪淼大脑中突然闪过这个概念。哦,不对,应该是科技图谱,图中交织的连线的复杂度已经远远超过树形结构所能描述的单一路径依赖关系,甚至还出现了环形结构和复杂的社群聚集。科技树:科技树是一种结构图,它将技术按照发展顺序排列成树状,展示从基础技术到高级应用的…

Graphrag: Hello World !

这两天抽空玩了一把 Graphrag, 记录一下测试步骤。先决条件: Python 3.10-3.12备注: 以下所有脚本都在 PowerShell环境下运行 1. 首先安装一下 graphrag python包 pip install --trusted-host https://mirrors.huaweicloud.com -i https://mirrors.huaweicloud.com/repository…

R语言软件套保期限GARCH、VAR、OLS回归模型对沪深300金融数据可视化分析

全文链接:https://tecdat.cn/?p=34670 原文出处:拓端数据部落公众号 金融市场的波动性一直是投资者和决策者关注的焦点之一。为了应对市场波动的风险,套保成为了一种重要的金融手段。在这个背景下,使用R语言软件中的GARCH VAR模型对沪深300金融数据进行分析,可以帮助我们更…

【视频讲解】Python比赛LightGBM、XGBoost+GPU和CatBoost预测学生在游戏学习过程表现|数据代码分享

全文链接:https://tecdat.cn/?p=36990原文出处:拓端数据部落公众号分析师:Qi Zhang背景基于游戏进行学习能让学校变得有趣,这种教育方法能让学生在游戏中学习,使其变得有趣和充满活力。尽管基于游戏的学习正在越来越多的教育环境中使用,但能用应用数据科学和学习分析原理…

excel单元格设置为文本为何还要双击

excel单元格设置为文本时为何还要双击才有效? 我选定一行,用右键设置为文本,为何还要单个逐一双击才有效,否则选定求和时(包含其中一个单元格),仍视为数值。而逐一双击太麻烦,怎么解决? 因为这是excel默认设置,如想要不单个操作,可使用分列的方式来批量处理。 具体操…

Interceptor 拦截器

1、拦截器的介绍拦截器使用场景:登录验证:对于需要登录才能访问的网址,使用拦截器可以判断用户是否已登录,如果未登录则跳转到登录页面。 权限校验:根据用户权限对部分网址进行访问控制,拒绝未经授权的用户访问。 请求日志:记录请求信息,例如请求地址、请求参数、请求时…

bootstrap-datetimepicker 项目

项目 此项目是bootstrap-datetimepicker 项目 的一个分支,原项目不支持 Time 选择。其它部分也进行了改进、增强,例如load 过程增加了对 ISO-8601 日期格式的支持。文档是拷贝/粘贴字原项目的文档,并且加入了更多细节说明。 别犹豫了,下载下来试试吧 ! 下载 ZIP 包此地址可…

TLScanary:Pwn中的利器

TLScanary:Pwn中的利器 引言:什么是TLScanary?在二进制漏洞利用(Pwn)领域,攻击者面临着层层防护措施的挑战。在安全竞赛(如CTF)和实际漏洞利用中,TLS(线程本地存储)和堆栈保护(stack canary)是常见的防护技术。TLScanary应运而生,它结合了TLS协议与堆栈保护技术,…

JS组件系列——BootstrapTable 行内编辑解决方案:x-editable

转载:http://www.cnblogs.com/landeanfen/p/5821192.html#_label2阅读目录一、x-editable组件介绍 二、bootstrapTable行内编辑初始方案 三、bootstrapTable行内编辑最终方案1、文本框 2、时间选择框 3、下拉框 4、复选框 5、“阴魂不散”的select2四、总结 正文 前言:之前介…