首页 > 其他分享 >HZOI初三奥赛模拟测试3-T2

HZOI初三奥赛模拟测试3-T2

时间:2024-03-26 18:13:44浏览次数:32  
标签:10 return HZOI int T2 read 奥赛 dp define

\(HZOI\)初三奥赛模拟测试\(3-T2\)

题目描述

给定序列 \(a_1,a_2,\dots a_n\) ,现在可以选择删除一些数,使得删除后 \(\sum [a_i=i]\) 最大

做题历程

一下午就做了这一个题,打到最后才发现时间复杂度 \(O(\frac{n^2}{2})\) 过不去,没时间优化了,最后 \(73pts\),赛时最高,好像因为我多剪了一个小枝。

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define read read()
#define pt puts("")
inline int read
{
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') {if(c=='-')  f=-1;c=getchar();}
    while(c>='0'&&c<='9')   x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return f*x;
}
void write(int x)
{
    if(x<0)  putchar('-'),x=-x;
    if(x>9)  write(x/10);
    putchar(x%10+'0');
    return;
}
int n;
const int N=5*1e5+10;
int a[N];
int dis[N];
int dp[N];
int first[N];
int m;
int t[N];
int ans;
void LSH()
{
    for(int i=1;i<=n;i++)  t[i]=a[i];
    sort(t+1,t+n+1);
    m=unique(t+1,t+n+1)-t-1;
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(t+1,t+m+1,a[i])-t;
    return;
}

signed main()
{
    freopen("sequence.in","r",stdin);
    freopen("sequence.out","w",stdout);
    n=read;
    for(int i=1;i<=n;i++){
        a[i]=read;
        dis[i]=i-a[i];
    }
    LSH();
    for(int i=1;i<=n;i++){
        if(dis[i]>=0){//就是这,不让没可能的数跑
            for(int j=i-1;j>=1;j--){
                if(a[j]<a[i])
                    if(dp[j]>dp[i])
                        if((t[a[i]]-t[a[j]]-1)<=(i-j-1))
                            dp[i]=dp[j];
            }
            dp[i]++;
        }
        ans=max(ans,dp[i]);
        // cout<<"dp["<<i<<"]="<<dp[i]<<'\n';
    }
    write(ans);pt;
    return 0;
}

正解

我比较 \(cai\),所以用的是@hs_mo树状数组优化DP,官方题解的神做法我显然是不会的 $\dots $

分析这个\(DP\),式子很好推:

\[dp_i=\max {dp_j} +1 \]

而 \(j\) 要满足:

\[j<i \]

\[a_j<a_i \]

\[a_i-a_j \leq i-j \ 即\ a_i-i \leq a_j-j \]

我们发现,当满足下面两条性质时,一定有 \(j<i\)
那么我们就先给 \(a\) 数组排序,这样可以保证树状数组往前查找时 \(a_j<a_i\) ;然后定义数组 \(c\), 令\(c_i=a_i-i\) ,再对 \(c\) 排序,那么处理当前 \(i\) 时,前面处理过的 \(c_j\),必然都大于 \(c_i\)。

然后就可以写出树状数组了,挺绕的,不画图看不出来

\(AC\ \ code\)



#include<bits/stdc++.h>
using namespace std;

#define lowbit(i)  (i&(-i))
#define int long long
#define read read()
#define pt puts("")
inline int read
{
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') {if(c=='-')  f=-1;c=getchar();}
    while(c>='0'&&c<='9')   x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return f*x;
}
void write(int x)
{
    if(x<0)  putchar('-'),x=-x;
    if(x>9)  write(x/10);
    putchar(x%10+'0');
    return;
}
int n;
const int N=5*1e5+10;
int dis[N];
int dp[N];
int first[N];
int m;
int t[N];
int ans;
struct Node{
    int id;
    int val;
}a[N];
struct C{
    int dis;
    int id;
}c[N];
bool cmp1(Node A,Node B)
{
    if(A.val==B.val)  return A.id<B.id;
    return A.val<B.val;
}

bool cmp2(C A,C B)
{
    if(A.dis==B.dis)  return A.id<B.id;
    return A.dis>B.dis;
}
int tr[N];
void add(int x,int k)
{
    for(int i=x;i<=n;i+=lowbit(i)){
        tr[i]=max(tr[i],k);
    }
}
int query(int x)
{
    int res=0;
    for(int i=x;i>0;i-=lowbit(i)){
        res=max(res,tr[i]);
    }
    return res;
}
bool f[N];
signed main()
{
    freopen("sequence.in","r",stdin);
    freopen("sequence.out","w",stdout);
    n=read;
    for(int i=1;i<=n;i++){
        a[i].val=read;
        a[i].id=i;
    }
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;i++){
        c[i].dis=a[i].val-a[i].id;
        c[i].id=i;
    }
    sort(c+1,c+n+1,cmp2);
    for(int i=1;i<=n;i++)
    {
        if(a[i].val==a[i-1].val)  first[i]=first[i-1];
        else  first[i]=i;//因为我们要处理a[j]<a[i]的,所以要把等于它的跳过
    }
    for(int cc=1;cc<=n;cc++){
        if(c[cc].dis>0)  continue;  
        int i=c[cc].id;
        dp[i]=query(first[i]-1)+1;
        add(i,dp[i]);
        ans=max(ans,dp[i]);
    }
    write(ans);pt;
    return 0;
}

