QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#834204 | #9731. Fuzzy Ranking | remain11# | WA | 15ms | 8008kb | C++20 | 2.8kb | 2024-12-27 13:36:52 | 2024-12-27 13:36:52 |
Judging History
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'