bzoj5334: [Tjoi2018]数学计算

这是个悲伤的故事捂脸

噶爷爷安利了到水题,自然而然的被D飞

队长看了一眼说他不会

然而我写T了的时候他过来又看了下说粗略看没啥问题

OZY一眼就说我会nlogn的

结果题意看了20分钟没看懂。。。高兴的吼了起来
tkj:人家都秒了你才看懂题意

哈哈。然而我看懂题意也一眼秒啦。就是线段树把全部记录下来乱搞啊。

结果TLE了。噶爷爷没看出来,就怼怼我线段树模板都错学什么OI啊

l打成1真是没话说。。ORZ zory

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL mod;

struct seg_tree
{
    int l,r,lc,rc;LL c;
}tr[210000];int trlen;
void bt(int l,int r)
{
    int now=++trlen;
    tr[now].l=l;tr[now].r=r;tr[now].c=1;
    tr[now].lc=tr[now].rc=-1;
    if(l<r)
    {
        int mid=(l+r)/2;
        tr[now].lc=trlen+1;bt(l,mid);
        tr[now].rc=trlen+1;bt(mid+1,r);
    }
}
void change(int now,int p,LL c)
{
    if(tr[now].l==tr[now].r){tr[now].c=c;return ;}
    int lc=tr[now].lc,rc=tr[now].rc;
    int mid=(tr[now].l+tr[now].r)/2;
    if(p<=mid)change(lc,p,c);
    else change(rc,p,c);
    tr[now].c=(tr[lc].c*tr[rc].c)%mod;
}
LL getmul(int now,int l,int r) 
{
    if(tr[now].l==l&&tr[now].r==r){return tr[now].c;}
    int lc=tr[now].lc,rc=tr[now].rc;
    int mid=(tr[now].l+tr[now].r)/2;
         if(r<=mid)  return getmul(lc,l,r);
    else if(mid+1<=l)return getmul(rc,l,r);
    else return (getmul(lc,l,mid)*getmul(rc,mid+1,r))%mod;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int Q;
        scanf("%d%lld",&Q,&mod);
        trlen=0;bt(1,Q);
        int op;LL x;
        for(int i=1;i<=Q;i++)
        {
            scanf("%d%lld",&op,&x);
            if(op==1)change(1,i,x),printf("%lld\n",getmul(1,1,Q));
            else change(1,x,1),printf("%lld\n",getmul(1,1,Q));
        }
    }
    return 0;
}

 

posted @ 2018-05-24 12:45  AKCqhzdy  阅读(159)  评论(0编辑  收藏  举报