QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#21811#2831. Game Theoryhy_zheng_zai_nei_juan#RE 4ms9832kbC++203.4kb2022-03-08 16:02:192022-05-08 04:06:12

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-08 04:06:12]
  • 评测
  • 测评结果:RE
  • 用时:4ms
  • 内存:9832kb
  • [2022-03-08 16:02:19]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<sstream>
#include<cctype>
#include<cmath>
#include<iomanip>
#include<map>
#include<stack>
#include<set>
#include<functional>
#define in(x) x=read()
#define qr read()
#define int ll
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO
{
    #define BUF_SIZE 100000
    bool IOerror=0;
    inline char nc()
	{
        static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
        if (p1==pend){
            p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin);
            if (pend==p1){IOerror=1;return -1;}
        }
        return *p1++;
    }
    inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}
    inline ll read()
	{
        bool sign=0; char ch=nc();ll x=0;
        for (;blank(ch);ch=nc());
        if (IOerror)return 0;
        if (ch=='-')sign=1,ch=nc();
        for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';
        if (sign)x=-x;
        return x;
    }
    #undef BUF_SIZE
};
using namespace fastIO;
#define mod 998244353
#define fi first
#define se second
#define pii pair<int,int>
pii operator + (pii a,pii b){return mp(a.fi+b.fi,a.se+b.se);}
int s[1000010],c1[1000010],c2[1000010],col[1000010];
void pushup(int x){c1[x]=c1[x<<1]+c1[x<<1|1],c2[x]=c2[x<<1]+c2[x<<1|1];}
void build(int l,int r,int x)
{
	col[x]=0;
	if(l==r)
	{
		c1[x]=s[l];
		if(s[l])c2[x]=l;
		else c2[x]=0;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	pushup(x);
	// cout<<l<<" "<<r<<":"<<c1[x]<<','<<c2[x]<<'\n';
}
int sum(int l,int r){return (l+r)*(r-l+1)/2;}
void pushdown(int x,int nl,int nr)
{
	if(col[x])
	{
		int mid=(nl+nr)/2;
		c1[x<<1]=mid-nl+1-c1[x<<1];
		c1[x<<1|1]=nr-mid-c1[x<<1|1];
		c2[x<<1]=sum(nl,mid)-c2[x<<1];
		c2[x<<1|1]=sum(mid+1,nr)-c2[x<<1|1];
		col[x<<1]^=1,col[x<<1|1]^=1;
		col[x]=0;
	}
}
void modify(int nl,int nr,int l,int r,int x)
{
	if(l<=nl&&nr<=r)
	{
		c1[x]=nr-nl+1-c1[x];
		// cout<<nl<<' '<<nr<<":"<<c2[x]<<'\n';
		c2[x]=sum(nl,nr)-c2[x];
		// cout<<nl<<' '<<nr<<":"<<c2[x]<<'\n';
		col[x]^=1;
		return;
	}
	int mid=(nl+nr)/2;
	pushdown(x,nl,nr);
	if(l<=mid)modify(nl,mid,l,r,x<<1);
	if(r>mid)modify(mid+1,nr,l,r,x<<1|1);
	pushup(x);
}
pii query(int nl,int nr,int l,int r,int x)
{
	if(l>r)return mp(-1,-1);
	if(l<=nl&&nr<=r)return mp(c1[x],c2[x]);
	int mid=(nl+nr)/2;
	pushdown(x,nl,nr);	
	pii ans=mp(0,0);
	if(l<=mid)ans=ans+query(nl,mid,l,r,x<<1);
	if(r>mid)ans=ans+query(mid+1,nr,l,r,x<<1|1);
	return ans;
}
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int n,q;
	while(n=qr,q=qr)
	{
		for(int i=1;i<=n;i++)s[i]=nc()-'0';
		// for(int i=1;i<=n;i++)cout<<s[i]<<' ';cout<<'\n';
		build(1,n,1);
		for(int i=1;i<=q;i++)
		{
			int l=qr,r=qr;
			modify(1,n,l,r,1);
			int pos=c1[1],ans=0;
			pii w=query(1,n,pos,pos,1);
			pii v1=query(1,n,1,pos-1,1),v2=query(1,n,pos+1,n,1);
			// cout<<v1.fi<<' '<<v1.se<<"\t"<<v2.fi<<' '<<v2.se<<'\n';
			if(v1.fi!=-1)
			{
				int x=pos-1-v1.fi,s=sum(1,pos-1)-v1.se;
				ans+=2*x*pos-2*s,ans%=mod;
			}
			if(v2.fi!=-1)
			{
				ans+=2*v2.se-2*v2.fi*pos,ans%=mod;
			}
			ans+=pos,ans%=mod;
			cout<<ans<<'\n';
		}
		n=0,q=0;
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 9832kb

input:

3 2
010
1 2
2 3
5 1
00000
1 5

output:

1
3
5

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 4ms
memory: 9608kb

input:

1 1
0
1 1

output:

1

result:

ok single line: '1'

Test #3:

score: -100
Runtime Error

input:

2 2
01
2 2
2 2
2 2
01
1 2
1 2
1 2
1
1 1
1 1
1 2
1
1 1
1 1
2 2
00
1 2
1 2
2 2
11
1 2
1 2
2 2
01
2 2
1 1
2 2
10
2 2
1 2
2 2
01
1 2
1 2
1 2
0
1 1
1 1
2 2
01
1 2
2 2
1 2
0
1 1
1 1
1 2
1
1 1
1 1
2 2
10
1 2
1 1
1 2
0
1 1
1 1
2 2
01
1 2
1 2
2 2
10
1 2
1 1
1 2
0
1 1
1 1
1 2
0
1 1
1 1
1 2
1
1 1
1 1
2 2
10
1 ...

output:


result: