Submission #555679

#TimeUsernameProblemLanguageResultExecution timeMemory
555679600MihneaMisspelling (JOI22_misspelling)C++17
100 / 100
958 ms204428 KiB
#include <bits/stdc++.h>

bool home = 1;

using namespace std;

typedef long long ll;

const int M = (int) 1e9 + 7;

int add(int a, int b) {
  a += b;
  if (a >= M) {
    return a - M;
  }
  if (a < 0) {
    return a + M;
  }
  return a;
}

int mul(int a, int b) {
  return a * (ll) b % M;
}

int pw(int a, int b) {
  int r = 1;
  while (b) {
    if (b & 1) {
      r = mul(r, a);
    }
    a = mul(a, a);
    b /= 2;
  }
  return r;
}

int dv(int a, int b) {
  return mul(a, pw(b, M - 2));
}

void addup(int &a,int b){
  a=add(a,b);
}

void mulup(int &a,int b){
  a=mul(a,b);
}

struct Interval {
  int l;
  int r;
  int what_first;
};

const int N=(int)5e5+7;
int n,m;
int dp[N][30][2];
int transfer[N][30];
Interval dt[N];
int cnt_good;
int vals[N];

void gen(int pos) {
  if(pos>n){
    assert(pos==n+1);
    bool is_ok=1;
    for (int k=1;k<=m;k++){
      int l=dt[k].l,r=dt[k].r;
      int what_is=-1;
      for (int it=l;it<=r;it++){
        if(vals[it]!=vals[it+1]){
          what_is=(vals[it]<vals[it+1]);
          break;
        }
      }
      if(what_is==-1) continue;
      if(what_is!=dt[k].what_first) {
        is_ok=0;
      }
    }
    if(!is_ok) return;
    cout<<++cnt_good<<" : ";
    for (int i=1;i<=n;i++){
      cout<<vals[i]<<" ";
    }
    cout<<"\n";
    return;
  }
  for (int ch=0;ch<26;ch++){
    vals[pos]=ch;
    gen(pos+1);
  }
}

void compute_row(int i){
  if(i>0) {
    for(int x=0;x<30;x++){
      addup(transfer[i][x],transfer[i-1][x]);
    }
  }
  int cur=0;
  for (int x=0;x<27;x++){
    addup(cur,dp[i][x][0]);
    addup(transfer[i][x+1],cur);
  }
  cur=0;
  for(int x=27;x>=1;x--){
    addup(cur,dp[i][x][1]);
    addup(transfer[i][x-1],cur);
  }
}

signed main() {
#ifdef ONLINE_JUDGE
  home = 0;
#endif
  home = 0;

  if (home) {
    freopen("I_am_iron_man", "r", stdin);
  }
  else {
    ios::sync_with_stdio(0); cin.tie(0);
  }
  ios::sync_with_stdio(0); cin.tie(0);

  cin>>n>>m;
  vector<pair<int, int>> in,out;

  for(int i=1;i<=m;i++){
    int l,r;
    cin>>l>>r;
    int what=0;
    if(l>r){
      swap(l,r);
      what=1;
    }
    assert(l<r);
    r--;
    assert(l<=r);
    dt[i]={l, r, what};

    in.push_back({l, i});
    out.push_back({r+1, i});
  }
  sort(in.begin(), in.end());
  sort(out.begin(), out.end());

  assert((int)in.size()==m);
  assert((int)out.size()==m);

  int pin=0;
  int pout=0;

  ///gen(1);
  dp[0][26][1]=1;
  multiset<int> s0, s1;
  compute_row(0);
  for (int i=1;i<=n;i++){
    while(pin<(int)in.size()&&in[pin].first==i){
      int k=in[pin++].second;
      if(dt[k].what_first==0) s0.insert(dt[k].l); else s1.insert(dt[k].l);
    }
    while(pout<(int)out.size()&&out[pout].first==i){
      int k=out[pout++].second;
      if(dt[k].what_first==0) s0.erase(s0.find(dt[k].l)); else s1.erase(s1.find(dt[k].l));
    }
    int m0=0,m1=0;
    if(!s0.empty()){
      auto it=s0.end();
      it--;
      m0=*it;
    }

    if(!s1.empty()){
      auto it=s1.end();
      it--;
      m1=*it;
    }
    for (int x=0;x<26;x++) {
      /// compute dp[i][x][??]
      int start=min(m0,m1)+1;
      int start2=max(m0,m1)+1;
      int finish=max(m0,m1);

      if(start2<=i){
        if(start2-2<0) addup(dp[i][x][0], transfer[i-1][x]), addup(dp[i][x][1],transfer[i-1][x]); else
        addup(dp[i][x][0],add(transfer[i-1][x],-transfer[start2-2][x])),
        addup(dp[i][x][1],add(transfer[i-1][x],-transfer[start2-2][x]));
      }

      if(start<=finish){
        if(start-2<0)
        addup(dp[i][x][m0<m1],transfer[finish-1][x]); else
        addup(dp[i][x][m0<m1],add(transfer[finish-1][x],-transfer[start-2][x]));
      }
    }
    compute_row(i);
  }
  assert(pin==m);
  assert(pout==m);
  int sol=0;
  for (int x=0;x<26;x++){
    addup(sol,dp[n][x][0]);
    ///addup(sol,dp[n][x][1]);
  }
  cout<<sol<<"\n";
}
/**
1 x x
y y 3

x 2 x
y y 3
**/

Compilation message (stderr)

misspelling.cpp: In function 'int main()':
misspelling.cpp:121:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |     freopen("I_am_iron_man", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...