貪婪大陸 樹狀數組
阿新 • • 發佈:2019-01-12
clu get 格式 不想 cto namespace art com ace
題目背景
面對螞蟻們的瘋狂進攻,小FF的Tower defence宣告失敗……人類被螞蟻們逼到了Greed Island上的一個海灣。現在,小FF的後方是一望無際的大海, 前方是變異了的超級螞蟻。 小FF還有大好前程,他可不想命喪於此, 於是他派遣手下最後一批改造SCV布置地雷以阻擋螞蟻們的進攻。
題目描述
小FF最後一道防線是一條長度為N的戰壕, 小FF擁有無數多種地雷,而SCV每次可以在[ L , R ]區間埋放同一種不同於之前已經埋放的地雷。 由於情況已經十萬火急,小FF在某些時候可能會詢問你在[ L‘ , R‘] 區間內有多少種不同的地雷, 他希望你能盡快的給予答復。
對於30%的數據: 0<=n, m<=1000;
對於100%的數據: 0<=n, m<=10^5.
輸入輸出格式
輸入格式:第一行為兩個整數n和m; n表示防線長度, m表示SCV布雷次數及小FF詢問的次數總和。
接下來有m行, 每行三個整數Q,L , R; 若Q=1 則表示SCV在[ L , R ]這段區間布上一種地雷, 若Q=2則表示小FF詢問當前[ L , R ]區間總共有多少種地雷。
輸出格式:對於小FF的每次詢問,輸出一個答案(單獨一行),表示當前區間地雷總數。
輸入輸出樣例
輸入樣例#1: 復制5 4 1 1 3 2 2 5 1 2 4 2 3 5輸出樣例#1: 復制
1 2
樹狀數組維護一個區間的頭尾;
#include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #include<bitset> #include<ctime> #include<deque> #include<stack> #include<functional> #include<sstream> //#include<cctype> //#pragma GCC optimize(2) using namespace std; #define maxn 1000005 #define inf 0x7fffffff //#define INF 1e18 #define rdint(x) scanf("%d",&x) #define rdllt(x) scanf("%lld",&x) #define rdult(x) scanf("%lu",&x) #define rdlf(x) scanf("%lf",&x) #define rdstr(x) scanf("%s",x) typedef long long ll; typedef unsigned long long ull; typedef unsigned int U; #define ms(x) memset((x),0,sizeof(x)) const long long int mod = 1e9 + 7; #define Mod 1000000000 #define sq(x) (x)*(x) #define eps 1e-3 typedef pair<int, int> pii; #define pi acos(-1.0) //const int N = 1005; #define REP(i,n) for(int i=0;i<(n);i++) typedef pair<int, int> pii; inline ll rd() { ll x = 0; char c = getchar(); bool f = false; while (!isdigit(c)) { if (c == ‘-‘) f = true; c = getchar(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return f ? -x : x; } ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a%b); } int sqr(int x) { return x * x; } /*ll ans; ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ans = exgcd(b, a%b, x, y); ll t = x; x = y; y = t - a / b * y; return ans; } */ int n, m; int lowbit(int x) { return x & -x; } int sum1[maxn], sum2[maxn]; void add1(int x) { for (int i = x; i <= n; i += lowbit(i)) { sum1[i]++; } } void add2(int x) { for (int i = x; i <= n; i += lowbit(i)) { sum2[i]++; } } int query1(int x) { int s = 0; while (x>0) { s += sum1[x]; x -= lowbit(x); } return s; } int query2(int x) { int s = 0; while (x > 0) { s += sum2[x]; x -= lowbit(x); } return s; } int main() { //ios::sync_with_stdio(0); rdint(n); rdint(m); int q, l, r; for (int i = 1; i <= m; i++) { rdint(q); rdint(l); rdint(r); if (q == 1) { add1(l); add2(r); } else { cout << query1(r) - query2(l - 1) << endl; } } return 0; }
貪婪大陸 樹狀數組