QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#866142#9731. Fuzzy Rankingucup-team3646#RE 0ms3712kbC++202.6kb2025-01-22 12:53:222025-01-22 12:53:22

Judging History

This is the latest submission verdict.

  • [2025-01-22 12:53:22]
  • Judged
  • Verdict: RE
  • Time: 0ms
  • Memory: 3712kb
  • [2025-01-22 12:53:22]
  • Submitted

answer

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

using ll = long long;
#define rep(i, n) for(ll i = 0; i < (n); ++i)
#define rep2(i, l, r) for(ll i = (l); i < (r); ++i)

using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;

#define all(A) A.begin(), A.end()
#define elif else if
using pii = pair<ll, ll>;

bool chmin(auto &a, auto b) {return a > b ? a = b, 1 : 0;}
bool chmax(auto &a, auto b) {return a < b ? a = b, 1 : 0;}

struct IOS {
  IOS() {
    cin.tie(0);
    ios::sync_with_stdio(0);
  }
} iosetup;


template<class T>
void print(vector<T> a) {
  for(auto x : a) cout << x << ' ';
  cout << endl;
}

void print(auto x) {
  cout << x << endl;
}

template<class Head, class... Tail>
void print(Head &&head, Tail &&...tail) {
  cout << head << ' ';
  print(forward<Tail>(tail)...);
}


struct SCC {
  int n;
  vi cmp, order, use;
  vvi g, rg, group;

  SCC(int n, vector<pair<int, int>> edge) :
    n(n), g(n), rg(n), cmp(n, -1), use(n) {
      for(auto [from, to] : edge) {
        g[from].push_back(to);
        rg[to].push_back(from);
      }
      rep(i, n) dfs(i);
      int c = 0;
      rep(i, n) c += rdfs(order[n-1-i], c);
      group.resize(c);
      rep(i, n) group[cmp[i]].push_back(i);
    }
  
  void dfs(int v) {
    if(use[v]) return;
    use[v] = 1;
    for(auto to : g[v]) dfs(to);
    order.push_back(v);
  }
  int rdfs(int v, int c) {
    if(cmp[v] != -1) return 0;
    cmp[v] = c;
    for(auto to : rg[v]) rdfs(to, c);
    return 1;
  }
};

void solve(){
  int N,K,Q;
  cin>>N>>K>>Q;
  vector<vector<int>> P(K,vector<int> (N));
  vector<pair<int,int>> edge;
  rep(i,K){
    rep(j,N){
      cin>>P[i][j];
      P[i][j]--;
      if(j!=0){
        edge.push_back({P[i][j-1],P[i][j]});
      }
    }
  }
  SCC S(N,edge);
  auto VV=S.group;
  vector<int> U(N,0);
  ll VN=VV.size();
  vector<ll> GS(VN+1,0);
  vector<ll> GS2(VN+1,0);
  rep(i,VN){
    for(int v:VV[i])U[v]=i;
    ll vn=VV[i].size();
    GS[i+1]=vn+GS[i];
    GS2[i+1]=vn*(vn-1)/2+GS2[i];
  }
  int v=0;
  rep(q,Q){
    int id,l,r;
    cin>>id>>l>>r;
    id=(id+v)%K;
    l=(l+v)%N;
    r=(r+v)%N;
    // cout<<id<<" "<<l<<" "<<r<<endl;
    ll an=0;
    if(U[l]==U[r]){
      ll len=r-l+1;
      an=len*(len-1)/2;
    }
    else{
      if(U[l]+1<U[r]){
        an+=GS2[U[r]]-GS2[U[l+1]];
      }
      ll L=GS[U[l]+1]-l;
      ll R=r-GS[U[r]]+1;
      an+=L*(L-1)/2+R*(R-1)/2;
    }


    cout<<an<<"\n";
    v=an;
  }

}

int main(){
  int T;
  cin>>T;
  while(T--)solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3712kb

input:

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

output:

3
10
1
1
2

result:

ok 5 lines

Test #2:

score: -100
Runtime Error

input:

2000
10 10 10
4 5 3 6 8 9 2 1 7 10
4 5 6 3 8 9 1 2 10 7
5 4 3 6 8 9 1 2 7 10
4 5 6 3 8 9 1 2 7 10
4 5 3 6 8 9 2 1 10 7
4 5 6 3 8 9 1 2 10 7
5 4 6 3 8 9 1 2 7 10
5 4 6 3 8 9 1 2 10 7
4 5 6 3 8 9 2 1 7 10
5 4 3 6 8 9 2 1 10 7
3 1 6
5 7 8
0 2 3
7 9 9
2 1 9
6 1 6
7 2 3
0 0 4
1 8 1
1 8 7
10 10 10
9 10 5 ...

output:

22
15
9
0
22
9
21
27
6
0
11
31
10
7
18
3
46
1
4
11
1
6
28
0
0
10
10
6
6
15
0
3
15
15
72
42
7
1
6
25
5
51
16
1
16
7
20
6
21
31
11
18
7
20
0
36
18
17
18
3
0
6
1
43
16
18
1
43
16
3
2
37
0
3
7
9
0
51
15
42
3
6
16
16
0
11
16
1
4
21
7
23
20
20
1
16
16
19
42
49
57
4
3
39
46
29
29
6
3
49
1
16
0
28
3
0
25
18...

result: