首页 > 其他分享 >[国家集训队] 矩阵乘法 题解

[国家集训队] 矩阵乘法 题解

时间:2024-05-04 09:44:05浏览次数:31  
标签:const log int 题解 long ++ 国家集训队 乘法

发现实际上就是二维静态区间最大值,可以用整体二分维护。

时间复杂度 \(O((q+n^2)\log \max(a_{i,j})\log n^2)\)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int W=310005;
const int Q=6e4+5;
int n,q,w,ans[Q];
int c[505][505],m;
void add(int x,int y,int k){
    for(;x<=n;x+=x&-x)
        for(int i=y;i<=n;i+=i&-i)
            c[x][i]+=k;
}int sum(int x,int y){
    if(x<1||y<1) return 0;
    int re=0;
    for(;x;x-=x&-x)
        for(int i=y;i;i-=i&-i)
            re+=c[x][i];
    return re;
}struct que{
    int x,y,z,w,e,o,id;
}p[W],p1[W],p2[W];
void dichot(int l,int r,int ql,int qr){
    if(ql>qr) return;
    if(l==r){
        for(int i=ql;i<=qr;i++)
            if(!p[i].o) ans[p[i].id]=l;
        return;
    }int t1=0,t2=0,mid=(l+r)/2;
    for(int i=ql;i<=qr;i++){
        if(p[i].o){
            if(p[i].z<=mid){
                add(p[i].x,p[i].y,1);
                p1[++t1]=p[i];
            }else p2[++t2]=p[i];
            continue;
        }int x=sum(p[i].z,p[i].w);
        int y=sum(p[i].z,p[i].y-1);
        int z=sum(p[i].x-1,p[i].w);
        int a=sum(p[i].x-1,p[i].y-1);
        int sm=x-y-z+a;
        if(p[i].e>sm){
            p[i].e-=sm;
            p2[++t2]=p[i];
        }else p1[++t1]=p[i];
    }for(int i=1;i<=t1;i++)
        if(p1[i].o) add(p1[i].x,p1[i].y,-1);
    for(int i=1;i<=t1;i++) p[i+ql-1]=p1[i];
    for(int i=1;i<=t2;i++) p[i+ql+t1-1]=p2[i];
    dichot(l,mid,ql,t1+ql-1);
    dichot(mid+1,r,t1+ql,qr);
}int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>p[++w].z,p[w].x=i,p[w].y=j,p[w].o=1;
    for(int i=1;i<=w;i++) m=max(m,p[i].z);
    for(int i=1;i<=q;i++)
        p[++w].id=i,cin>>p[w].x>>p[w].y>>p[w].z>>p[w].w>>p[w].e;
    dichot(0,m+1,1,w);
    for(int i=1;i<=q;i++)
        cout<<ans[i]<<"\n";
    return 0;
}//Kaká

标签:const,log,int,题解,long,++,国家集训队,乘法
From: https://www.cnblogs.com/chang-an-22-lyh/p/18171999/guoji-juzhenchengfa_tj

相关文章

  • 题解【[ABC147F] Sum Difference】
    题目链接下为口胡题解:入手方向推导:直接考虑题目所给式子显然困难:\[w(S)=\sum_{i\inS}A_i-\sum_{i\notinS}A_i\]因为两个式子虽然相关但是都在变化,不妨转化为:\[w(S)=2\times\sum_{i\inS}A_i-\sum_{i=1}^nA_i\]这样只用求出有多少个不同的\(\sum_{i\inS}A_i\)。由于......
  • CF1968E.Cells Arrangement-构造(给个和题解不同的做法)
    link:https://codeforces.com/problemset/problem/1968/E题意:需要构造一个\(n\timesn\)的棋盘,在上面放\(n\)枚棋子,设集合\(\mathcal{H}\)表示两两之间曼哈顿距离构成的集合,要让\(|\mathcal{H}|\)最大。给出放棋子的方案。首先说说题解的做法…考虑把距离为奇数和偶数的......
  • 题解:CF1926G
    题目传送门思路发现权值为C的点可以选择看做是权值为S或为P的点,所以问题转换为怎么给C点赋值可以使答案最小,考虑树形dp。\(f_{i,0/i,1}\)表示\(i\)点赋值为S或P时最少要删除几条边。但如果当前点权值不为C的话,那显然他的父亲节点应该选择和他权值相同的点才......
  • 题解:AT_abc298_h [ABC298Ex] Sum of Min of Length
    分析模拟赛签到题。考虑分讨。分两种情况:\(L=R\)。\(L\neR\)。对于第\(1\)种情况,用换根DP求一个\(i\)为根时所有点的深度和就行。对于第\(2\)种情况,钦定$dep_R\gedep_L$。很显然,\(R\)为根的子树中所有点都是离\(R\)更近。假设在\(L\)到\(R\)的路径......
  • 题解【[ABC077D] Small Multiple】
    题目链接题意简述:给定正整数\(K\),求数位之和最小的\(K\)的倍数的数位和。错误方向:\(K\)的倍数一定满足\(K\timesS\),根据\(K\)的特征构造出合适的\(S\)。正确方向考虑直接构造出K的倍数,由于从1开始可以通过×10和+1构造出所有数字,并且在此......
  • 【题解】P4711 「化学」相对分子质量
    Problem给定一个长度为\(L\)的化学式,求出此化学式的相对分子质量。例:十二水合硫酸铝钾(明矾)\(KAl(SO_4)_2\cdot12H_2O\).输入格式形为:KAl(SO_{4})_{2}~12H_{2}OSolve清新小模拟。定义一下“结账”这个概念,分为三种:原子结账,即为当单独的一个(一坨)原子计算完成后,计入所属......
  • [题解]ABC337E Bad Juice
    ABC337EBadJuice一开始的想法如下:就是利用二分法,对于一个区间\([l,r]\),分成\([l,mid-1],[mid,r-1]\)两部分,各找两个朋友喝,右边还空出一个\(r\),如果前面两个朋友都没中毒,那说明\(r\)这瓶有毒。但仔细一想,我们发现\([1,n)\)的瓶子中任意一个我们分出的区间\([l,r]\),都用去了\(......
  • 题解:CF607E Cross Sum
    Problem给定\(N\)条不平行的直线\(y=\frac{k_i}{1000}x+\frac{b_i}{1000}\),\(N\)条直线总共会有\(\frac{N(N-1)}{2}\)个交点(包含在同一个位置的点,即相同位置算不同的点),找出距离原点前\(K\)近的交点的距离和。$2\leN\le5\times10^4$,\(1\leK\le\frac{N(N-1)}{2}\)......
  • P6123 [NEERC2016] Hard Refactoring 题解
    本题说白了,就是一道big模拟!!!题意不再赘述,我们直接看思路。这里作者借鉴了某差分思想:末尾加空格,用于判断最后一个条件;若只有\(\le\),对给出的数字和数组第一个进行标记。标记的时候要+32769,因为数组中不存在负数下标,以免越界;若只有\(\ge\),就标记给出的数字和数组最后......
  • 5.2考试题解
    T1[NOIP2017提高组]时间复杂度大模拟……#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intt,n,k,as,nw,tr,ed[105];intc[26],str[105],b[105];stringtim;stack<int>st;structAadd{strings,t,fr,ed;}ad[105];intdfs(intx){i......