首页 > 其他分享 >牛客多校第二场-H

牛客多校第二场-H

时间:2023-07-23 21:48:51浏览次数:39  
标签:第二场 mat sz int res ++ 多校 牛客 now

H-0 and 1 in BIT

 op1-->-x-1

op2-->x+1

由线性代数知识推每次操作要乘的矩阵,线段树维护一个矩阵信息

 [op,d,1] 就是代表一个f(x)=kx+b的方程,根据线性代数知识用矩阵表示该方程 -> f(x)=op*x+d , 最后一个1只是凑矩阵用的 ,f代表该矩阵,因为刚开始就是x,所以op=1,d=0

 

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long ll;

const int sz=3;
const int N=2e5+5;

string s;

struct mat {
  ll m[sz][sz];
  mat() { memset(m, 0, sizeof m); }
  mat operator-(const mat& T) const {
    mat res;
    for (int i = 0; i < sz; ++i)
      for (int j = 0; j < sz; ++j) {
        res.m[i][j] = (m[i][j] - T.m[i][j]);
      }
    return res;
  }
  mat operator+(const mat& T) const {
    mat res;
    for (int i = 0; i < sz; ++i)
      for (int j = 0; j < sz; ++j) {
        res.m[i][j] = (m[i][j] + T.m[i][j]);
      }
    return res;
  }
  mat operator*(const mat& T) const {
    mat res;
    int r;
    for (int i = 0; i < sz; ++i)
      for (int k = 0; k < sz; ++k) {
        r = m[i][k];
        for (int j = 0; j < sz; ++j)
          res.m[i][j] += T.m[k][j] * r ;
      }
    return res;
  }
  mat operator^(ll x) const {
    mat res, bas;
    for (int i = 0; i < sz; ++i) res.m[i][i] = 1;
    for (int i = 0; i < sz; ++i)
      for (int j = 0; j < sz; ++j) bas.m[i][j] = m[i][j];
    while (x) {
      if (x & 1) res = res * bas;
      bas = bas * bas;
      x >>= 1;
    }
    return res;
  }
}A,B,f,Tree[4*N],unit;

void build(int now,int l,int r){
    if(l==r){
        if(s[l-1]=='A')Tree[now]=A;
        else Tree[now]=B;
        return;
    }
    int mid=(l+r)>>1;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
    Tree[now]=Tree[now*2]*Tree[now*2+1];
}

mat qurey(int now,int l,int r,int x,int y){
    if(x<=l&&y>=r)return Tree[now];
    int mid=(l+r)>>1;
    mat ans=unit;
    if(x<=mid)ans=ans*qurey(now*2,l,mid,x,y);
    if(y>mid)ans=ans*qurey(now*2+1,mid+1,r,x,y);
    return ans;
}

int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,q;cin>>n>>q>>s;
    int last=0;
    A.m[0][0]=A.m[1][1]=A.m[2][1]=-1;
    A.m[2][2]=B.m[2][1]=1;
    f.m[0][0]=f.m[0][2]=1;
    for(int i=0;i<3;i++)B.m[i][i]=1,unit.m[i][i]=1;
    build(1,1,n);
    while(q--){
        int l,r;cin>>l>>r;
        string now;cin>>now;
        int rl=(last^l)%n+1,rr=(last^r)%n+1;
        l=min(rl,rr);r=max(rl,rr);
        mat calc=f*qurey(1,1,n,l,r);
        ll len=now.size(),t=0;
        for(int i=0;i<len;i++)t=t*2+(now[i]-'0');
        ll mod=1ll<<len;
        last=((t*calc.m[0][0]%mod+mod)%mod+calc.m[0][1]%mod+mod)%mod;
        for(int i=len-1;i>=0;i--){
            if((last>>i)&1)cout<<1;
            else cout<<0;
        }
        cout<<endl;
        if(last<0)break;
    }

    return 0;
} 

 

标签:第二场,mat,sz,int,res,++,多校,牛客,now
From: https://www.cnblogs.com/zhujio/p/17575945.html

