$bzoj4722$ 由乃 搜索

正解:搜索

解題報告:

傳送門$QwQ$html

首先發現長度爲$len$的子集的值域爲$[0,v\cdot len+len]$,數量爲$2^{len}$.因此當$2^{len}\geq v\cdot len+len$時利用鴿巢原理髮現顯然是有解的.解得$len\geq 14$.c++

因此就只要解決$len<14$的範圍內的問題了.ide

把轉化後的題目拿出來,發現,噢這不是個折半搜索板子嘛.spa

複雜度也很對,$O(3^{\frac{len}{2}})$.code

因而就作完了$QwQ$htm

嗷關於修改操做,只要每次記錄下每一個位置乘了多少次,而後在詢問的時候若是$len<14$就$O(len)$地修改下,不然就不用管鴨$QwQ$blog

$over$get

而後寫完代碼過來補點兒細節it

好像也沒啥,就這個修改操做我原本覺得很$easy$後來發現是我想鍋了$QAQ$event

就修改會修改成$d^{3^k}$.因此這裏有兩種方法,一種是倍增一種是歐拉.由於歐拉比較好寫因此我寫的歐拉.就直接用擴展歐拉定理就完事$QwQ$.

可是說一個很迷惑的點,,,就我以前拿個人和倍增的方法拍了下,,,發現那個修改後的值不同,,,可是都$AC$了,,,我也不知道咋回事$kk$

 

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define lf double
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define lowbit(x) (x&(-x))
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)

const int N=100000+10;
int n,m,mod,a[N],tr[N],ph,lim;
bool flg;
unordered_map<int,int>mp;

il int read()
{
    rc ch=gc;ri x=0;rb y=1;
    while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
    if(ch=='-')ch=gc,y=0;
    while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
    return y?x:-x;
}
il int phi(ri x)
{
    ri ret=x;
    for(ri i=2;i*i<=x;i++)if(!(x%i)){ret=ret/i*(i-1);while(!(x%i))x/=i;}
    if(x>1)ret=ret/x*(x-1);;return ret;
}
il int power(ri x,ri y){ri ret=1;while(y){if(y&1)ret=1ll*ret*x%mod;x=1ll*x*x%mod;y>>=1;}return ret;}
il void ad(ri nw,ri dat){while(nw<=n)tr[nw]+=dat,nw+=lowbit(nw);}
il int query(ri nw){ri ret=0;while(nw)ret+=tr[nw],nw-=lowbit(nw);return ret;}
void dfs1(ri nw,ri lim,ri sum,ri zt)
{
    if(nw>lim)
    {
        if(!zt)return;
        if(zt==1){if(mp[sum]==2 || mp[sum]==4)mp[sum]=4;else mp[sum]|=zt;return;}
        if(zt==2){if(mp[sum]==1 || mp[sum]==4)mp[sum]=4;else mp[sum]|=zt;return;}
        mp[sum]=3;return;
    }
    dfs1(nw+1,lim,sum,zt);dfs1(nw+1,lim,sum+a[nw]+1,zt|1);dfs1(nw+1,lim,sum-a[nw]-1,zt|2);
}
void dfs2(ri nw,ri lim,ri sum,ri zt)
{
    if(nw>lim)
    {
        if(zt==1 && mp[-sum]>1){flg=1;return;}
        if(zt==2 && (mp[-sum]>2 || mp[-sum]==1)){flg=1;return;}
        if(mp[-sum]==3 || (zt==3 && (mp[-sum] || !sum))){flg=1;return;}
        return;
    }
    dfs2(nw+1,lim,sum,zt);if(flg)return;
    dfs2(nw+1,lim,sum+a[nw]+1,zt|1);if(flg)return;
    dfs2(nw+1,lim,sum-a[nw]-1,zt|2);
}
il int lg(ri x){ri ret=0;while(x>=3)++ret,x/=3;return ret;}
il int cal(ri d){ri tmp=0;if(d>lim)tmp=ph;swap(ph,mod);d=power(3,d);swap(ph,mod);return d+tmp;}

int main()
{
    n=read();m=read();mod=read();ph=phi(mod);lim=lg(ph);rp(i,1,n)a[i]=read();
    while(m--)
    {
        ri opt=read(),l=read(),r=read();
        if(opt==2)ad(l,1),ad(r+1,-1);
        else
        {
            if(r-l+1>=14){printf("Yuno\n");continue;}if(l==r){printf("Yuki\n");continue;}
            rp(i,l,r){ri d=query(i);ad(i,-d);ad(i+1,d);a[i]=power(a[i],cal(d));}
            flg=0;mp.clear();
            dfs1(l,(l+r)>>1,0,0);dfs2(((l+r)>>1)+1,r,0,0);if(flg)printf("Yuno\n");else printf("Yuki\n");
        }
    }
    return 0;
}
View Code
相關文章
相關標籤/搜索