ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021.6.12模拟赛

2021-06-12 15:01:24  阅读:161  来源: 互联网

标签:12 2021.6 int ll 最小值 ch 模拟 区间 dp


题意

 

 


题解

1.一个P数如果是立方差数,不妨假设是x^3-y^3(x>y)。相当于(x-y)(x^2+xy+y^2),由于P是质数,因此x=y+1。又有(x-1)^2+x^2+x(x-1)=P,暴力枚举1~10^6判断即可。2.令dp[i][ j]表示前i个数分成j段的最少价值。枚举这个断点k,有dp[i][ j]=min{dp[k][ j-1]+sum(k+1,i)}。事实上这个k具有单调性,用经典的1D1D动态规划优化即可。3.对于所有区间最小值为x的操作的区间交只有一种情况会出现矛盾:对于最小值超过x的区间的并包含该区间交。因此我们可以二分答案,之后将所有最小值从大到小进行排序,利用并查集维护即可

2.令dp[i][ j]表示前i个数分成j段的最少价值。枚举这个断点k,有dp[i][ j]=min{dp[k][ j-1]+sum(k+1,i)}。事实上这个k具有单调性,用经典的1D1D动态规划优化即可。3.对于所有区间最小值为x的操作的区间交只有一种情况会出现矛盾:对于最小值超过x的区间的并包含该区间交。因此我们可以二分答案,之后将所有最小值从大到小进行排序,利用并查集维护即可。

3.对于所有区间最小值为x的操作的区间交只有一种情况会出现矛盾:对于最小值超过x的区间的并包含该区间交。因此我们可以二分答案,之后将所有最小值从大到小进行排序,利用并查集维护即可。


赛时代码

T1-cubicp立方数(60->100)


#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int N = 1e4+10;
ll a[N],sum[N];

void init()
{
	for(int i=1;i<=N;i++)
		a[i]=i*i*i;
//	for(int i=1;i<=N;i++)
//		sum[i]=a[i]-a[i-1];
}
bool check()
{
	ll p;
	scanf("%lld",&p);
	ll n=min((ll)(upper_bound(sum+1,sum+N+1,p)-sum),(ll)N);
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++)
			if(a[i]-a[j]==p) return 1;
	return 0; 
}
ll calc(ll x)
{
	return 3*x*x+3*x+1;
}
bool judge()
{
	ll p;
	scanf("%lld",&p);
	int l=1,r=1e6+10;
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(calc(mid)<p) l=mid+1;
		else r=mid;
	}
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(calc(mid)<=p) l=mid;
		else r=mid-1;
	}
	return calc(l)==p;
}
int main()
{
//	freopen("cubicp.in","r",stdin);
//	freopen("cubicp.out","w",stdout);
	init();
	int T;
	scanf("%d",&T);
	while(T--)
	{
		if(judge()) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

T2-dp动态规划(40)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e3+10,INF = 0x3f3f3f3f;
int n,K;
int a[N];
ll dp[N][N][25];
ll sum[N][N];
ll jc(ll x){return	x*(x-1)/2;}
ll calc(int l,int r)
{
	ll ans=0;
	for(int i = 1 ; i <= n ; i ++)
	{
		if(sum[r][i] != sum[l-1][i])
			ans+=jc(sum[r][i]-sum[l-1][i]); 
	}
	//printf("(%d,%d):%lld\n",l,r,ans);
	return ans;
}
ll solve(int l,int r,int k)
{
//	printf("checking[%d][%d][%d]\n",l,r,k);
	if(dp[l][r][k]) return dp[l][r][k];
	if(k == 1) 
	{		//printf(":dp[%d][%d][%d]=%lld\n",l,r,k,calc(l,r));
		return dp[l][r][k]=calc(l,r);
	}
	dp[l][r][k]=INF;
	for(int i=l;i<r;i++)
		for(int j=1;j<k;j++)
		{
			if(i-l+1>=j&&r-i+1>=k-j)
			dp[l][r][k]=min(dp[l][r][k],solve(l,i,j)+solve(i+1,r,k-j));
			
		}
//	printf("dp[%d][%d][%d]=%lld\n",l,r,k,dp[l][r][k]);
	return dp[l][r][k];
}
int main()
{	
	//freopen("dp.in","r",stdin);
	//freopen("dp.out","w",stdout); 
	scanf("%d%d",&n,&K);
	bool flag=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(i>1&&a[i]!=a[i-1]) flag=1;
	}
//	if(!flag) 
//	{
//		ll res=0;
//		if(n%K==0) 
//		{
//			res+=K*(jc(n/K));
//			printf("%lld",res);
//		}
//		else
//		{
//			res+=(K-1)*(jc(n/K));
//			res+=jc(n/K+n%K);
//			printf("%lld",res);
//		}
//		return 0;
//	}
	for(int i=1;i<=n;i++)
	{
		sum[i][a[i]]=sum[i-1][a[i]]+1;
		for(int j=1;j<=n;j++)
			if(j!=a[i]) sum[i][j]=sum[i-1][j];
	}
//	for(int j = 1 ; j <= 2 ; j ++)
//		for(int i = 1 ; i <= n ; i ++)
//			printf("%d,%d:%lld\n",i,j,sum[i][j]); 
	printf("%lld",solve(1,n,K));
	return 0;
}
/*
10 2
1 2 1 2 1 2 1 2 1 2 
*/

T3-number游戏(70)

#include<bits/stdc++.h>
using namespace std;
int read()
{
	int a = 0,x = 1;char ch = getchar();
	while(ch > '9' || ch < '0') {if(ch == '-') x = -1;ch = getchar();}
	while(ch >= '0' && ch <= '9') {a = a*10 + ch-'0';ch = getchar();}
	return a*x;
}
const int N = 1005;
int l[N], r[N];

int main()
{
	freopen("number.in", "r", stdin);
	freopen("number.out", "w", stdout);
	int n, k;
	scanf("%d%d", &n, &k);
	
	int ans;
	for (ans=1;ans<=k;ans++)
	{
		int a,b,c;
		a=read(),b=read(),c=read();
		if (l[c]==0||r[c]==0)
		  l[c]=a, r[c]=b;
		else
		{
			if (a>r[c]||b<l[c])
			  break;
			if (a>l[c])
			  l[c]=a;
			if (b<r[c])
			  r[c]=b;
		}
		for (int i=1;i<c;i++)
		{
			if (l[i]&&r[i]&&r[i]<=r[c]&&l[i]>=l[c])
			{
				printf("%d",ans);
				return 0;
			}
		}
		for (int i=c+1;i<=n;i++)
		{
			if (l[i]&&r[i]&&r[i]>=r[c]&&l[i]<=l[c])
			{
				printf("%d",ans);
				return 0; 
			}
		}
	}
	printf("%d", ans);
}
/*
20 5
1 10 4
1 5 4
5 6 6
6 10 6
4 5 5
*/

标签:12,2021.6,int,ll,最小值,ch,模拟,区间,dp
来源: https://www.cnblogs.com/conprour/p/14878286.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有