题目描述
香蕉大陆有三个强大的国家,分别是A国、B国、C国,三国之间互相为交战状态,其中更是有n个兵家必争之地。这n个地点从西向东排成一线,在第i个地点中三个国家分别派遣的兵力为ai、bi和ci。如果在第i个地点,有某个国家的兵力同时大于其他两个国家,它就可以占领该地点。
可多作为杰出的战略家,总能准确的预测出下场战争的交战区域[L,R],表示下次战场会由西向东从第L个地点覆盖到第R个地点。而第L个地点到第R个地点范围内,占领的地点数量最多的国家,会成为本场战争的战胜国。如果有两个或以上国家占领的地点数量都是最多的,则本场战争的结果为平局。
现在可多一共会预测m场战争,请你帮他求出每场战争的结果。
输入描述
输入共n+m+1行;第1行,输入两个正整数n和m,表示地点的数量以及可多预测的战争数量;
接下来的n行,每行包含三个正整数ai、bi和ci,分别表示第i个地点中三个国家派遣的兵力;
接下来的m行,每行包含两个正整数L和R,表示第i场战争的交战区域从第L个地点到第R个地点。
输出描述
输出m行;每行包含一个字符,对于第i场战争,如果A国获胜则输出'A',B国获胜则输出'B',C国获胜则输出'C',其他情况输出'D'。
样例1
输入
6 4 1 6 0 2 5 0 3 4 7 4 3 7 5 2 0 6 1 0 1 6 1 3 5 6 2 5
输出
D B A C
提示
【提示】
对于第一场战争(从1到6),A国占领5、6号地点,B国占领1、2号地点,C国占领3、4号地点,三个国家各自占领两个地点,所以最终结果为平局。
对于第二场战争(从1到3),A国没有占领地点,B国占领1、2号地点,C国占领3号地点,所以最终结果为B获胜。
对于第三场战争(从5到6),A国占领5、6号地点,B国没有占领地点,C国没有占领地点,所以最终结果为A获胜。
对于第四场战争(从2到5),A国占领5号地点,B国占领2号地点,C国占领3、4号地点,所以最终结果为C获胜。
对于30%的数据,ci = 0;
对于50%的数据,1 <=n,m<= 100, 1 <=ai, bi, ci <= 10^9
对于70%的数据,1 <=n,m<= 1000
对于100%的数据,1 <=n,m<= 10^5, 1 <=L ,R<= n, 1 <=ai,bi,ci<= 10^18,ai、bi和ci互不相等。
#include<iostream>
using namespace std;
const int MaxN = 1e5 + 5;
int n, m;
int a[MaxN], b[MaxN], c[MaxN];
int ta[MaxN], tb[MaxN], tc[MaxN];
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
long long ai, bi, ci;
cin >> ai >> bi >> ci;
if(ai > bi && ai > ci)
{
a[i] = 1;
}
if(bi > ai && bi > ci)
{
b[i] = 1;
}
if(ci > ai && ci > bi)
{
c[i] = 1;
}
//统计前i个地点A国共占领几个地点
ta[i] = ta[i-1] + a[i];
//统计前i个地点B国共占领几个地点
tb[i] = tb[i-1] + b[i];
//统计前i个地点C国共占领几个地点
tc[i] = tc[i-1] + c[i];
}
for(int i = 1; i <= m; i++)
{
//利用前缀和数组获得三个国家在区间[L,R]的领地数量
//根据区间[L,R]的领地数量进行判断,
//如果A国获胜则输出'A',B国获胜输出'B',C国获胜输出'C',其他情况则输出'D'
int L, R;
cin >> L >> R;
int win_a = ta[R] - ta[L-1];
int win_b = tb[R] - tb[L-1];
int win_c = tc[R] - tc[L-1];
if(win_a > win_b && win_a > win_c) cout << "A" << endl;
else if(win_b > win_a && win_b > win_c) cout << "B" << endl;
else if(win_c > win_a && win_c > win_b) cout << "C" << endl;
else cout << "D" << endl;
}
return 0;
}