題目
結果只有80分,不夠學了一招。
將問題轉化為離線問題。
我們先將詢問按右節點公升序排序。
然後對於每乙個值,我們可以肯定的是,只有最靠近詢問右端的值才可能起作用。
case 1 :如果詢問不包括某個值。那麼這個值,對答案沒有影響
case 2 :包括的話,那麼至少包括1個這樣的值,而我們詢問的是不同的個數,所以對答案也沒有影響
這樣的話,我們只需要維護最靠右的位置在哪就行了。
#include#include#includeusing namespace std;
struct bit
} int sum(int pos)
return ans;
} int check(int l,int r) };
bit bit;
int last[1000100];
int base[500100];
int ans[200100];
struct node
;bool compare(const node &a,const node &b)
while(in>='0'&&in<='9')
return s*f;
}node query[200100];
int main()
sort(query+1,query+1+m,compare);//排序,左端點其實可以不拍
int i=0;//i是當前遍歷到的右端點
for(int j=1;j<=m;j++)
else
}//printf("%d\n",bit.check(query[i].left,query[i].right));
ans[query[j].num]=bit.check(query[j].left,query[j].right);
} for(i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
樹狀陣列維護區間最值
題目描述 給你乙個1 n的排列和乙個棧,入棧順序給定 你要在不打亂入棧順序的情況下,對陣列進行從大到小排序 當無法完全排序時,請輸出字典序最大的出棧序列 輸入描述 第一行乙個數n 第二行n個數,表示入棧的順序,用空格隔開,結尾無空格 輸出描述 輸出一行n個數表示答案,用空格隔開,結尾無空格 示例1輸...
求區間不同數字的個數和和
1 byte 8 bit 1 kb 1,024 bytes 1 mb 1,024 kb 1,048,576 bytes 乙個int是4位元組即4byte.求個數和求和類似,不過是在更新的時候把1變成了這個數的值,下面就講講求區間不同數字的個數。首先我們思考對於右端點固定的區間 即r確定的區間 我們如...
查詢任意區間內不同元素的個數
include using namespace std define ll long long const int maxn 2e5 5 const int mod 1e9 7 const double eps 1e 9 const double pi acos 1.0 const int inf ...