QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#834204#9731. Fuzzy Rankingremain11#WA 15ms8008kbC++202.8kb2024-12-27 13:36:522024-12-27 13:36:52

Judging History

This is the latest submission verdict.

  • [2024-12-27 13:36:52]
  • Judged
  • Verdict: WA
  • Time: 15ms
  • Memory: 8008kb
  • [2024-12-27 13:36:52]
  • Submitted

answer

#include<bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = double;
using ull = unsigned long long;

int N,K,Q;
vector<int>Map[200001];
struct edge
{
    int Next,To;
}Edge[200001];
int Head[200001],Lon;
int Low[200001],Dfn[200001],Time;
int Stack[200001],Top;
int Vis[200001];
int Color[200001];
vector<ll>Div,Pre;
void Clear()
{
    Time=Lon=0;
    for(int i=1;i<=N;++i)
    {
        Head[i]=Low[i]=Dfn[i]=Color[i]=0;
    }
}
void Make(int From,int To)
{
    Edge[++Lon].Next=Head[From];
    Edge[Lon].To=To;
    Head[From]=Lon;
}
void Tarjan(int Pos)
{
    Dfn[Pos]=Low[Pos]=++Time;
    Stack[++Top]=Pos;
    Vis[Pos]=1;
    for(int i=Head[Pos];i;i=Edge[i].Next)
    {
        int To=Edge[i].To;
        if(!Dfn[To])
        {
            Tarjan(To);
            Low[Pos]=min(Low[Pos],Low[To]);
        }
        else if(Vis[To])
        Low[Pos]=min(Low[To],Low[Pos]);
    }
    if(Dfn[Pos]==Low[Pos])
    {
        for(int i=Stack[Top--];i;i=Stack[Top--])
        {
            Color[i]=Pos;
            Vis[i]=0;
            if(i==Pos)break;
        }
    }
}
void solve() {
    scanf("%d%d%d",&N,&K,&Q);
    for(int i=1;i<=K;++i)
    {
        Map[i].clear();
        Map[i].push_back(0);
        for(int j=1;j<=N;++j)
        {
            int X;
            scanf("%d",&X);
            Map[i].push_back(X);
        }
        for(int j=1;j<N;++j)
        Make(Map[i][j],Map[i][j+1]);
    }
    for(int i=1;i<=N;++i)
    if(!Dfn[i])Tarjan(i);
    Pre.clear();
    Div.clear();
    Pre.push_back(0);
    Div.push_back(0);
    int Bef;
    ll Length;
    for(int j=1;j<=N;++j)
    {
        if(Color[Map[1][j]]!=Color[Map[1][j-1]])
        {
            Bef=Pre.size();
            Length=(j-Div[Bef-1]);
            Pre.push_back(Pre[Bef-1]+(Length*(Length-1)>>1));
            Div.push_back(j);
        }
    }
    Bef=Pre.size();
    Length=(N+1-Div[Bef-1]);
    Pre.push_back(Pre[Bef-1]+(Length*(Length-1)>>1));
    Div.push_back(N+1);
    ll Last=0;
    while(Q--)
    {
        ll Id,L,R;
        scanf("%lld%lld%lld",&Id,&L,&R);
        Id=(Id+Last)%K+1;
        L=(L+Last)%N+1,R=(R+Last)%N+1;
        if(Color[L]==Color[R])
        {
            Length=R-L+1;
            Last=Length*(Length-1)>>1;
        }
        else
        {
            int Left=upper_bound(Div.begin(),Div.end(),L)-Div.begin();
            int Right=upper_bound(Div.begin(),Div.end(),R)-Div.begin();
            Last=Pre[Right-2]-Pre[Left-1];
            Length=Div[Left]-L;
            Last+=Length*(Length-1)>>1;
            Length=R-Div[Right-1]+1;
            Last+=Length*(Length-1)>>1;
        }
        printf("%lld\n",Last);
    }
}

int main(void){
	int T;
    scanf("%d",&T);
    while (T--) 
    {
        Clear();
        solve();
    }
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 8008kb

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
Wrong Answer
time: 15ms
memory: 7884kb

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:

2
-3
0
0
3
1
1
2
2
4
3
2
10
0
5
3
3
1
0
0
1
6
28
0
0
10
10
6
6
15
0
3
15
15
18
3
-2
10583
18
1
4
-4
10584
1
5
-1
-4
10733
5
1
1
3
3
4
0
4
1
0
-1
0
0
0
1
2
0
0
0
2
0
1
4
0
0
3
0
-4
0
4
4
4
3
6
16
16
0
11
16
1
4
21
2
5
2
1
2
-3
3
2
2
6
0
0
0
0
0
0
0
0
0
0
1
3
0
28
3
0
6
3
1
1
0
0
0
0
0
0
0
0
0
0
0
4
0...

result:

wrong answer 1st lines differ - expected: '1', found: '2'