首页 > 其他分享 >P1912 [NOI2009] 诗人小G

P1912 [NOI2009] 诗人小G

时间:2024-10-02 19:11:45浏览次数:1  
标签:int double P1912 long tail dp sum 诗人 NOI2009

题目链接
题解:
定义
算上空格的前缀和\(sum[i]=\sum_{j=1}^{i}len[j]+1\)
\(dp[i]=min_{j<i}(dp[j]+|sum[i]-sum[j]-1+L|^p)\)
相当于枚举上一行的结尾在哪。
可以感性理解一下,i越靠后,最优决策点j一定会往后移。
所以决策点具有单调性。我有一个简单的证明,就是列个式子,证明i向后移一位,用j转移的式子一定小于用j-1转移。
然后,维护决策单调性,这道题不能直接用分治算法(好像可以cdq,但我不会),所以我们用二分队列来做。
首先遍历到一个点先计算它的\(dp[i]\),考虑队列中维护的是一个从小到大没有交集的一段区间的最优决策点。所以找到区间包含i的元素,转移即可。
然后更新转移点,显然我们可以通过二分确定(只考虑前面i个点)这点作为最佳决策点的区间,记录左端点,右端点直接当作\(n+1\)。将被完全覆盖的区间的最佳决策点弹出去(一定不如i)。最后入栈即可。
注意事项:\(1e18\) 用\(long long\)很危险,所以用\(long\) $double $来存牺牲一点精度。

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n,L,P,l[N],sum[N],q[N],ans[N],opt[N];
long double dp[N];
string s[N]; 
long double ksm(long double x,int y)
{
	long double an=1;
	while(y)
	{
		if(y&1)an=an*x;
		y>>=1;
		x=x*x;
	}
	return an;
}
long double js(int j,int i)
{
	return dp[j]+ksm((long double)abs(sum[i]-sum[j]-1-L),P);
}
int find(int x,int y)
{
	int l=x,r=n+1,an=n+1;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(js(x,mid)<js(y,mid))l=mid+1;
		else an=mid,r=mid-1;
	}
	return an;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>L>>P;
		for(int i=1;i<=n;i++)
		{
			sum[i]=0;
			cin>>s[i]; 
			sum[i]=sum[i-1]+s[i].size()+1;
		}
		int head=1,tail=1;q[1]=0;
		for(int i=1;i<=n;i++)
		{
			while(head<tail&&l[head]<=i)head++;//l记录下一区间的左端点即当前区间的最大值
			opt[i]=q[head];
			dp[i]=js(q[head],i);
			while(head<tail&&l[tail-1]>=find(q[tail],i))tail--;
			l[tail]=find(q[tail],i);
			q[++tail]=i; 
			//printf("%d %lld %d %d\n",opt[i],(long long)dp[i],l[tail-1],q[tail]);
		}
		if(dp[n]>1e18)cout<<"Too hard to arrang"<<'\n';
		else
		{
			cout<<(long long)dp[n]<<'\n'; 
			int x=n,cnt=0;
			ans[++cnt]=n;
			while(x!=0)
			{
				x=opt[x];
				ans[++cnt]=x;
			}
			for(int i=cnt;i;i--)
			{
				for(int j=ans[i]+1;j<=ans[i-1];j++)
				{
					cout<<s[j];
					if(j!=ans[i-1])cout<<' ';
				}		
				if(i!=1)cout<<'\n';					
			}				
		}
		cout<<"--------------------";if(t)cout<<'\n';
	}
	return 0;
 } 

标签:int,double,P1912,long,tail,dp,sum,诗人,NOI2009
From: https://www.cnblogs.com/storms11/p/18444992

