1. 程式人生 > >CSU 1473: 遞增子序列(sum型線段樹、離散化)

CSU 1473: 遞增子序列(sum型線段樹、離散化)

題目:

Description

  給出一個包含N個各不相同的整數的序列,求其遞增子序列的個數。

  輸入的第一行為測試資料的組數T (T > 0)。

Input

  每組測試數的第一行為一個整數N (1 ≤ N ≤ 105),表示序列中一共有N個整數。接下來一行包含N個小於109的各不相同的非負整數,依次描述了這個序列中的各個整數。

Output

  對於每組測試資料,輸出遞增子序列的個數。由於結果可能會很大,所以只需要輸出結果除以1000000007所得的餘數即可。

Sample Input

2
3
1 2 3
4
3 1 4 2

Sample Output

7
7

思路:

用結構體儲存3個資訊,輸入的數x,x在輸入序列中的序號k1,x在排序後的序號k2

輸入x的同時,初始化k1,然後根據x對結構體排序求出k2,然後根據k1對結構體排序,使得結構體順序復原

接下來依次求以每個數為結尾的遞增子序列的個數

程式碼:

#include<iostream>
#include<algorithm>
using namespace std;

int t, k, num[100001], sum[400001];
const int p = 1000000007;
structnode
{
	int x, k1, k2;
}nod[100001];

bool cmp1(nodea, nodeb)
{
	return a.x < b.x;
}
bool cmp2(node
a, nodeb) { return a.k1 < b.k1; } void update(int key, int low, int high, int uplace) { if (low == high) { sum[key] = num[low]; return; } int mid = (low + high) / 2; if (uplace <= mid)update(key * 2, low, mid, uplace); else update(key * 2 + 1, mid + 1, high, uplace); sum[key] = (sum[
key * 2] + sum[key * 2 + 1]) % p; } int query(int key, int low, int high, int x, int y) { if (low == x && high == y)return sum[key]; int mid = (low + high) / 2; if (mid < x)return query(key * 2 + 1, mid + 1, high, x, y); if (mid >= y)return query(key * 2, low, mid, x, y); return (query(key * 2, low, mid, x, mid) + query(key * 2 + 1, mid + 1, high, mid + 1, y)) % p; } int main() { cin >> t; while (t--) { cin >> k; for (int i = 1; i <= k; i++) { cin >> nod[i].x; nod[i].k1 = i, num[i] = 0; } for (int i = 1; i <= k * 4; i++)sum[i] = 0; sort(nod + 1, nod + k + 1, cmp1); for (int i = 1; i <= k; i++)nod[i].k2 = i; sort(nod + 1, nod + k + 1, cmp2); for (int i = 1; i <= k; i++) { num[nod[i].k2] = (query(1, 1, k, 1, nod[i].k2) + 1) % p; update(1, 1, k, nod[i].k2); } cout << sum[1] % p << endl; } return 0; }

相關推薦

CSU 1473: 遞增序列sum線段離散

題目:Description  給出一個包含N個各不相同的整數的序列,求其遞增子序列的個數。  輸入的第一行為測試資料的組數T (T > 0)。Input  每組測試數的第一行為一個整數N (1 ≤ N ≤ 105),表示序列中一共有N個整數。接下來一行包含N個小於10

1134 最長遞增序列時間複雜度O(n*log(n)

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 Description 給出長度為N的陣列,找出這個陣列的最長遞增子序列。(遞增子序列是指,子序列的元素是遞增的) 例如:5 1 6 8 2 4 5 10,最長遞增

poj 2528 線段_離散

Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their

最長遞增序列只求大小模板

初始化 輸入 div 分法 下界 ive tdi color ostream #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>

dp-最長遞增序列 LIS

一個數 bsp 註意 str 只有一個 自然 end alt ace 首先引出一個例子 問題 :   給你一個長度為 6 的數組 , 數組元素為 { 1 ,4,5,6,2,3,8 } , 則其最長單調遞增子序列為 { 1 , 4 , 5 , 6 , 8 } , 並且長度

習題3.4 最長連續遞增序列20 分浙大版《數據結構第2版》題目集

space align font list 格式 ott mar 不能 第一次 給定一個順序存儲的線性表,請設計一個算法查找該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入

動態規劃之最長遞增序列LIS

lib sca while -c -o 組成 describe log ret 在一個已知的序列{ a1,a2,……am}中,取出若幹數組成新的序列{ ai1, ai2,…… aim},其中下標 i1,i2, ……im保持遞增,即新數列中的各個數之間依舊保持原

51node 1134 最長遞增序列 數據結構

賦值 log 寫法 數字 name 內存 遞增 max scan 題意: 最長遞增子序列 思路: 普通的$O(n^2)$的會超時。。 然後在網上找到了另一種不是dp的寫法,膜拜一下,自己寫了一下解釋 來自:https://blog.csdn.net/Adusts/artic

7-7 最長連續遞增序列20 分 普通STL解出

這道題我看了一下  決定寫。 在寫之前網上看到很多高手的題解,深表敬意。 只是我想用STL來完成一下這道題。 7-7 最長連續遞增子序列(20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,

最大子段和與最長遞增序列貪心與動態規劃

話不多說先上程式碼。。。。。  最大子段和 題目描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。 輸入輸出格式 輸入格式:   第一行是一個正整數NNN,表示了序列的長度。 第二行包含NNN個絕對值不大於100001000010000的

最長遞增序列LIS

本篇部落格主要講述什麼是最長公共子序列、求解最長公共子序列的思想,以及程式碼。 什麼是最長公共子序列?   給定一個長度為N的陣列,找出一個最長的單調自增子序列(不要求是連續的)。例如:6 5 7 8 4 3 9 1,這裡的最長遞增子序列是{ 6, 7, 8, 9}或者{

最長連續遞增序列java

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤10​5​​);第2行給出n個整數,其間以空格分隔。 輸出格式:

LeetCode 491. 遞增序列C++

給定一個整型陣列, 你的任務是找到所有該陣列的遞增子序列,遞增子序列的長度至少是2。 示例: 輸入: [4, 6, 7, 7] 輸出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

51Nod1134 最長遞增序列動歸

這道題用動歸的思想寫,在所給的陣列中找到最長遞增子序列。定義一個新的陣列存最長子序列,第i項如果大於陣列的最後一項,就加入陣列,如果小於,就用二分查詢找到第一個大於第i項的數,然後取代之。 lower

動態規劃之最長單調遞增序列C++原始碼

動態規劃之最長單調遞增子序列 問題: L={a1,a2,a3,…,an}既L是由n個不同的實陣列成的序列,求L的最長單調遞增子序列(下標可不連續)。 分析: 設輔助陣列b,b[i]表示以a[i]為結尾的最長遞增子序列的長度,最長遞增子序列的長度,就是陣列b的最大

7-7 最長連續遞增序列20 分

7-7 最長連續遞增子序列(20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤10​5​​);第2行給

浙大版《資料結構》習題3.4 最長連續遞增序列20 分

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤105)n(≤105);第2行給出n個整數,其間

習題3.4 最長連續遞增序列20 分

#include<stdio.h> int main() {   int n,i=0;   scanf("%d",&n);   int num[100001]={0,0,};   while(n-->0)       scanf("%d",&

最長遞增序列輸出最長遞增序列 及其長度

最長遞增子序列的解法有很多種,常用的有最長公共子序列法、動態規劃、記錄所有遞增序列長度最大值的方法。 最長公共子序列法:如例子中的陣列A{5,6, 7, 1, 2, 8},則我們排序該陣列得到陣

最長遞增序列動態規劃

acc mage ios 數據 mes eth 遞增 整數 inpu 題目描述 有n個互不相同的整數an若存在一個數列bm其中對於任何1 < i < m滿足bi < bi+1 且 abi < abi+1則稱abn為an的一個遞增子序列試求出給