我是废物

标签:10,return,HZOI,int,T2,read,奥赛,dp,define
From: https://www.cnblogs.com/lty-ylzsx/p/18097249

相关文章

  • citect2018R2学习笔记:Citext.textbox控制字体
    新浪那边的审查真的严格,一晚上了,一篇学习笔记还是没有过审,在这里也发表一次吧。前两天群里面有个哥们咨询怎么控制Citext.textbox控件的字体,我尝试着做了练习,还是比较简单的。假设Citext.textbox控件编号是AN4,写下面的脚本:FUNCTIONCitext_Fontini()OBJECTcitextcitext=Obje......
  • IT24765: TIMING ISSUE IN PACKAGE CACHE WORKSPACE MAY CAUSE PANIC
    IT24765:TIMINGISSUEINPACKAGECACHEWORKSPACEMAYCAUSEPANIChttps://www.ibm.com/mysupport/s/defect/aCI0z0000004vGZ/dt076912?language=fiDescriptionThere is a timing issue where there is a brief moment in time   that the state of ......
  • IT20262: APPLICATIONS FAIL WITH ERROR SQL30020N "0X124C"("0100") WHEN CONNECTING
    IT20262:APPLICATIONSFAILWITHERRORSQL30020N"0X124C"("0100")WHENCONNECTINGTHROUGHAGATEWAYhttps://www.ibm.com/mysupport/s/defect/aCI3p000000kFjD/dt158090?language=en_USDescriptionIf you have an application that connects......
  • Linux C编程一站式学习 part2: C语言本质
    LinuxC编程一站式学习(akaedu.github.io)22.Makefile基础1.基本规则欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新了,目标也必须随之被更新。“更新”:执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头对于Makefile中的每个以Tab开头......
  • CanvasRenderingContext2D: setLineDash() method格式说明
    定义setLineDash(segments)segments一个数组,用于指定交替绘制直线和间隙的距离(以坐标空间单位表示)。如果数组中元素的个数是奇数,数组中的元素会被复制并连接起来。例如,[5,15,25]将变成[5,15,25,5,15,25]。如果数组为空,破折号列表将被清除,行描边将恢复为实线。例子......
  • Linux mke2fs命令教程:创建和管理你的ext2/ext3/ext4文件系统(附案例详解和注意事项)
    Linuxmke2fs命令介绍mke2fs(makeext2filesystem)命令是用来创建ext2/ext3/ext4文件系统的。它通常在磁盘分区上创建文件系统,设备是对应设备的特殊文件(例如/dev/hdXX)。如果省略了块数,mke2fs会自动计算文件系统的大小。Linuxmke2fs命令适用的Linux版本mke2fs命令在所有......
  • MT2492 16V输入 600KHz 2A DCDC同步降压转换器 航天民芯一级代理
    深圳市润泽芯电子有限公司为航天民芯一级代理描述  MT2492是一款完全集成的高效率产品2A同步整流降压变换器。MT2492在一段时间内高效运行宽输出电流负载范围。该设备提供两种工作模式,即PWM控制和PFM模式切换控制在更宽的工作范围内实现高效率加载。MT2492需要最少数量的......
  • Git22_使用SSH协议传输数据6
    一、Git支持的传输协议由于Git的远程仓库并不在我们本地,当我们在使用远程仓库的时候(例如克隆、拉取、推送)就会涉及到数据的网络传输,Git支持多种数据传输协议本地协议(Local)HTTPS协议SSH(SecureShell)协议Git协议我们前面的操作都是基于HTTPS协议进行的,本章节我们会学......
  • Git22_在IDEA中使用Git5
    一、在IDEA中配置Git安装好IntelliJIDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口,找到VersionControl下的git选项:选择git的安装目录后可以点击“Test”按钮测试是......
  • Git22_使用TortoiseGit管理文件版本4
    一、TortoiseGit下载与安装TortoiseGit是一款开源的Git图形界面工具,使用TortoiseGit可以简化Git相关的操作(本质上还是执行的Git相关命令)。TortoiseGit下载地址:https://tortoisegit.org/download/下载完成可以得到如下安装程序直接双击安装即可,安装完成后在桌面(也......