Loading

CF2157C Meximum Array 2

限制分开讨论。

首先对于一个位置,如果两个地方的限制都有,那么填 \(k + 1\),因为此时不能填 \(< k\) 的数,也不能填 \(k\),因此填 \(k + 1\)

如果什么限制都没有,那当然是填什么无所谓。

重要的就是只有两个限制的其中一个该怎么办。

如果只有 \(\min\) 的限制,那很好办,直接赋值成 \(k\) 就好了。

如果只有 \(mex\) 的限制,并不好办,因为你不确定你是填上一个数 \(+ 1\) 还是填 \(0\),我们发现此时找到上一个只有 \(mex\) 的位置,如果中间没有连着的限制,那么证明要从头再来,就填 \(0\),否则就填上个数 \(+1\) 的循环位移。

code:

#include <bits/stdc++.h>
 
using namespace std;

#define int long long
#define fir first
#define sec second
#define mkp make_pair 
#define pb push_back
#define lep( i, l, r ) for ( int i = ( l ); i <= ( r ); ++ i )
#define rep( i, r, l ) for ( int i = ( r ); i >= ( l ); -- i )
 
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair < int, int > pii;
 
namespace IO{
	const int SIZE=1<<21;
  static char ibuf[SIZE],obuf[SIZE],*iS,*iT,*oS=obuf,*oT=oS+SIZE-1;
  int qr;
  char qu[55],c;
  bool f;
	#define getchar() (IO::iS==IO::iT?(IO::iT=(IO::iS=IO::ibuf)+fread(IO::ibuf,1,IO::SIZE,stdin),(IO::iS==IO::iT?EOF:*IO::iS++)):*IO::iS++)
	#define putchar(x) *IO::oS++=x,IO::oS==IO::oT?flush():0
	#define flush() fwrite(IO::obuf,1,IO::oS-IO::obuf,stdout),IO::oS=IO::obuf
	#define puts(x) IO::Puts(x)
	template<typename T>
    inline void read(T&x){
    	for(f=1,c=getchar();c<48||c>57;c=getchar())f^=c=='-';
    	for(x=0;c<=57&&c>=48;c=getchar()) x=(x<<1)+(x<<3)+(c&15); 
    	x=f?x:-x;
    }
    template<typename T>
    inline void write(T x){
      if(!x) putchar(48); if(x<0) putchar('-'),x=-x;
      while(x) qu[++qr]=x%10^48,x/=10;
      while(qr) putchar(qu[qr--]);
    }
    inline void Puts(const char*s){
    	for(int i=0;s[i];i++)
			putchar(s[i]);
		putchar('\n');
	}
	struct Flusher_{~Flusher_(){flush();}}io_flusher_;
}
using IO::read;
using IO::write;

template < class type > inline void chkmin ( type &x, type y ) { x = ( x <= y ? x : y ); }
template < class type > inline void chkmax ( type &x, type y ) { x = ( x >= y ? x : y ); }

const int N = 105;

int t, n, k, q;
int a[N], b[N], ans[N];

void Solve () {
  cin >> t;
  while ( t -- ) {
    cin >> n >> k >> q;
    for ( int i = 1; i <= q; i ++ ) {
      int op, l, r;
      cin >> op >> l >> r;
      if ( op == 1 ) {
        for ( int j = l; j <= r; j ++ ) {
          a[j] = 1;
        }
      }
      else {
        for ( int j = l; j <= r; j ++ ) {
          b[j] = 1;
        }
      }
    }
    for ( int i = 1; i <= n; i ++ ) {
      if ( a[i] && b[i] ) {
        ans[i] = k + 1;
      }
      else if ( a[i] ) {
        ans[i] = k;
      }
      else if ( b[i] ) {
        int lst = -1, flag = 1;
        for ( int j = i - 1; j >= 1; j -- ) {
          flag &= b[j];
          if ( !a[j] && b[j] ) {
            lst = j;
            break;
          }
        }
        if ( lst == -1 || flag ) {
          ans[i] = ( ans[lst] + 1 ) % k;
        }
        else {
          ans[i] = 0;
        }
      }
      else {
        ans[i] = 0;
      }
    }
    for ( int i = 1; i <= n; i ++ ) {
      cout << ans[i] << " ";
    }
    cout << '\n';
  }
}

signed main () {
#ifdef judge
  freopen ( "Code.in", "r", stdin );
  freopen ( "Code.out", "w", stdout );
  freopen ( "Code.err", "w", stderr );
#endif
	Solve ();
	return 0;
}
posted @ 2025-11-27 20:44  Alexande  阅读(14)  评论(0)    收藏  举报