UVALive 6911 Double Swords 树状数组

时间:2020-12-23 11:43:48

Double Swords

题目连接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4923

Description

Last night, Kingdom of Light was attacked by Kingdom of Dark! The queen of Kingdom of Light,

Queen Ar, was captured and locked inside a dark and creepy castle. The king of Kingdom of Light,

King Ash, wants to save the queen.

The castle is guarded by N dragons, conveniently numbered from 1 to N. To save Queen Ar, King

Ash must kill all the dragons. The kingdom’s oracle said that in order to kill the i-th dragon, King Ash

has to slay it with exactly two swords, one in each hand: one sword of length Ai units, and another

sword of length between Bi and Ci

, inclusive. King Ash can carry unlimited number of swords, and

each sword can be used multiple times.

The number of blacksmiths in the kingdom is limited, so it is important to make as few swords as

possible. Besides, making swords is expensive and takes much time. Determine the minimum number

of swords the kingdom has to make so that King Ash can save Queen Ar!

Input

The first line of input contains an integer T (T ≤ 20) denoting the number of cases. Each case begins

with an integer N (1 ≤ N ≤ 100, 000) denoting the number of dragons which have to be killed. The next

N lines each contains three integers: Ai

, Bi

, and Ci (1 ≤ Ai ≤ 1, 000, 000; 1 ≤ Bi ≤ Ci ≤ 1, 000, 000)

denoting the swords’ length needed to kill the i-th dragon as described in the above problem statement.

Output

For each case, output ‘Case #X: Y ’, where X is the case number starts from 1 and Y is the minimum

number of swords the kingdom has to make and carry in order to defeat all the dragons and save Queen

Ar.

Explanation for 1st sample case:

The kingdom has to make two swords in order to defeat one dragon.

Explanation for 2nd sample case: All the dragons can be defeated by three swords, for example,

with lengths of: 3, 6, and 15.

• The fist dragon can be defeated by swords of length 3 and 6.

• The second dragon can be defeated by swords of length 6 and 15.

• The third dragon can be defeated by swords of length 3 and 15.

There also exists other combination of three swords

Sample Input

4

1

7 6 8

3

3 5 10

6 11 15

3 13 15

4

1 10 20

3 50 60

2 30 40

4 70 80

2

5 100 200

150 1000 2000

Sample Output

Case #1: 2

Case #2: 3

Case #3: 8

Case #4: 3

Hint

题意

有n条龙,你需要杀掉这n条龙

每一条龙需要至少两把剑来干掉他们,龙需要锋利值为a[i]的剑,和能力值在b[i],c[i]之间的一把剑。

问你最少需要多少剑,就可以把所有龙干掉了。

题解:

首先对于每个a[i]我都准备一把剑,然后把区间按照右端点排序,如果这个区间有一把剑,如果这把剑就是a[i]那把,那么你再插一把剑插到右端点。

如果没有剑,你就插一把到右端点,否则这条龙就不需要额外的剑了。

用树状数组维护一下,扫一遍就行了。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
int cas = 0;
int a[maxn],b[maxn],c[maxn];
int d[maxn];
int lowbit(int x){
return x&(-x);
}
void update(int x,int v){
for(int i=x;i<maxn;i+=lowbit(i))
d[i]+=v;
}
int get(int x){
int ans = 0;
for(int i=x;i;i-=lowbit(i))
ans+=d[i];
return ans;
}
void solve(){
memset(d,0,sizeof(d));
int n;scanf("%d",&n);
vector<pair<pair<int,int>,int> >V;
int ans = 0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
a[i]++,b[i]++,c[i]++;
if(get(a[i])-get(a[i]-1)==0)
update(a[i],1);
V.push_back(make_pair(make_pair(c[i],b[i]),a[i]));
}
sort(V.begin(),V.end());
for(int i=0;i<V.size();i++){
int tmp = get(V[i].first.first)-get(V[i].first.second-1);
if(tmp==0)
update(V[i].first.first,1);
else if(tmp==1&&V[i].first.first>=V[i].second&&V[i].first.second<=V[i].second)
update(V[i].first.first,1);
}
printf("Case #%d: %d\n",++cas,get(maxn-1));
}
int main(){
//freopen("1.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}