0分求助!!!
查看原帖
0分求助!!!
361266
Andy_Li楼主2024/4/20 21:09

过了#2、#11、#12、#13、#17、#18,求求了,调了1晚上

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <complex.h>
#include <fenv.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <tgmath.h>
#include <forward_list>
#include <unordered_set>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
inline int read()
{
	int x,fuhao=1;
	char ch;
	x=0,ch=getchar();
	while(ch<'0' || ch>'9')
	{
		ch=getchar();
		if(ch=='-')
			fuhao=-1;
	}
	while(ch>='0' && ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*fuhao;
}
inline void print(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9)
		print(x/10);
	putchar(x%10+'0');
	return ;
}
int f[maxn][20],pre0[maxn],pre1[maxn],nxt0[maxn],nxt1[maxn],a[maxn],n,m;
void rmq()
{
	int p=log2(n);
	for(int j=1;j<=p;j++)
		for(int i=1;i<=n;i++)
			if(i+(1<<j)-1<=n)
				f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
	return ;
}
int query(int x,int y)
{
	int k=log2(y-x+1);
	return max(f[x][k],f[y-(1<<k)+1][k]);
}
int main()
{
	cin.tie(0);
	cout.tie(0);
	std::ios::sync_with_stdio(false);
	//srand((unsigned)time(NULL));
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(a[i]==0)
			pre0[i]++;
		if(a[i]==1)
			pre1[i]++;
		pre0[i]+=pre0[i-1];
		pre1[i]+=pre1[i-1];
	}
	nxt0[n+1]=n+1;
	for(int i=n;i>=1;i--)
		if(a[i]==0)
			nxt0[i]=i;
		else
			nxt0[i]=nxt0[i+1];
	nxt1[n+1]=n+1;
	for(int i=n;i>=1;i--)
		if(a[i]==1)
			nxt1[i]=i;
		else
			nxt1[i]=nxt1[i+1];
	for(int i=1;i<=n;i++)
		f[i][0]=pre0[i]-pre1[i];
	rmq();
	while(m--)
	{
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1)
			cout<<query(l,r)+pre1[r]-pre0[l-1]<<"\n";
		else
			if(nxt1[nxt0[l]]<=r)
				cout<<"2\n";
			else
				cout<<"1\n";
	}
	return 0;
}

。

2024/4/20 21:09
加载中...