Bzoj 1145
Bzoj 3155

Bzoj 3636

coc youyl posted @ 2015年7月02日 20:25 in bzoj , 1223 阅读

题目分类:教义问答手册

上面的分类是瞎搞的

实际上是:动态规划,分块。

题意:

参见http://www.lydsy.com/JudgeOnline/problem.php?id=3636

题解:

考虑朴素的动态规划f[i]表示进行到第i位的结果,转移是向前取l个还是不取。

考虑第二个部分分,可以发现可以使用线段树维护,在合并区间的时候需要枚举截点是一个l的哪个位置。

得到思路可以进行分块,对于每个询问考虑如果不跨越区块就随意,跨越区块就取开头的第一个分界进行枚举,需要预处理一大堆动态规划值。

一堆细节神烦。

程序:

#include<cstdio>
#include<cstring>
#include<utility>
#include<vector>
#include<algorithm>
using namespace std;
pair<pair<int,int>,int>qu[120000];
int lef[60][120000],rig[60][120000];
int n,m,q;
int x1,x2;
int s[120000];
int ans[120000];
int siz;
int dp[20000];
vector<int>divd[20000];
inline int bruteforce(int x,int y)
{
	memset(dp,0,sizeof(dp));
	for (int i=x;i<=y;i++)
	{
		int tp=i-x+1;
		if(tp>=m)dp[tp]=max(dp[tp-1],dp[tp-m]+s[i]-s[i-m]);
	}return dp[y-x+1];
}
inline int summ(int x,int y)
{
	return s[y]-s[x-1];
}
inline int rebuild(int x)
{
	memset(lef,0,sizeof(lef));
	memset(rig,0,sizeof(rig));
	for (int i=m;i>=0;i--)
	{
		for (int j=x-m+i+1;j>=x-siz+1;j--)
		{
			
			lef[i][j]=max(lef[i][j+1],lef[i][j+m]+summ(j,j+m-1));
		//	printf("lef:%d %d %d %d\n",x,i,j,lef[i][j]);
		}
	}
	for (int i=m;i>=0;i--)
	{
		int tp=x+i;
		for (int j=tp;j<=n;j++)
		{
			if(j-m>tp-1)
			rig[i][j]=max(rig[i][j-1],rig[i][j-m]+summ(j-m+1,j));
		//	printf("rig:%d %d %d %d\n",x,i,j,rig[i][j]);
		}
	}
}
inline int solve(int x,int y,int mid)
{
	int res=0;
	for (int i=m;i>=0;i--)
	{
		if(i+mid<=y)
		res=max(lef[i][x]+rig[i][y],res);
	}return res;
}
inline int getint()
{
	int mi=1,fl=0,res=0;
	char chx=getchar();
	while (1)
	{
		if(chx=='-')mi=-1;
		else if(chx<='9'&&chx>='0')
		{
			res*=10;
			res+=chx-'0';
			fl=1;
		}
		else
		{
			if(fl==1)break;
		}chx=getchar();
	}
	return mi*res;
}
int main()
{
	n=getint();m=getint();
	siz=10000;
	for (int i=1;i<=n;i++)
	{
		s[i]=getint();
		s[i]=s[i-1]+s[i];
	}
	q=getint();
	for (int i=1;i<=q;i++)
	{
		qu[i].first.first=getint();qu[i].first.second=getint();
		qu[i].second=i;
		if(qu[i].first.second-qu[i].first.first+1<=siz)
		{
			ans[qu[i].second]=bruteforce(qu[i].first.first,qu[i].first.second);
		//	printf("%d %d\n",i,qu[i].first.second-qu[i].first.first+1);
		}
		else divd[(qu[i].first.first-1)/siz+1].push_back(i);
	}
	for (int i=siz;i<n;i+=siz)
	{
		rebuild(i);//printf("%d\n",i);
		int pos=i/siz;
		int tp=divd[pos].size();
		for (int j=0;j<tp;j++)
		{
			ans[qu[divd[pos][j]].second]=solve(qu[divd[pos][j]].first.first,qu[divd[pos][j]].first.second,i);
		}
	}
	for (int i=1;i<=q;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}
Tripura Board Model 说:
2022年8月19日 14:25

Tripura Board Model Paper 2023 Pdf Download for TBSE Sample Model Question Paper for Class 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, +1 & +2 Arts, Science & Commerce Stream Theory, Objective (MCQ) and Bit Questions to English Medium, Hindi Medium and others. Tripura Board Model Paper New Exam Scheme or Question Pattern for Sammittive Assignment Exams (SA1 & SA2): Very Long Answer (VLA), Long Answer (LA), Small Answer (SA), Very Small Answer (VSA), Single Answer, Multiple Choice and etc.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter