QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#744757 | #9731. Fuzzy Ranking | ucup-team4975 | RE | 1ms | 3868kb | C++14 | 4.3kb | 2024-11-13 23:12:03 | 2024-11-13 23:12:03 |
Judging History
answer
#define LOCAL
#include <bits/stdc++.h>
#define fir first
#define sec second
#define el '\n'
#ifdef LOCAL
#define FINISH cerr << "FINISH" << endl;
#else
#define FINISH ;
#endif
#ifdef LOCAL
#define debug(x) cerr << setw(4) << #x << " == " << x << endl
#else
#define debug(x)
#endif
#ifdef LOCAL
#define debugv(x) \
cerr << setw(4) << #x << ":: "; \
for (auto i : x) \
cerr << i << " "; \
cerr << endl
#else
#define debugv(x)
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
ostream& operator<<(ostream& out, PII& x)
{
out << x.fir << " " << x.sec << endl;
return out;
}
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const int N = 200020;
struct SCC {
int n;
vector<vector<int>> edge;
vector<int> stk;
vector<int> dfn, low, col;
int cur, cnt;
SCC()
{
}
SCC(int n)
{
init(n);
}
void init(int n)
{
this->n = n;
edge.assign(n, {});
dfn.assign(n, -1);
low.resize(n);
col.assign(n, -1);
stk.clear();
cur = cnt = 0;
}
void addEdge(int u, int v)
{
edge[u].push_back(v);
}
void dfs(int x)
{
dfn[x] = low[x] = cur++;
stk.push_back(x);
for (auto y : edge[x]) {
if (dfn[y] == -1) {
dfs(y);
low[x] = min(low[x], low[y]);
}
else if (col[y] == -1) {
low[x] = min(low[x], dfn[y]);
}
}
if (dfn[x] == low[x]) {
int y;
do {
y = stk.back();
col[y] = cnt;
stk.pop_back();
} while (y != x);
cnt++;
}
}
vector<int> work()
{
for (int i = 0; i < n; i++) {
if (dfn[i] == -1) {
dfs(i);
}
}
return col;
}
};
void solve()
{
int n, k, q;
cin >> k >> n >> q;
SCC sol(k + 1);
vector<vector<int>> a(n + 1, vector<int>(k + 1, 0));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
cin >> a[i][j];
if (j >= 2) {
sol.addEdge(a[i][j - 1], a[i][j]);
}
}
}
vector<int> col = sol.work();
/*FINISH;
debugv(col);*/
vector<vector<pair<int, ll>>> ans(n + 1);
vector<PII> r(k + 2);
for (int i = 1; i <= n; i++) {
int st = 1;
for (int j = 1; j <= k; j++) {
r[j].fir = inf;
r[j].sec = 0;
}
for (int j = 1; j <= k; j++) {
r[col[a[i][j]]].fir = min(r[col[a[i][j]]].fir, j);
r[col[a[i][j]]].sec = max(r[col[a[i][j]]].sec, j);
}
r[k + 1].fir = k + 1, r[k + 1].sec = k + 1;
sort(next(r.begin()), r.end());
ans[i].push_back(make_pair(0, 0));
int las = -1;
for (int j = 1; j <= k + 1; j++) {
if (r[j].fir == inf)
break;
if (r[j].sec == 0)
continue;
/*debug(r[j].fir);
debug(r[j].sec);
debug(las);*/
if (r[j].fir > las) {
int nowl = las + 1;
ll lassum = ans[i].back().sec;
int nowr = r[j].fir - 1;
int len = nowr - nowl + 1;
// cout << "! " << nowl << " " << nowr << endl;
if (nowl != 0)
ans[i].push_back(
make_pair(nowl, 1ll * len * (len - 1) / 2 + lassum));
// cout << ans[i].back().fir << " " << ans[i].back().sec << el;
las = nowr;
}
}
ans[i].push_back(make_pair(k + 1, 0));
}
/*for (int i = 1; i <= n; i++) {
debug(i);
for (int j = 0; j < ans[i].size(); j++) {
cout << ans[i][j].fir << " " << ans[i][j].sec << el;
}
}
FINISH*/
ll lasans = 0;
for (int i = 1; i <= q; i++) {
ll id, l, r;
cin >> id >> l >> r;
id = (id + lasans) % n + 1;
l = (l + lasans) % k + 1;
r = (r + lasans) % k + 1;
// cout << l << " " << r << endl;
pair<int, ll> L = make_pair(l, 0);
pair<int, ll> R = make_pair(r, 0);
int idx1 =
upper_bound(ans[id].begin(), ans[id].end(), L) - ans[id].begin();
int idx2 = upper_bound(ans[id].begin(), ans[id].end(), R) -
ans[id].begin() - 1;
// cout << idx1 << " " << idx2 << endl;
if (idx1 == idx2 + 1) {
lasans = 1ll * (r - l + 1) * (r - l) / 2;
}
else {
lasans = (ans[id][idx2].sec - ans[id][idx1].sec);
int len1 = ans[id][idx1].fir - l;
int len2 = r - ans[id][idx2].fir;
lasans = lasans + 1ll * len1 * (len1 - 1) / 2 +
1ll * len2 * (len2 + 1) / 2;
}
cout << lasans << el;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T = 1;
cin >> T;
while (T--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3868kb
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 ...