相关文章

  • [HNOI2009] 梦幻布丁
    [HNOI2009]梦幻布丁题意给出一个序列\(a\),有\(q\)次操作,每次修改把序列中一种数全部改为另一种数。每次询问,查询序列\(a\)的颜色段个数。思路颜色段只有同一种颜色才有贡献,我们考虑每种颜色开一棵平衡树维护。每种颜色维护其在原序列中的下标,下标连续的一段区间就是一......
  • P6109 [Ynoi2009] rprmq1 题解
    Description有一个\(n\timesn\)的矩阵\(a\),初始全是\(0\),有\(m\)次修改操作和\(q\)次查询操作,先进行所有修改操作,然后进行所有查询操作。一次修改操作会给出\(l_1,l_2,r_1,r_2,x\),代表把所有满足\(l_1\lei\ler_1\)且\(l_2\lej\ler_2\)的\(a_{i,j}\)元......
  • P3200 [HNOI2009] 有趣的数列
    哇,太恶心了思路首先我们将题意简化,简化后为对于任意一个偶数位所填数必然大于等于自己的下标,那么考虑填数,如果填的偶数比奇数多,那么此时要么填尽偶数后失败,或者下一个位置填奇数就炸,比如偶数刚好多一个,那么必然有一个偶数放在了奇数位,那么本来下一个要填的偶数往前移了一个,导致......
  • ssm古诗和诗人的可视化分析和信息检索-计算机毕业设计源码08278
    目录1绪论1.1选题背景1.2选题的目的意义1.3论文结构与章节安排2系统分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统流程分析2.2.1添加信息流程2.2.2修改信息流程2.2.3删除信息流程2.3 系统功能分析2.3.1功能......
  • P1912 [NOI2009] 诗人小G 题解
    我们设\(s_i\)表示前\(i\)个句子的长度之和,这样就有dp\[f_i=\min_{j<i}\big\{f_j+|s_i-s_j+i-j-1-L|^P\big\}\]我们设\(w(l,r)=|s_r-s_l+r-l-1-L|^P\),如果\(w\)满足四边形不等式,则原dp具有决策单调性。设\(u=(s_i+i)-(s_j+......
  • 14-45 剑和诗人19 - 一个负责任的 AI 成熟度 端到端 框架
    介绍人工智能有望改变企业和社会,但如果部署不当也会带来风险。最近围绕有偏见和不可靠的人工智能系统的争议表明,需要严格的治理来建立公众信任。这对于语言模型尤其重要——语言模型是在大量文本数据集上训练的高级人工智能模型,可以生成类似人类的写作。让我分享一个负责......
  • 14-48 剑和诗人22 - RAG 的主要痛点和解决方案
    ​​​​​检索增强生成(RAG)模型已成为一种有前途的方法,它利用存储在文档中的外部知识来提高生成文本的准确性和相关性。通过检索和调节相关的上下文文档,与传统语言模型相比,RAG模型可以产生更真实、更深入和更具体的响应。然而,与任何新技术一样,RAG模型也面临着一系列......
  • 14-42 剑和诗人16 - 如何从一个技术人员到CTO再到投资人的角色转变
    ​​​​​​我清楚地记得我的职业轨迹发生转变的那个关键时刻。当时,我正向整个执行领导团队和董事会成员介绍我们部门的技术路线图,感到说服这些有影响力的利益相关者资助一系列雄心勃勃的计划的压力。我知道他们的支持(和资金)将释放变革能力,推动我们公司开启颠覆性增长的下......
  • [NOI2009] 二叉查找树 & 笛卡尔树学习笔记
    这个题:二叉搜索树原理认识+区间dp;只要熟练相关算法就一定可以做出来。但我不行。。。我们学习一下笛卡尔树:什么垃圾东西,不学了。发现这个题是l蓝书上一道题jqb。二叉查找树又有一个性质:二叉查找树的中序遍历是其代表的序列从小到大排序的结果。而无论Treap如何旋转,其都......
  • 「NOI2009」诗人小G
    决策单调性#dp满足决策单调性,双端队列维护,可以二分出每两个限制的边界位置//Author:xiaruize#ifndefONLINE_JUDGEboolstart_of_memory_use;#else#definedebug(x)#endif#include<bits/stdc++.h>usingnamespacestd;#ifndefONLINE_JUDGEclock_tstart_clock=c......