Double Swords
题目连接:
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;
}