程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> HDOJ 4455 Substrings 遞推+樹狀數組

HDOJ 4455 Substrings 遞推+樹狀數組

編輯:關於C++

 

pre[i]第i位數往前走多少位碰到和它相同的數

dp[i]表示長度為i的子串,dp[i]可以由dp[i-1]加上從i到n的pre[i]>i-1的數減去最後一段長度為i-1的斷中的不同的數得到....

爆int+有點卡內存....

 

 

Substrings

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2300 Accepted Submission(s): 716



Problem Description XXX has an array of length n. XXX wants to know that, for a given w, what is the sum of the distinct elements’ number in all substrings of length w. For example, the array is { 1 1 2 3 4 4 5 } When w = 3, there are five substrings of length 3. They are (1,1,2),(1,2,3),(2,3,4),(3,4,4),(4,4,5)
The distinct elements’ number of those five substrings are 2,3,3,2,2.
So the sum of the distinct elements’ number should be 2+3+3+2+2 = 12
Input There are several test cases.
Each test case starts with a positive integer n, the array length. The next line consists of n integers a1,a2…an, representing the elements of the array.
Then there is a line with an integer Q, the number of queries. At last Q lines follow, each contains one integer w, the substring length of query. The input data ends with n = 0 For all cases, 06, 0<=Q<=104, 0<= a1,a2…an <=106
Output For each test case, your program should output exactly Q lines, the sum of the distinct number in all substrings of length w for each query.
Sample Input
7
1 1 2 3 4 4 5
3
1
2
3
0

Sample Output
7
10
12

Source 2012 Asia Hangzhou Regional Contest

 

 

/* ***********************************************
Author        :CKboss
Created Time  :2015年08月17日 星期一 22時06分06秒
File Name     :HDOJ4455.cpp
************************************************ */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include

using namespace std;

typedef long long int LL;
const int maxn=1001000;

int n;
LL dp[maxn];
int a[maxn];
int pre[maxn];
int spre[maxn];
int wz[maxn];
bool vis[maxn];

/*************BIT*********************/

inline int lowbit(int x) { return x&(-x); }

int tree[maxn];

void add(int p,int v)
{
	for(int i=p;i=1;i--)
		{
			int x=a[i];
			if(wz[x]==-1) wz[x]=i;
			else
			{
				spre[wz[x]-i]++;
				pre[wz[x]]=wz[x]-i;
				wz[x]=i;
			}
		}

		int zero=0,nozero;
		for(int i=1;i<=n;i++)
		{
			if(pre[i]==0) zero++;
			if(spre[i]) add(i,spre[i]);
		}
		int ed=n;
		int siz=0;
		nozero=n-zero;
		dp[1]=n; zero--;

		for(int i=2;i<=n;i++)
		{
			if(vis[a[ed]]==false)
			{
				vis[a[ed]]=true;
				siz++;
			}
			ed--;
			int B=siz;
			int A=zero+nozero-sum(i-1);
			dp[i]=dp[i-1]+A-B;
			if(pre[i]) nozero--,add(pre[i],-1);
			else zero--;
		}
		int Q;
		scanf(%d,&Q);
		while(Q--)
		{
			int x;
			scanf(%d,&x);
			printf(%lld
,dp[x]);
		}
	}

    return 0;
}

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved