防線-----------------------------------思維(前綴和+二分+套路題)

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
解析:
1.根據題目所述,最多隻有一個位置數量是奇數,那麼說明所有位置上的數量之和也一定是奇數。
因爲奇數+偶數=奇數
2.我們通過二分來確定位置。如果[l,mid]的數量總和是奇數那麼就縮小範圍,反之[mid+1,r]這部分肯定是偶數了。
3.數量總和可以用前綴和表示sum[x]:表示第x個位置之前所有位置上數量之和。
那麼可以O(n)求解出總和。
假設s<=x 那麼它們之間防具的數量=(min(e,x)-s)/d+1;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10000;
int t,n;
struct node
{
	int s,e,d;
}a[N];
ll check(int x)
{
	ll res=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i].s<=x)  res+=(min(a[i].e,x)-a[i].s)/a[i].d+1;
	}
	return res;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		int  l=0,r=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i].s>>a[i].e>>a[i].d;
			r=max(r,a[i].e);
		 } 
		 int ans;
		 while(l<=r)
		 {
		 	int mid=l+r>>1;
		 	if(check(mid)&1) r=mid-1,ans=mid;
		 	else l=mid+1;
		 }
		 ll res=check(ans)-check(ans-1);
		 if(res&1) cout<<ans<<" "<<res<<endl;
		 else cout<<"There's no weakness."<<endl;
	}	
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章