三国演义

题目描述

香蕉大陆有三个强大的国家,分别是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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值