bzoj 4722吉野

bzoj

この間隔は、次に間隔長1000のサイズ範囲と同数有するかどうか、すなわち、単純な場合を考える\(> \ 1000) 原理を分類整理によれば、2つの同じ番号が存在するであろうがこの時間は直接出力することができますYuno

さらに、長さ\(LEN \)は間隔サブセット範囲\([0、V * LEN] \) 番号の部分集合\(2 ^ {}をlenのを\) それがすることができます条件の場合\(2 ^ {LEN}>のV * LEN + 1 \) 間隔、(除去クロスプットクロス付き)の重みの二つの異なるサブセットが存在しなければならない。このバウンドを得るために解決することができるさ(LEN \ GEを\ 14 \)その後のため、\(\ル13 \)それの一部セットの数、またはしない設定した各列挙子暴力の複雑\(O(3 ^ {LEN })\)実際にすることができます\(\中部ミート)、最初の検索の前半は、与えるために、すべてのケースを選択する\(A \)重みのセット- (\ B)を\、ダイレクトアクセス重みのセットと検索の別のセットの値を対応があるかどうか\(\)の重みのセット( - Bの\)\重みの組の反対、およびプログラムが0であるかどうか、の複雑\(O(3 ^ {\ FRAC {LEN} {2 }})\)

操作を変更すると、その後、時間の値は、常に変更の合計数を変更するために彼を求める-この変更は、チャートで見ることができるので、と回数を変更するために行くために持っている\(X \)あなたは前処理工程のいくつかを取ることができるように、手順ケース番号、あなたが直接変更することができますジャンプ

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double

using namespace std;
const int N=1e5+10,M=1000+10;
int rd()
{
    int x=0,w=1;char ch=0;
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
int n,q,v,to[M][M],cn[N],a[N],bt[N];
void add(int x,int y){while(x<=n) bt[x]+=y,x+=x&(-x);}
int gsm(int x){int an=0;while(x) an+=bt[x],x-=x&(-x);return an;}
int bk[N],st[M<<2],tp,s2[M<<2],t2;
void wk(int x)
{
    int dt=gsm(x)-cn[x];
    cn[x]+=dt;
    while(dt>v) a[x]=to[a[x]][v],dt-=v;
    a[x]=to[a[x]][dt];
}

int main()
{
    n=rd(),q=rd(),v=rd();
    for(int i=1;i<=n;++i) a[i]=rd();
    for(int i=0;i<v;++i) to[i][0]=i,to[i][1]=1ll*i*i*i%v;
    for(int j=2;j<=v;++j)
        for(int i=0;i<v;++i)
            to[i][j]=to[to[i][j-1]][1];
    while(q--)
    {
        int op=rd(),l=rd(),r=rd();
        if(op==2) add(l,1),add(r+1,-1);
        else
        {
            if(r-l+1>=14) puts("Yuno");
            else
            {
                int md=(r-l+1)/2;
                bool ok=0;
                st[tp=1]=50000;
                for(int i=l;i<=l+md-1;++i)
                {
                    wk(i);
                    int latp=tp;
                    for(int j=1;j<=latp;++j)
                    {
                        st[++tp]=st[j]+a[i]+1;
                        ok|=st[tp]==50000,++bk[st[tp]];
                        st[++tp]=st[j]-(a[i]+1);
                        ok|=st[tp]==50000,++bk[st[tp]];
                    }
                }
                s2[t2=1]=50000;
                for(int i=l+md;!ok&&i<=r;++i)
                {
                    wk(i);
                    int latp=t2;
                    for(int j=1;j<=latp;++j)
                    {
                        s2[++t2]=s2[j]+a[i]+1;
                        ok|=s2[t2]==50000||bk[100000-s2[t2]];
                        s2[++t2]=s2[j]-(a[i]+1);
                        ok|=s2[t2]==50000||bk[100000-s2[t2]];
                    }
                }
                puts(ok?"Yuno":"Yuki");
                while(tp>1) bk[st[tp]]=0,--tp;
            }
        }
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/smyjr/p/11600809.html