首页 > 其他分享 >NOIP2024模拟12:孤帆远影

NOIP2024模拟12:孤帆远影

时间:2024-06-10 16:32:54浏览次数:24  
标签:12 孤帆 ll cin long int ans NOIP2024 define

NOIP2024模拟12:孤帆远影

听了机房同学的讨论,于是T1死磕冒泡和逆序对做法。最后只得了40pts。

思想对了,但不是自己的做法。

还是要坚持自己想,坚持自己可以想出来,不要被任何人带偏。

T1

  • 一句话题意:将一个已知序列通过不断“交换相邻位置”的操作调整成不严格单峰状态,问最小的操作次数。

  • 有一种猜想是只要钦定了峰顶的位置,那么左右两边是不会交叉的。

    • 但这个猜想是错误的,它的证伪可以通过正解来理解
  • 正解:假设题目要求我们调成升序,那么答案就是逆序对的数量。

  • 现在是什么呢?要求前半段升序后半段降序。

  • 那就分开逆序对!

  • 具体来说,对于第 \(i\) 个数,想要待在左区间, 就必须穿过左边比它大的每个数,即在它左边的逆序对数量,待在右区间同理.

  • 由于峰顶的位置不做限制,所以我们只需要看每个数放左边移动步数少一点,还是放右边少一点,就行了.

  • 用树状数组求逆序对即可,只不过是正着倒着各扫一遍.

  • 所以此题我很早就陷入了一个误区:枚举峰顶的位置,想来这其实不是题目所求.把自己限制住了!

    • 下次考试应该先在草稿本上写出这个想法.尝试一段时间返回去检查自己的思想是不是除了问题的时候,就方便大胆地走出误区.

    时间复杂度 \(O(N log N)\)

    #include<bits/stdc++.h>
    #define F(i,l,r) for(int i(l);i<=r;++i)
    #define G(i,r,l) for(int i(r);i>=l;--i)
    #define int long long
    #define lowbit(x) (-x&x)
    using namespace std;
    using ll = long long;
    const int N=2e5+5;
    int n,pos=0,mx=0;
    ll L[N],R[N],ans=0;
    ll a[N],tr[N];
    void add(int x){
    	for(;x<=mx;x+=lowbit(x)) tr[x]++;
    }
    int ask(int x){
    	int res=0;
    	for(;x>=1;x-=lowbit(x)) res+=tr[x];
    	return res;
    }
    signed main(){
    	//freopen("inde.in","r",stdin);
    	//freopen("inde.out","w",stdout);
    	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    	cin>>n;
    	F(i,1,n) cin>>a[i],mx=max(mx,a[i]);	
    	F(i,1,n){
    		add(a[i]);
    		L[i]=i-ask(a[i]);
    	}memset(tr,0,sizeof(tr));
    	G(i,n,1){
    		add(a[i]);
    		R[i]=n-i+1-ask(a[i]);
    	}
    	F(i,1,n){//the fjx
    		ans+=min(L[i],R[i]);	
    	}
    	cout<<ans;
    	return 0;	
    }
    

T2

  • 一句话题意:给定一个起点,你现在需要依次抵达 \(n\) 个目标区间,既可以亲自去,也可以请别人代劳,但花费都是起终点之间的距离(允许亲自走一半再代劳一半).问最少的花费.

  • 有点儿抽象,还没有完全理解,尝试着解释一下:

  • 记 \(f[i][j]\) 表示第 \(i\) 次游历最终到达 \(j\) 的最小花费.

    • 首先从 \(f[i-1]\) 继承dp值
    • 对于操作1: \(j\) 离 \([l_i,r_i]\) 的最近距离即为此部分贡献.
    • 对于操作2:用 \(f[i][j]+1\) 更新 \(f[i][j-1]\) 和 \(f[i][j+1]\)
  • 最关键的一步:根据操作2,对于每个 \(i\), 将 \(f[i][j]\) 看成关于 \(j\) 的函数,则一定长这个样子:

  • 转移时,维护中间平的那一段,最后得到的贡献一定就是最优的.(感性理解一下)

  • 时间复杂度 \(O(N)\)

    #include<bits/stdc++.h>
    #define F(i,l,r) for(int i(l);i<=r;++i)
    #define G(i,r,l) for(int i(r);i>=l;--i)
    #define int long long
    using namespace std;
    using ll = long long;
    const int N=5e5+105;
    int n,x;
    signed main(){
    //	freopen("festival.in","r",stdin);
    //	freopen("festival.out","w",stdout);
    	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    	cin>>n>>x; int l=x,r=x,L,R;
    	ll ans=0;
    	while(n--){
    		cin>>L>>R;
    		if(l<=R && L<=r){
    			if(L>l) l=L;
    			if(R<r) r=R;
    		}
    		if(R<l) ans+=l-R,r=l,l=R;
    		if(L>r) ans+=L-r,l=r,r=L;
    	}
    	cout<<ans;
    	return 0;	
    }
    