相关文章

  • 牛客多校1
    A.AlmostCorrect题意:给出一个长度为\(n\)的\(01\)串\(s\),他一定是没有被排序的,构造不超过\(120\)对的操作序列,使得他不能对\(s\)排序,但可以对长度为\(n\)的其他\(01\)序列排序。思路:设\(s\)中最左边的位置为\(p\),首先先让所有不在\(p\)位置的\(1\)与\(p\)操作,这样对原串没......
  • 牛客多校第二场补题
    牛客多校2I.LinkwithGomoku题意:两个人下五子棋,给出棋盘大小,构造一种方案,使得平局。思路:考虑这样构造xxxxooxxxxxxxxooooox以五一个为一个循环,多出来的部分也以这种方式构造,唯一的问题就是当有奇数行时会导致先手的棋子太多,因此当n为奇数时,让最后一行这样填充xoxoxox.......
  • 牛客第一场补题
    牛客多校1D.Chocolate题意:A、B轮流吃巧克力,当一个人选择一个点吃的时候,会把这个点及其左下的所有全部吃完,谁先吃完谁就输了,给出巧克力的大小,问谁会赢。思路:考虑当一个人吃完只剩一行或一列时,那么下一个吃的人就可以控制把最后一块留给这个人,因此当一个人吃完剩一行和一列的......
  • 杭电多校第一场补题
    杭电多校第一场1001Hide-And-SeekGame题意:给出一棵树,每次询问第一个人从Sa-Sb之间来回走,第二个人在Ta-Tb之间来回走,最早相遇的节点,如果无法相遇就输出-1做法:由于数据量是1e3级别,因此对于每一条路径都可以使用暴力找祖先的方法求出路径,然后对于路径上的每一个节点,其出现的时间......
  • 2023牛客暑期多校训练营2 补题
    D.TheGameofEating题意:有n个人和m道菜,每个人对每个菜的都有一个喜好度a[i][j],所有人都知道其他人的喜好度,现在需要上k道菜,从1,2...,n,1,2.....的顺序来选,如果每个人都只考虑自己的喜好,问最后哪些菜会被端上来Solution我们考虑到所有人都知道其他人的喜好度,也就是说,假设当前要选......
  • 牛客多校2
    D.TheGameofEating题意:有\(n\)个人,\(m\)种菜,从\(1\)开始轮流点菜,一共点\(k\)道,\(n\)点完轮到\(1\),直到点完,点过的菜其他人不能再点。第\(i\)个人对第\(j\)道菜有\(A_{i,j}\)的喜好度,每个人都想让自己对所有已选的菜的喜好度总和最大,他们能彼此看到对菜的喜好度,问最后点了的......
  • 暑假牛客多校第二场 2023-7-21
    未补完E.Square算法:二分做法:我们依据x来枚举k,得到\(x*10^k\),用二分在[0,1e9]查找mid的平方值,且这个值是第一个大于等于\(x*10^k\)的值。得到这个值后我们再判断这个值在除\(10^k\)后是否与\(x\)相等即可。code#include<iostream>#include<cstring>#incl......
  • 2023牛客多校7.21补题
    D-TheGameofEating题意:一共有m道菜,n个人轮流点一道菜,一共点k道。第i个人对第j道菜的喜爱程度\(A_{i,j}\)对所有人公开,一个人点了菜所有人都可以吃到。每个人都希望最大化自己的喜爱程度之和,求最终的点菜集合。分析:很容易想到每个人点菜时都点当前剩下的菜中自己最喜爱的,但是......
  • 牛客暑假多校 2023 第二场
    写在前面比赛地址:https://ac.nowcoder.com/acm/contest/57356。我是MINUS-FIFTEEN级超级战犯。澄清一下,我不是声优厨,我不是声优厨,我不是声优厨。同样是题目选补,我是飞舞。以下个人向难度排序。I签到。随便手玩一下就行。D虽然每个人都倾向于吃到自己最喜欢的菜,但给在......
  • 2023 牛客暑期多校
    7.17我正开,Dgjk倒开,AHJKLMA-AlmostCorrect设\(s\)中\(0\)的下标集合为\(S_{0}\),\(1\)的为\(S_{1}\),最右边的\(0\)的下标\(r\),最左边\(1\)的下标\(l\)。\(s\)没有排好序所以\(l\le|S_{1}|<r\)\(\foralli\inS_{0},(i,r)\)\(\foralli\inS_{1},(l......