E. Tracking Segments - 二分+前缀和

E. Tracking Segments - 二分+前缀和_第1张图片

 E. Tracking Segments - 二分+前缀和_第2张图片

E. Tracking Segments - 二分+前缀和_第3张图片 

分析:

         记录所有区间和给定的每一次的询问,二分询问的最小满足条件,可以通过前缀和来计算区间内有几个1。

代码:

#include 

#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair pii;

const int N=1e5+10;

int a[N];
pii e[N];
int x[N];
int n,m;

bool check(int mid)
{
	for(int i=1;i<=n;i++) a[i]=0;
	for(int i=1;i<=mid;i++) a[x[i]]=1;
	for(int i=1;i<=n;i++) a[i]+=a[i-1];
	for(int i=1;i<=m;i++)
	{
		int d=e[i].y-e[i].x+1;
		if((a[e[i].y]-a[e[i].x-1])*2>d) return true;
	}
	return false;
}

int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			int l,r;
			cin>>l>>r;
			e[i]={l,r};
		}
		int q;
		cin>>q;
		for(int i=1;i<=q;i++) cin>>x[i];
		int l=1,r=q;
		while(l

你可能感兴趣的:(c++,算法,二分,前缀和)