T3

  • \(O(NlogN)\) 求\(LIS\) 的板题,只不过带了个系数而已.

  • 理解:\(C_i\)的系数只影响后续 \(C_{i+1}\) 的判断,而不影响当前判断.

  • 唯一的细节就是带系数之后的数不一定比原来小,要取 min.

    #include<bits/stdc++.h>
    #define F(i,l,r) for(int i(l);i<=r;++i)
    #define G(i,r,l) for(int i(r);i>=l;--i)
    #define lowbit(x) (-x&x)
    #define int long long
    using namespace std;
    using ll = long long;
    const int N=1e6+5;
    int f[N],a[N],b[N];
    int n;
    signed main(){
    	//freopen("geranium.in","r",stdin);
    	//freopen("geranium.out","w",stdout);
    	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    	cin>>n;
    	F(i,1,n) cin>>a[i];
    	F(i,1,n) cin>>b[i];	
    	int ans=0;
    	F(i,1,n) f[i]=2e18;
    	F(i,1,n){
    		int pos=lower_bound(f+1,f+ans+1,a[i])-f;
    		f[pos]=min(f[pos],a[i]*b[pos]); 
    		ans=max(ans,pos);
    	}
    	cout<<ans<<"\n";
    	return 0;	
    }
    

标签:12,孤帆,ll,cin,long,int,ans,NOIP2024,define
From: https://www.cnblogs.com/superl61/p/18240785

相关文章

  • 运维系列:redis.conf“ E212: 无法打开并写入文件
    redis.conf"E212:无法打开并写入文件redis.conf"E212:无法打开并写入文件Redis配置文件的E212错误解决方法介绍E212错误的原因E212错误表示无法打开并写入文件,这通常是由于以下几个原因造成的:解决方法1.权限问题2.文件不存在3.文件被锁定4.重启Redis服务流程图......
  • INA128UA/2K5精密仪表放大器芯片中文资料PDF数据手册引脚图产品手册产品参数
    INA128的说明INA128和INA129(INA12x)均为具备出色精度的低功耗通用仪表放大器。这些放大器采用多功能三级运算放大器设计,尺寸小巧,适用于多种应用。即使在高增益(200kHz、G=100)情况下,电流反馈输入电路也可提供宽带宽。可通过单个外部电阻器在1到10,000范围内设置任......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第2题new,delete的指向深度拷
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:本章练习第2题涉及标准函数及关键词toupper,tolower(),strcpy_s(),strcat_s(),strcmp,strlen(),new[],delete[].实现如下效果输出应与下面相似:Pleaseenteryourname:FrettaFarboMynameis......
  • 2024 XTU PDE 12题 两点边值问题有限体积格式
    考虑如下两点边值问题\[\begin{cases}-u^{''}+10(2x-1)u'+20u=0,\quad0<x<1,\\u(0)=u(1)=1.\end{cases}\]真解取为\[u=e^{-10x(1-x)}.\]写出求解上述问题的有限体积格式。编程实现上述有限体积法,并计算节点处的最大误差,考查其收敛阶。解:(a)有限体积格式:\[\left\{\beg......
  • Leetcode-1221
    题目1221.分割平衡字符串难度:简单在一个平衡字符串中,'L'和'R'字符的数量是相同的。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。返回可以通过分割得到的平衡......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第1题new,delete的指向深度拷
    C++PrimerPlus第12章类和动态内存分配12.10编程练习第1题`提示:练习一定要动手操作涉及标准函数及关键词1,new[],delete[],strlen(),strcpy_s(),cout,endl,explicit例如:1,对于下面的类的声明:`提示:设计数组和字符串的new,delete文章目录C++PrimerPlus第12章类......
  • IDEA 12大全局配置,快速提供开发效率
    IDEA相关配置整理于2024.06.0923:23@程序员猴哥1编码设置:File-->newprojectssettings-->settingsfornewprojects-->editor--->fileencodings-->globalencodeing:utf-8;projectencoding:utf-8;defaultencodingforpropertiesfiles:utf-8![img](file......
  • 123
    packagemainimport( "testing" "github.com/hyperledger/fabric/core/chaincode/shim" "fmt")funccheckInit(t*testing.T,stub*shim.MockStub,args[][]byte){ res:=stub.MockInit("1",args) ifres.Status......
  • Spring Boot入坑-12-项目实战
    目标掌握后端项目整体架构搭建,掌握从0到1构建一个完整项目巩固已学习的后端技术,覆盖Java基础、SpringBoot的主要课程内容,包括但不限:序列化、反射、注解、泛型、Lambda、Stream、REST、Interceptor、数据访问、Swagger等等一些扩展内容的学习,比如登录、密码加密、项目部......
  • (nice!!!)LeetCode 312. 戳气球(区间dp ||记忆化dfs )
    312.戳气球思路:经典区间dp问题。方法一,区间dp。状态dp[i][j]表示:ij这个区间能获得的最大硬币数量。那么我们就可以枚举区间ij的每一个点,为该区间最后一个戳破的气球。细节看注释classSolution{public:intmaxCoins(vector<int>&nums){intn=nums.siz......