列表

详情


NC232534. [NCT058F]萌萌题

描述

n 个同学坐成一个圈,老师交代给他们每个人一个任务 —— 看着自己右边的学生,并且监督他有没有认真看着他右边的学生。

活动结束后,每个学生需要报告自己右边的同学是否认真。

- 如果一个学生是认真的,那么他会如实汇报。
- 如果一个学生是不认真的,那么他自然不知道他右边的同学是否认真,这时候他会随便汇报。

现在给出每个学生的汇报,是一个长度为 n 序列,第 i 位为 0 表示第 i 个学生汇报他右边的学生不认真,反之则为认真。

m 个操作,每个操作形如 :

- ,表示将 中学生的汇报全部修改成
- ,询问有没有可能在学生 p 认真的情况下,不认真的学生人数不大于 k,若有可能则输出 `1`,反之输出 `0`.

数据范围:

输入描述

第一行两个整数 n, m.

第二行一个长度为 n 的  串,表示每个学生的汇报情况。

接下来 m 行,每行若干个数,分别为 m 次操作,格式见题面。

输出描述

一个长度为 1 操作数量的  串表示答案。

示例1

输入:

5 5
10101
1 3 2
0 2 4 1
1 4 3
0 1 3 0
1 2 2

输出:

010

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 1841ms, 内存消耗: 76716K, 提交时间: 2022-03-18 22:12:37

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#if !defined(ONLINE_JUDGE)&&defined(LOCAL)
#include "my_header\debug.h"
#else
#define dbg(...) ;
#define dbgn(...) ;
#endif
inline char gc() {
    static char buf[1048576], *p1, *p2;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1048576, stdin),
    p1 == p2) ? EOF : *p1++;
}
inline int read() {
    char ch = gc(); int r = 0, w = 1;
    for (; ch < '0' || ch > '9'; ch = gc()) if (ch == '-') w = -1;
    for (; '0' <= ch && ch <= '9'; ch = gc()) r = r * 10 + (ch - '0');
    return r * w;
}
typedef unsigned int ui;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int N=1e6+5,M=4e6,inf=1e6+2;
char S[N],T[N*2];
struct Q
{
	int a00,a01,a10,a11;
	Q operator*(const Q &o) const
	{
		return {
			min(a00+o.a00,a01+o.a10),
			min(a00+o.a01,a01+o.a11),
			min(a10+o.a00,a11+o.a10),
			min(a10+o.a01,a11+o.a11)
		};
	}
};
Q ans,s[M];
const Q b[2]={{1,0,1,inf},{1,0,inf,0}};
Q bs[2][N];
int lz[M];
void build(int x,int l,int r)
{
	lz[x]=-1;
	if (l==r)
	{
		s[x]=b[S[l]];
		return;
	}
	int c=x*2,m=l+r>>1;
	build(c,l,m);build(c+1,m+1,r);
	s[x]=s[c]*s[c+1];
}
int z,y,dt;
void mdf(int x,int l,int r)
{
	if (z<=l&&r<=y) {lz[x]=dt;s[x]=bs[dt][r-l+1];return;}
	int c=x*2,m=l+r>>1;
	if (~lz[x])
	{
		lz[c]=lz[c+1]=lz[x];
		s[c]=bs[lz[x]][m-l+1];
		s[c+1]=bs[lz[x]][r-m];
		lz[x]=-1;
	}
	if (z<=m) mdf(c,l,m);
	if (y>m) mdf(c+1,m+1,r);
	s[x]=s[c]*s[c+1];
}
int fir;
void ask(int x,int l,int r)
{
	if (z<=l&&r<=y)
	{
		if (!fir) ans=ans*s[x]; else ans=s[x],fir=0;
		return;
	}
	int c=x*2,m=l+r>>1;
	if (~lz[x])
	{
		lz[c]=lz[c+1]=lz[x];
		s[c]=bs[lz[x]][m-l+1];
		s[c+1]=bs[lz[x]][r-m];
		lz[x]=-1;
	}
	if (z<=m) ask(c,l,m);
	if (y>m) ask(c+1,m+1,r);
}
int main()
{
	int n,m,i,j;
	n=read();m=read();
    for (i=1;i<=n;i++)
    {
        S[i]=gc();
        while (S[i]<'0'||S[i]>'1') S[i]=gc();
        S[i]-='0';
    }
	build(1,1,n);
	for (i=0;i<=1;i++)
	{
		bs[i][1]=b[i];
		for (j=2;j<=n;j++) bs[i][j]=bs[i][j-1]*b[i];
	}
	int ii=0;
	while (m--)
	{
		int op,l,r;
        op=read();l=read();r=read();
		if (!op)
		{
			z=l;y=r;dt=read();
			mdf(1,1,n);
		}
		else
		{
			fir=1;
			z=l;y=n;
			ask(1,1,n);
			z=1;y=l-1;
			if (y) ask(1,1,n);
			++ii;
			T[ii]='0'+(ans.a11<=r);
		}
	}
	cout<<T+1<<endl;
}

上一题