首页 > 其他分享 >2024暑假集训测试4

2024暑假集训测试4

时间:2024-07-12 19:32:13浏览次数:17  
标签:val rs int void 2024 暑假 ans 集训 define

前言

image

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

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

T1 最短路

本题考察对 \(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 树

暂时还没打。

标签:val,rs,int,void,2024,暑假,ans,集训,define
From: https://www.cnblogs.com/Charlieljk/p/18299249

相关文章

  • 使用ScaleBar调整CAD设计的尺寸-devDept EyeShot 2024.2
    使用新的ScaleBar调整CAD设计的尺寸2024年7月10日devDeptSoftware的EyeShot2024.2提供了一个屏幕标尺,用于实时尺寸估算,从而消除了初始设计阶段的猜测。devDeptSoftware的Eyeshot可让您将强大的CAD功能集成到.NET应用程序中。......
  • 【专题】2024餐饮行业及营销趋势报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=36256原文出处:拓端数据部落公众号2024年,餐饮行业的趋势展望聚焦于健康、国潮、单品爆款和情感体验四大方向。首先,健康成为了消费者在选择餐饮时的首要考量。人们越来越注重食材的新鲜度和健康性,对菜品的口味也有了更高的要求。这意味着餐饮品牌需......
  • 2015 北京省队集训
    2015北京省队集训Day1训练题树的难题给定n个点的边带权三色树(黑白灰),定义“均衡的”三色树为“不存在黑点”或“只存在不超过1个白点”。删掉一些边得到“均衡的”森林,最小化删掉的边权和。数据范围\(n\le3*10^5\)key:dp\(f(u,op)\)代表u子树合法,且u所在连通块......
  • 2024 暑假训练记录
    2024暑假集训记录Day1-7.7cszhpdx生日快乐!教练发了2015BJJLHN省队集训,大概把BJ的题顺了一遍,感受是十年前的题目都好板啊...ppt还没来得及看,只简单看了几个2015BJ省队集训Day2-7.82021.8.30-2024.7.8继续看BJ省队集训题,写题解。发现即使很板,但是......
  • Nessus Professional 10.7 Auto Installer for Ubuntu 24.04 (updated Jul 2024)
    NessusProfessional10.7AutoInstallerforUbuntu24.04(updatedJul2024)发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-ubuntu/,查看最新版。原创作品,转载请保留出处。Ness......
  • 2024-07-12 vue项目中 运行 npm run build 或 yarn build 打包 没有生成 xx.es.js 文
    我在写一个ui组件库,在打包时发现dist文件夹里没有生成我想要的xx.es.js文件,我查看了我的vue项目中的vue.config.js文件,发现build.lib没有指定输出的文件名解决方案:配置项目中的vue.config.js文件,参考我的......
  • vue3前端项目结构解析(2024-07-12)
    .├──build#打包脚本相关│  ├──config#配置文件│  ├──generate#生成器│  ├──script#脚本│  └──vite#vite配置├──mock#mock文件夹├──public#公共静态资源目录├──src#主目录│  ├──api#接口......
  • vue3项目中浏览器打开本地文档或者下载本地应用的方法(2024-07-11)
    在public文件夹下面加入预览的文件【操作说明文档】。public文件夹包含了应用程序的入口HTML文件,以及其他不需要经过编译的静态文件此文件夹不会压缩并且路径不变,所以是最佳的存放文件的位置。代码:<template><n-icontitle="操作文档"style="cursor:pointer;margin-......
  • 高级java每日一道面试题-2024年7月12日
    如果有遗漏,评论区告诉我进行补充面试官问:你对IO流了解多少我回答:一.什么是JavaIO流?回答:JavaIO流是用于处理输入和输出操作的一组类和接口。它允许程序从不同的数据源(如文件、网络连接、内存缓冲区等)读取数据或将数据写入到不同的目标位置。IO流分为字节流和......
  • 【版面有限,早投稿早录用】第三届图像处理、目标检测与跟踪国际学术会议(IPODT 2024)
    第三届图像处理、目标检测与跟踪国际学术会议(IPODT2024)将于2024年8月9-11日在中国南京召开。本次会议旨在为全球的研究人员、工程师、学者和业界专家提供一个展示和讨论图像处理、目标检测与跟踪最新进展的平台,促进这些领域的科研与技术发展。会议内容涵盖从基础研究到应用开......