Editorial for Tách từ


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

uses math;
const fi='';
      maxn=50010;
var n,m,k:longint;
    a:array[1..maxn] of boolean;
    s:array[1..maxn shl 2] of longint;
    f:array[1..maxn shl 2] of longint;

procedure put(node,l,r,x,y:longint;val:byte);
var mid:longint;
begin
     if (l=x) and (r=y) then
     begin
          f[node]:=val;
          if val=2 then s[node]:=r-l+1
          else s[node]:=0;
     end
     else
     begin
          mid:=(l+r) shr 1;
          if f[node]>0 then
          begin
               f[node shl 1]:=f[node];
               f[node shl 1+1]:=f[node];
               if f[node]=2 then
               begin
                    s[node shl 1]:=mid+1-l;
                    s[node shl 1+1]:=r-mid;
               end
               else
               begin
                    s[node shl 1]:=0;
                    s[node shl 1+1]:=0;
               end;
               f[node]:=0;
          end;
          if x<=mid then put(node shl 1,l,mid,x,min(y,mid),val);
          if y>mid then put(node shl 1+1,mid+1,r,max(x,mid+1),y,val);
          s[node]:=s[node shl 1]+s[node shl 1+1];
     end;
end;

procedure init;
var i,x,j:longint;
begin
     read(k,m);
     for i:=1 to k do
     begin
          read(x);
          for j:=n+1 to n+x-1 do a[j]:=true;
          n:=n+x;
     end;
     dec(n);
     for i:=1 to n do put(1,1,n,i,i,ord(not a[i])+1);
     readln;
end;

procedure pr;
var i,x,y:longint; c:char;
begin
     for i:=1 to m do
     begin
          read(c);
          if c='C' then writeln(s[1]+1)
          else
          begin
               read(x,y);
               if c='J' then put(1,1,n,x,y-1,1)
               else put(1,1,n,x,y-1,2);
          end;
          readln;
     end;
end;

begin
     assign(input,fi); reset(input);
     init;
     pr;
     close(input);
end.

Code mẫu của ladpro98

#include <bits/stdc++.h>
#define endl '\n'
const int N = 50050;
using namespace std;
int it[4 * N], lazy[4 * N], a[N];
int k, q, n;

struct node {
    int l, r, id;
    void diffuse() {
        if (lazy[id] == 2) return;
        it[id] = lazy[id] * (r - l + 1);
        if (l != r) lazy[id + id] = lazy[id + id + 1] = lazy[id];
        lazy[id] = 2;
    }
    node(int _l, int _r, int _id) {l = _l; r = _r; id = _id; diffuse();}
    node left() {return node(l, l + r >> 1, id + id);}
    node right() {return node((l + r >> 1) + 1, r, id + id + 1);}
    void Upd(int i, int j, int v) {
        if (l > r || r < i || j < l) return;
        if (i <= l && r <= j) {lazy[id] = v; diffuse(); return;}
        left().Upd(i, j, v); right().Upd(i, j, v);
        it[id] = it[id + id] + it[id + id + 1];
    }
    int Get(int i, int j) {
        if (l > r || r < i || j < l) return 0;
        if (i <= l && r <= j) return it[id];
        return left().Get(i, j) + right().Get(i, j);
    }
};

int main() {
    ios :: sync_with_stdio(0); 
    cin >> k >> q;
    for(int i = 1; i <= k; i++) 
        {cin >> a[i]; a[i] += a[i - 1];}
    n = a[k] - 1;
    for(int i = 1; i <= 4 * n; i++) lazy[i] = 2; 
    node(1, n, 1).Upd(1, n, 1);
    for(int i = 0; i < k; i++) node(1, n, 1).Upd(a[i] + 1, a[i + 1] - 1, 0);
    char c; int l, r;
    for(int i = 1; i <= q; i++) {
        cin >> c;
        if (c == 'J') {
            cin >> l >> r;
            node(1, n, 1).Upd(l, r - 1, 0);
        } else 
        if (c == 'D') {
            cin >> l >> r;
            node(1, n, 1).Upd(l, r - 1, 1);
        }
        else
            cout << it[1] + 1 << endl;
    }
    return 0;
}

Code mẫu của RR

