QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#770690 | #9731. Fuzzy Ranking | tjf4 | RE | 2ms | 7684kb | C++20 | 3.6kb | 2024-11-21 23:25:02 | 2024-11-21 23:25:02 |
Judging History
answer
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pii;
typedef vector<pii> vii;
typedef vector<ll> vi;
typedef vector<string> vs;
typedef vector<char> vc;
const int inf=0x3f;
const int N=2e5+10;
ll n,m,k,bk,nx[505],mi[505],f[505][505],idk[N],g[505][505],ls[505],rs[505];
vi e[N],h[N],fk[505][505],gk[505][505];
void init() {
bk=sqrt(n);
for(int i=1;i<=n;i++) idk[i]=(i-1)/bk+1;
for(int i=1;i<=n;i++) rs[idk[i]]=i;
for(int i=n;i>=1;i--) ls[idk[i]]=i;
for(int i=1;i<=k;i++) {
for(int j=1;j<=idk[n];j++) {
fk[i][j].clear();
gk[i][j].clear();
g[i][j]=0;
}
}
for(int i=1;i<=k;i++) {
for(int j=1;j<=n;j++) {
fk[i][idk[j]].push_back(h[i][j-1]);
g[i][idk[j]]+=(j-h[i][j-1]);
}
for(int j=1;j<=idk[n];j++) {
sort(fk[i][j].begin(),fk[i][j].end());
for(auto v:fk[i][j]) {
ll w=v;
if(!gk[i][j].empty()) w+=gk[i][j].back();
gk[i][j].push_back(w);
}
}
}
}
ll qry(ll id,ll l,ll r) {
ll ans=0;
for(int i=idk[l]+1;i<=idk[r]-1;i++) {
ans+=g[id][i];
auto it=lower_bound(fk[id][i].begin(),fk[id][i].end(),l)-fk[id][i].begin();
if(it==0) continue;
ans-=(it*l-gk[id][i][it-1]);
}
if(idk[l]==idk[r]) {
for(int i=l+1;i<=r;i++) {
ll lf=h[id][i-1];
if(lf<l) ans+=(i-l);
else ans+=(i-lf);
}
}
else {
for(int i=l+1;i<=rs[idk[l]];i++) {
ll lf=h[id][i-1];
if(lf<l) ans+=(i-l);
else ans+=(i-lf);
}
for(int i=ls[idk[r]];i<=r;i++) {
ll lf=h[id][i-1];
if(lf<l) ans+=(i-l);
else ans+=(i-lf);
}
}
return ans;
}
int main() {
IOS
int T;
cin>>T;
while(T--) {
cin>>n>>k>>m;
vector<vi> mp(k+5,vi(n+5,0));
for(int i=0;i<=k+1;i++) {
e[i].clear();
h[i].clear();
}
for(int i=1;i<=k;i++) {
for(int j=1;j<=n;j++) {
ll x; cin>>x;
e[i].push_back(x);
mp[i][x]=j;
}
}
if(k<n) {
for(int i=1;i<=k;i++) {
for(int j=1;j<=k;j++) nx[j]=mi[j]=n+1;
for(int j=n;j>=1;j--) {
ll x=e[i][j-1],as=j;
for(int r=1;r<=k;r++) {
while(nx[r]>mp[r][x]) {
--nx[r];
ll now_r=e[r][nx[r]-1];
mi[r]=min(mi[r],mp[i][now_r]);
}
as=min(as,mi[r]);
}
h[i].push_back(as);
}
reverse(h[i].begin(),h[i].end());
}
init();
ll mask=0;
while(m--) {
ll id,l,r;
cin>>id>>l>>r;
id=(id+mask)%k+1;
l=(l+mask)%n+1;
r=(r+mask)%n+1;
ll ans=qry(id,l,r);
cout<<ans<<'\n';
mask=ans;
}
}
else {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
f[i][j]=0;
}
}
for(int i=1;i<=k;i++) {
for(int j=1;j<=n;j++) {
for(int r=j;r<=n;r++) {
int x=e[i][j-1];
int y=e[i][r-1];
f[x][y]=1;
}
}
}
for(int r=1;r<=n;r++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
f[i][j]|=(f[i][r]&f[r][j]);
}
}
}
for(int i=1;i<=k;i++) {
for(int j=1;j<=n;j++) {
int x=e[i][j-1],as=j;
for(int r=1;r<j;r++) {
int y=e[i][r-1];
if(f[x][y]) {
as=r;
break;
}
}
h[i].push_back(as);
}
reverse(h[i].begin(),h[i].end());
}
ll mask=0;
while(m--) {
ll id,l,r;
cin>>id>>l>>r;
id=(id+mask)%k+1;
l=(l+mask)%n+1;
r=(r+mask)%n+1;
ll ans=0;
for(int i=l+1;i<=r;i++) {
ll lf=h[id][i-1];
if(lf<l) ans+=(i-l);
else ans+=(i-lf);
}
cout<<ans<<'\n';
mask=ans;
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 7684kb
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 ...