社区讨论
卡常大合集:见代码
P1527[国家集训队] 矩阵乘法参与者 5已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mj8g6v2h
- 此快照首次捕获于
- 2025/12/16 18:36 2 个月前
- 此快照最后确认于
- 2025/12/19 19:15 2 个月前
不加优化的二维莫队通过本题:
1.register unsigned
2.i(0)
3.inline
4.using namespace std std::
5.fio
6.lower_bound手写二分
7.a<=ba<b+1
8.whilefor
9.++i
CPP#include<iostream>
#include<math.h>
#include<algorithm>
unsigned n,q,bl,a[500][500],rk[250000],l1,r1,l2,r2,num;
unsigned t[250000],c[500],ans[60000],ch[500],kb[250000];
unsigned lb,rb,mid;
unsigned char chh,bit[10],k;
struct mo{
unsigned x1,y1,x2,y2,k,id;
}m[60000];
inline bool cmp(mo m1,mo m2){
if(ch[m1.x1]!=ch[m2.x1])return ch[m1.x1]<ch[m2.x1];
if(ch[m1.y1]!=ch[m2.y1]){
if(ch[m1.x1]&1)return m1.y1<m2.y1;
else return m1.y1>m2.y1;
}if(ch[m1.x2]!=ch[m2.x2]){
if(ch[m1.y1]&1)return m1.x2<m2.x2;
else return m1.x2>m2.x2;
}if(ch[m1.y1]&1)return m1.y2<m2.y2;
return m1.y2>m2.y2;
}inline unsigned fin(){
num=0,chh=getchar_unlocked();
for(;chh<'0'||chh>'9';)chh=getchar_unlocked();
for(;chh<'9'+1&&chh>'0'-1;)num=(num<<3)+(num<<1)+chh-'0',chh=getchar_unlocked();
return num;
}void fout(unsigned x){
k=0;
for(;x!=0;)bit[k]=x%10,k++,x/=10;
for(register int i(k-1);i>-1;--i)putchar_unlocked(bit[i]+'0');
return;
}int main(){
n=fin(),q=fin(),bl=n/pow(q,0.25)/3+1;
for(register unsigned i(0);i<n;++i){
ch[i]=i/bl;
for(register unsigned j(0);j<n;++j)a[i][j]=fin(),rk[i*n+j]=a[i][j],kb[i*n+j]=i;
}std::sort(rk,rk+n*n);
for(register unsigned i(0);i<n;++i){
for(unsigned j(0);j<n;++j){
lb=0,rb=n*n;
while(lb<rb){
mid=(lb+rb)>>1;
if(rk[mid]>=a[i][j])rb=mid;
else lb=mid+1;
}a[i][j]=lb;
}
}for(register unsigned i(0);i<q;++i){
m[i].id=i;
m[i].x1=fin(),m[i].y1=fin(),m[i].x2=fin(),m[i].y2=fin(),m[i].k=fin();
--m[i].x1,--m[i].y1,--m[i].x2,--m[i].y2;
}std::sort(m,m+q,cmp),l1=1,r1=0,l2=1,r2=0;
for(register unsigned i(0);i<q;++i){
for(;l1<m[i].x1;){
for(register unsigned j(l2);j<r2+1;++j)--t[a[l1][j]],--c[kb[a[l1][j]]];
++l1;
}for(;l1>m[i].x1;){
--l1;
for(register unsigned j(l2);j<r2+1;++j)++t[a[l1][j]],++c[kb[a[l1][j]]];
}for(;r1<m[i].x2;){
++r1;
for(register unsigned j(l2);j<r2+1;++j)++t[a[r1][j]],++c[kb[a[r1][j]]];
}for(;r1>m[i].x2;){
for(register unsigned j(l2);j<r2+1;++j)--t[a[r1][j]],--c[kb[a[r1][j]]];
--r1;
}for(;l2<m[i].y1;){
for(register unsigned j=(l1);j<r1+1;++j)--t[a[j][l2]],--c[kb[a[j][l2]]];
++l2;
}for(;l2>m[i].y1;){
--l2;
for(register unsigned j=(l1);j<r1+1;++j)++t[a[j][l2]],++c[kb[a[j][l2]]];
}for(;r2<m[i].y2;){
++r2;
for(register unsigned j=(l1);j<r1+1;++j)++t[a[j][r2]],++c[kb[a[j][r2]]];
}for(;r2>m[i].y2;){
for(register unsigned j=(l1);j<r1+1;++j)--t[a[j][r2]],--c[kb[a[j][r2]]];
--r2;
}for(register unsigned j(0);j<n;++j){
if(m[i].k<c[j]+1){
for(register unsigned l(j*n);l<(j+1)*n;++l){
if(m[i].k<t[l]+1){
ans[m[i].id]=l;
goto cal;
}else m[i].k-=t[l];
}
}else m[i].k-=c[j];
}cal:continue;
}for(register unsigned i(0);i<q;++i)fout(rk[ans[i]]),putchar('\n');
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...