//Wishing myself a happy lunar new year with a lot of accept solutions
//Written by Nguyen Thanh Trung
{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=50001;
  snode=131072;
var
  f1,f2:text;
  n,q,k:longint;
  bufin,bufout:array[1..10000] of byte;
  a:array[1..MAXN] of longint;
  left,right,all:array[1..snode] of longint;
  sl:array[1..snode] of longint;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
  setTextBuf(f1,bufin);
  setTextBuf(f2,bufout);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure inp;
var
  i:longint;
begin
  readln(f1,k,q);
  for i:=1 to k do read(f1,a[i]);
  readln(f1);
end;
procedure build(i,l,r:longint);
var
  mid:longint;
begin
  if l=r then
    begin
      sl[i]:=1;
      exit;
    end;
  mid:=(l+r)>>1;
  build(i<<1,l,mid);
  build(i<<1+1,mid+1,r);
  sl[i]:=r-l+1;
end;
procedure join(u,v:longint);
  procedure visit(i,l,r:longint);
  var
    mid:longint;
  begin
    if l>r then exit;
    if (v<l) or (r<u) then exit;
    if (u<=l) and (r<=v) then
      begin
        if u<l then left[i]:=1;
        if r<v then right[i]:=1;
        all[i]:=1;
        sl[i]:=1;
        exit;
      end;
    if all[i]=1 then
      begin
        sl[i]:=1;
        if u<l then left[i]:=1;
        if r<v then right[i]:=1;
        exit;
      end;
    mid:=(l+r)>>1;
    if all[i]=0 then
      begin
        all[i<<1]:=0; left[i<<1]:=left[i]; right[i<<1]:=0; sl[i<<1]:=mid-l+1;
        all[i<<1+1]:=0; left[i<<1+1]:=0; right[i<<1+1]:=right[i]; sl[i<<1+1]:=r-mid;
      end;
    visit(i<<1,l,mid);
    visit(i<<1+1,mid+1,r);
    left[i]:=left[i<<1]; right[i]:=right[i<<1+1];
    sl[i]:=sl[i<<1]+sl[i<<1+1];
    if all[i<<1]<>all[i<<1+1] then all[i]:=-1
    else if all[i<<1]=0 then all[i]:=0
    else if (all[i<<1]=1) and (right[i<<1]=1) then all[i]:=1
    else all[i]:=-1;
    if (right[i<<1]=1) and (left[i<<1+1]=1) then dec(sl[i]);
  end;
begin
  visit(1,1,n);
end;
procedure disjoin(u,v:longint);
  procedure visit(i,l,r:longint);
  var
    mid:longint;
  begin
    if l>r then exit;
    if (v<l) or (r<u) then exit;
    if (u<=l) and (r<=v) then
      begin
        if u<l then left[i]:=0;
        if r<v then right[i]:=0;
        all[i]:=0;
        sl[i]:=r-l+1;
        exit;
      end;
    if all[i]=0 then
      begin
        if u<l then left[i]:=0;
        if r<v then right[i]:=0;
        exit;
      end;
    mid:=(l+r)>>1;
    if all[i]=1 then
      begin
        all[i<<1]:=1; left[i<<1]:=left[i]; right[i<<1]:=1; sl[i<<1]:=1;
        all[i<<1+1]:=1; left[i<<1+1]:=1; right[i<<1+1]:=right[i]; sl[i<<1+1]:=1;
      end;
    visit(i<<1,l,mid);
    visit(i<<1+1,mid+1,r);
    left[i]:=left[i<<1]; right[i]:=right[i<<1+1];
    sl[i]:=sl[i<<1]+sl[i<<1+1];
    if all[i<<1]<>all[i<<1+1] then all[i]:=-1
    else if (all[i<<1]=0) and (right[i<<1]=0) then all[i]:=0
    else if (all[i<<1]=1) and (right[i<<1]=1) then all[i]:=1
    else all[i]:=-1;
    if (right[i<<1]=1) and (left[i<<1+1]=1) then dec(sl[i]);
  end;
begin
  visit(1,1,n);
end;
procedure solve;
var
  i,u:longint;
begin
  n:=0; for i:=1 to k do inc(n,a[i]);
  u:=0;
  build(1,1,n);
  for i:=1 to k do
    begin
      join(u+1,u+a[i]);
      u:=u+a[i];
    end;
end;
procedure ans;
var
  ch:char;
  i,u,v:longint;
begin
  for i:=1 to q do
    begin
      read(f1,ch);
      if ch='J' then
        begin
          readln(f1,u,v);
          if u<>v then join(u,v);
        end
      else if ch='D' then
        begin
          readln(f1,u,v);
          if u<>v then disjoin(u,v);
        end
      else if ch='C' then
        begin
          readln(f1);
          writeln(f2,sl[1]);
        end;
    end;
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#pragma comment(linker, "/STACK:16777216")

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.000001
#define maxn 50004
#define oo 1111111111
#define modunlo 111539786
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
#define ull unsigned long long

double const PI=4*atan(1);

using namespace std;

typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;

int test;

int f[maxn * 4] = {0}, n, a[maxn],k , m, run, x, y;
char s[11];

void update(int u, int v, int gt, int i, int l, int r){
    if(v < l || u > r) return;

    if(u <= l && v >= r){
        f[i] = (r - l + 1) * gt;
        return;
    }

    int mid = (r + l) >> 1;
    if(f[i] == 0){
        f[i << 1] = 0;
        f[(i << 1) | 1] = 0;
    }

    if(f[i] == r - l + 1){
        f[i << 1] = mid - l + 1;
        f[(i << 1) | 1] = r - mid;
    }

    update(u, v, gt, i << 1, l, mid);
    update(u, v, gt, (i << 1) | 1, mid + 1, r);
    f[i] = f[i << 1] + f[(i << 1) | 1];

}

int main(){

   // freopen("input.in","r",stdin);
   // freopen("output.out","w",stdout);
    scanf("%d %d",&k,&m);
    n = -1;
    for(int i = 1; i <= k; i++){
        scanf("%d", &a[i]);
        n += a[i];
    }

    run = 1;
    for(int i = 1; i <= k; i++){
        if(a[i] > 1) 
        update(run, run + a[i] - 2, 1, 1, 1, n);
        run += a[i];
    }

    for(int i = 1; i <= m; i++){
        scanf("%s",s);
        if(s[0] == 'C') printf("%d\n", n - f[1] + 1);
        else if(s[0] == 'J'){
            scanf("%d %d",&x,&y);
            update(x, y - 1, 1, 1, 1, n);
        }
        else{
            scanf("%d %d",&x,&y);
            update(x, y - 1, 0, 1, 1, n); 
        }
    }

}

Code mẫu của ll931110

{$MODE DELPHI}
program WS;
const
  input  = '';
  output = '';
  maxn = 50000;
var
  fi,fo: text;
  a: array[1..maxn] of integer;
  stat,res: array[1..8 * maxn] of integer;
  n,m,k: integer;
  u,v: integer;

procedure openfile;
begin
  assign(fi, input);
    reset(fi);

  assign(fo, output);
    rewrite(fo);
end;

procedure init;
var
  i: integer;
begin
  readln(fi, k, m);
  n := 0;
  for i := 1 to k do
    begin
      read(fi, a[i]);
      n := n + a[i];
    end;
  dec(n);
  readln(fi);
end;

procedure update(i,low,high,val: integer);
var
  mid: integer;
begin
  if low >= high then
    begin
      if (low = high) and (u <= low) and (low <= v) then
        begin
          stat[i] := val;
          if val = -1 then res[i] := high - low + 1 else res[i] := 0;
        end;
      exit;
    end;

  if (v < low) or (high < u) then exit;
  if (u <= low) and (high <= v) then
    begin
      stat[i] := val;
      if val = -1 then res[i] := high - low + 1 else res[i] := 0;
      exit;
    end;

  mid := (low + high) div 2;
  if stat[i] <> 0 then
    begin
      if stat[i] = -1 then res[i] := high - low + 1 else res[i] := 0;

      stat[2 * i] := stat[i];
      if stat[i] = -1 then res[2 * i] := mid - low + 1 else res[2 * i] := 0;

      stat[2 * i + 1] := stat[i];
      if stat[i] = -1 then res[2 * i + 1] := high - mid else res[2 * i + 1] := 0;

      stat[i] := 0;
    end;

  update(2 * i,low,mid,val);
  update(2 * i + 1,mid + 1,high,val);
  res[i] := res[2 * i] + res[2 * i + 1];
end;

procedure solve;
var
  i,sum: integer;
  ch: char;
begin
  u := 1;
  v := n;
  update(1,1,n,-1);

  sum := 1;
  for i := 1 to k do
    begin
      u := sum;
      v := sum + a[i] - 2;
      if u <= v then update(1,1,n,1);
      sum := sum + a[i];
    end;

  for i := 1 to m do
    begin
      read(fi, ch);
      if ch = 'C' then
        begin
          readln(fi);
          writeln(fo, res[1] + 1);
        end
      else
        begin
          readln(fi, u, v);
          dec(v);
          if u <= v then
            begin
              if ch = 'J' then update(1,1,n,1) else update(1,1,n,-1);
            end;
        end;
    end;
end;

procedure closefile;
begin
  close(fo);
  close(fi);
end;

begin
  openfile;
  init;
  solve;
  closefile;
end.

Code mẫu của khuc_tuan

#include <cstdio>
using namespace std;

int a[50050 * 4], s[50050 * 4];

void update(int n, int l, int r, int x, int y, int v, int v2) {
    if(x<=l && r<=y) {
        a[n] = v;
        s[n] = v * (r-l+1); 
        return;
    }
    if(a[n]!=-1 && v2==-1) v2 = a[n];
    a[n] = -1;
    int m = (l+r) / 2;
    if(x<=m) update( 2 * n, l, m, x, y, v, v2);
    else if(v2!=-1) {
        a[2*n] = v2;
        s[2*n] = v2 * (m-l+1);
    }

    if(m<y) update( 2 * n + 1, m+1, r, x, y, v, v2);
    else if(v2!=-1) {
        a[2*n+1] = v2;
        s[2*n+1] = v2 * (r-m);
    }
    s[n] = s[2*n] + s[2*n+1];
}

int main() {
    int x, m, n=0;
    scanf("%d%d", &x, &m);
    for(int i=0, st=0;i<x;++i) {
        int l;
        scanf("%d", &l);
        if(l>=2) update( 1, 0, 50000, st, st + l - 2, 1, -1);
        st += l;
        n += l;
    }
    char buff[10];
    for(int i=0;i<m;++i) {
        gets(buff);
        char code;
        scanf("%c", &code);
        if(code=='C') printf("%d\n", n - s[1]);
        else {
            int u, v;
            scanf("%d%d", &u, &v);
            --u; --v;
            if(u<v) {
                if(code=='D') update( 1, 0, 50000, u, v-1, 0, -1);
                else update( 1, 0, 50000, u, v-1, 1, -1);
            }
        }
    }
    return 0;
}

Loading...