zoukankan      html  css  js  c++  java
  • TxDragon的训练5

    Solution

    代码:
    由乃:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define lson x<<1
    #define rson x<<1|1
    using namespace std;
    typedef long long ll;
    const int N=100050;
    int n,m,v,f[1050][20],tr[N*4],lazy[N*4],a[N],tot,b[N],flg,sum[N];
    bool cmp(int a,int b){return a>b;}
    void update(int x,int l,int r,int xl,int xr){
        if(xl<=l&&r<=xr) {tr[x]++;lazy[x]++;return;}
        int mid=(l+r)>>1;
        if(xr<=mid) update(lson,l,mid,xl,xr);
        else if(xl>mid) update(rson,mid+1,r,xl,xr);
        else update(lson,l,mid,xl,mid),update(rson,mid+1,r,mid+1,xr);
    }
    int query(int x,int l,int r,int id,int la){
        if(l==r) return tr[x]+la;
        int mid=(l+r)>>1;la+=lazy[x];
        if(id<=mid) return query(lson,l,mid,id,la);
        else return query(rson,mid+1,r,id,la);
    }
    int work(int i){
        int ret=query(1,1,n,i,0);int x=a[i];
        for(int j=18;j>=0;j--){
    	if(ret>=(1<<j)) ret-=(1<<j),x=f[x][j];
        }
        return x;
    }
    void dfs(int x,int suma,int sumb,int sa,int sb){
        if(abs(suma-sumb)>sum[x]+(tot-x+1)) return;
        if(flg) return;
        if(suma==sumb&&sa&&sb) {flg=1;return;}
        if(x>tot) return;
        dfs(x+1,suma+b[x]+1,sumb,sa+1,sb);
        dfs(x+1,suma,sumb+b[x]+1,sa,sb+1);
        dfs(x+1,suma,sumb,sa,sb);
    }
    int main(){
        scanf("%d%d%d",&n,&m,&v);
        for(int i=0;i<=v;i++) f[i][0]=(1ll*i*i*i)%v;
        for(int j=1;j<=18;j++){
    	for(int i=0;i<=v;i++){
    	    f[i][j]=f[f[i][j-1]][j-1];
    	}
        }
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);int tmp=0;
        for(int i=1;i<=m;i++){
    	int type,l,r;scanf("%d%d%d",&type,&l,&r);
    	if(type==2) update(1,1,n,l,r);
    	else {
    	    tmp++;
    	    if(r-l+1>13) puts("Yuno");
    	    else{
    		tot=0;
    		for(int j=l;j<=r;j++) b[++tot]=work(j);
    		sort(b+1,b+1+tot,cmp);sum[tot]=b[tot];sum[tot+1]=0;
    		for(int j=tot-1;j;j--) sum[j]=sum[j+1]+b[j];
    		flg=0;dfs(1,0,0,0,0);
    		if(flg) puts("Yuno");
    		else puts("Yuki");
    	    }
    	}
        }
        return 0;
    }
    

     树:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int N=300050;
    int head[N],to[N],nxt[N],v[N],cnt,n,s;
    ll dep[N],ans;
    void lnk(int x,int y){
        to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
        to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
    }
    map<ll,int>Map;
    void dfs(int x,int fa){
        Map[dep[fa]+s]++;ans+=Map[dep[x]];
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==fa) continue;
    	dep[y]=dep[x]+v[y];dfs(y,x);
        }
        Map[dep[fa]+s]--;
    }
    int main(){
        scanf("%d%d",&n,&s);
        for(int i=1;i<=n;i++) scanf("%d",&v[i]);
        for(int i=1;i<n;i++) {int x,y;scanf("%d%d",&x,&y);lnk(x,y);}
        dep[1]=v[1];dfs(1,0);
        printf("%lld
    ",ans);
        return 0;
    }
    

     simple:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=500050;
    int head[N],to[N],nxt[N],hsh[N],tot,rt[N],cnt,sz,a[N],n,Q;
    void lnk(int x,int y){
        to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
        to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
    }
    int size[N],son[N],dfn[N],id[N],tt,top[N],fa[N],deep[N];
    int sum[N*8],ls[N*8],rs[N*8];
    char s[N];
    struct data{
        int type,i,j,x;
    }q[N];
    void dfs1(int x,int f){
        size[x]=1;
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==f) continue;
    	fa[y]=x;deep[y]=deep[x]+1;dfs1(y,x);size[x]+=size[y];
    	if(size[y]>size[son[x]]) son[x]=y;
        }
    }
    void dfs2(int x,int f){
        dfn[x]=++tt;top[x]=f;id[tt]=x;
        if(son[x]) dfs2(son[x],f);
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==fa[x]||y==son[x]) continue;
    	dfs2(y,y);
        }
    }
    void update(int &x,int l,int r,int id,int v){
        if(!x) x=++sz;
        if(l==r) {sum[x]+=v;return;}
        int mid=(l+r)>>1;
        if(id<=mid) update(ls[x],l,mid,id,v);
        else update(rs[x],mid+1,r,id,v);
        sum[x]=sum[ls[x]]+sum[rs[x]];
    }
    int query(int x,int l,int r,int xl,int xr){
        if(xl<=l&&r<=xr) return sum[x];
        int mid=(l+r)>>1;
        if(xr<=mid) return query(ls[x],l,mid,xl,xr);
        else if(xl>mid) return query(rs[x],mid+1,r,xl,xr);
        else return query(ls[x],l,mid,xl,mid)+query(rs[x],mid+1,r,mid+1,xr);
    }
    void Change(int x,int c){
        update(rt[a[x]],1,n,dfn[x],-1);
        update(rt[c],1,n,dfn[x],1);
        a[x]=c;
    }
    int Query(int x,int y,int c){
        int ret=0;
        while(top[x]!=top[y]){
    	if(deep[top[x]]<deep[top[y]]) swap(x,y);
    	ret+=query(rt[c],1,n,dfn[top[x]],dfn[x]);
    	x=fa[top[x]];
        }
        if(deep[x]<deep[y]) swap(x,y);
        ret+=query(rt[c],1,n,dfn[y],dfn[x]);
        return ret;
    }
    int main(){
        scanf("%d%d",&n,&Q);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]),hsh[++tot]=a[i];
        for(int i=1;i<n;i++){
    	int x,y;scanf("%d%d",&x,&y);lnk(x,y);
        }
        dfs1(1,0);dfs2(1,1);
        for(int i=1;i<=Q;i++){
    	scanf("%s",s+1);
    	if(s[1]=='Q') scanf("%d%d%d",&q[i].i,&q[i].j,&q[i].x),q[i].type=1,hsh[++tot]=q[i].x;
    	else scanf("%d%d",&q[i].i,&q[i].x),q[i].type=2,hsh[++tot]=q[i].x;
        }
        sort(hsh+1,hsh+1+tot);tot=unique(hsh+1,hsh+1+tot)-hsh-1;
        for(int i=1;i<=n;i++) a[i]=lower_bound(hsh+1,hsh+1+tot,a[i])-hsh,update(rt[a[i]],1,n,dfn[i],1);
        for(int i=1;i<=Q;i++){
    	q[i].x=lower_bound(hsh+1,hsh+1+tot,q[i].x)-hsh;
    	if(q[i].type==1) printf("%d
    ",Query(q[i].i,q[i].j,q[i].x));
    	else Change(q[i].i,q[i].x);
        }
        return 0;
    }
    

     oi树:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=10050;
    int f[N][27][33],g[N][27][33];
    int n,k,son[N][27],v[N][27],mod;
    char s[N*20];
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
    	for(int j=1;j<=k;j++){
    	    scanf("%d%d",&son[i][j-1],&v[i][j-1]);
    	    f[i][j-1][0]=son[i][j-1],g[i][j-1][0]=v[i][j-1];
    	}
        }
        scanf("%s",s+1);scanf("%d",&mod);
        for(int j=1;j<=31;j++){
    	for(int K=0;K<k;K++){
    	    for(int i=1;i<=n;i++){
    		f[i][K][j]=f[f[i][K][j-1]][K][j-1];
    		g[i][K][j]=(g[i][K][j-1]+g[f[i][K][j-1]][K][j-1])%mod;
    	    }
    	}
        }
        int len=strlen(s+1),ans=0,x=1,i=1;
        for(int i=1;i<=len;i++){
            if(s[i]=='['){
                int p=0;
                while(s[++i]>='0'&&s[i]<='9') p=p*10+s[i]-48;
                int K=s[i]-'A';
                i++;
    	    for(int j=31;j>=0;j--){
    		if(p>=(1ll<<j)&&f[x][K][j]){
    		    (ans+=g[x][K][j])%=mod;
    		    p-=(1<<j);x=f[x][K][j];
    		}
    	    }
    	}
    	else{
    	    int K=s[i]-'A';
    	    (ans+=g[x][K][0])%=mod;x=f[x][K][0];
    	}
        }
        cout<<ans%mod<<endl;
        return 0;
    }
    

     二分图:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #define lson x<<1
    #define rson x<<1|1
    using namespace std;
    typedef long long ll;
    const int N=1000050;
    struct data{
        int u,v;
    };
    vector<data> p[N];
    int dep[N],sz[N],fa[N],a[N],top,n,m,T;
    struct date{
        int x,y,a,sz;
    }zhan[N];
    void query(int x,int l,int r,int xl,int xr,int u,int v){
        if(xl<=l&&r<=xr) {p[x].push_back((data){u,v});return;}
        int mid=(l+r)>>1;
        if(xr<=mid) query(lson,l,mid,xl,xr,u,v);
        else if(xl>mid) query(rson,mid+1,r,xl,xr,u,v);
        else query(lson,l,mid,xl,mid,u,v),query(rson,mid+1,r,mid+1,xr,u,v);
    }
    int find(int x){
        if(x==fa[x]) return fa[x];int y=find(fa[x]);
        dep[x]=dep[fa[x]]^a[x];return y;
    }
    int merge(int x,int y){
        int u=find(x),v=find(y);
        if(u==v) return dep[x]^dep[y]^1;
        if(sz[u]>sz[v]) swap(u,v);
        zhan[++top]=(date){u,v,a[u],sz[v]};
        fa[u]=v;sz[v]+=sz[u];a[u]=dep[x]^dep[y]^1;
        return 0;
    }
    void del(int now){
        while(top>now){
    	fa[zhan[top].x]=zhan[top].x;dep[zhan[top].x]=0;
    	a[zhan[top].x]=zhan[top].a;sz[zhan[top].y]=zhan[top].sz;
    	top--;
        }
    }
    void solve(int x,int l,int r){
        int mid=(l+r)>>1;int now=top;
        for(int i=0;i<p[x].size();i++){
    	int ret=merge(p[x][i].u,p[x][i].v);
    	if(ret){for(int i=l;i<=r;i++)puts("No");del(now);return;}
        }
        if(l==r){puts("Yes");del(now);return;}
        solve(lson,l,mid);solve(rson,mid+1,r);del(now);
    }
    int main(){
        freopen("grape.in","r",stdin);
        freopen("grape.out","w",stdout);
        scanf("%d%d%d",&n,&m,&T);
        for(int i=1;i<=m;i++){
    	int u,v,l,r;scanf("%d%d%d%d",&u,&v,&l,&r);l++;
    	if(l>r) continue;
    	query(1,1,T,l,r,u,v);
        }
        for(int i=1;i<=n;i++) fa[i]=i,sz[i]=1;
        solve(1,1,T);
        return 0;
    }
    

     情报传递:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define lson x<<1
    #define rson x<<1|1
    using namespace std;
    typedef long long ll;
    const int N=1000050;
    int head[N],to[N],nxt[N],cnt,n,rt,T;
    void lnk(int x,int y){
        to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
        to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
    }
    struct data{
        int type,x,y,tim,id;
    }q[N];
    bool cmp(const data &a,const data &b){
        if(a.tim==b.tim) return a.type<b.type;
        else return a.tim<b.tim;
    }
    int deep[N],size[N],son[N],dfn[N],tt,id[N],top[N],fa[N];
    void dfs1(int x,int f){
        size[x]=1;
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==f) continue;
    	deep[y]=deep[x]+1;dfs1(y,x);size[x]+=size[y];
    	if(size[y]>size[son[x]]) son[x]=y;
        }
    }
    void dfs2(int x,int f){
        top[x]=f;dfn[x]=++tt;id[tt]=x;
        if(son[x]) dfs2(son[x],f);
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==fa[x]||y==son[x]) continue;
    	dfs2(y,y);
        }
    }
    int tr[N*4];
    /*void update(int x,int l,int r,int id){
        if(l==r) {tr[x]=1;return;}
        int mid=(l+r)>>1;
        if(id<=mid) update(lson,l,mid,id);
        else update(rson,mid+1,r,id);
        tr[x]=tr[lson]+tr[rson];
    }
    int query(int x,int l,int r,int xl,int xr){
        if(xl<=l&&r<=xr) return tr[x];
        int mid=(l+r)>>1;
        if(xr<=mid) return  query(lson,l,mid,xl,xr);
        else if(xl>mid) return query(rson,mid+1,r,xl,xr);
        else return query(lson,l,mid,xl,mid)+query(rson,mid+1,r,mid+1,xr);
    }*/
    int lowbit(int x){return x&-x;}
    void update(int x,int v){
        for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v;
    }
    int query(int x){
      int ret=0;
      for(int i=x;i;i-=lowbit(i)) ret+=tr[i];
      return ret;
    }
    struct date{
        int x,y;
    }ans[N];
    date Lca(int x,int y){
        int ret1=deep[x]+deep[y],ret2=0;
        while(top[x]!=top[y]){
    	if(deep[top[x]]<deep[top[y]]) swap(x,y);
    	//ret2+=query(1,1,n,dfn[top[x]],dfn[x]);
    	ret2+=query(dfn[x])-query(dfn[top[x]]-1);
    	x=fa[top[x]];
        }
        if(deep[x]<deep[y]) swap(x,y);
        //ret2+=query(1,1,n,dfn[y],dfn[x]);
        ret2+=query(dfn[x])-query(dfn[y]-1);
        return (date){ret1-2*deep[y]+1,ret2};
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
    	int x;scanf("%d",&x);
    	if(!x) rt=i;
    	else lnk(i,x),fa[i]=x;
        }
        dfs1(rt,0);dfs2(rt,rt);scanf("%d",&T);int xh=0;
        for(int i=1;i<=T;i++){
    	int type;scanf("%d",&type);
    	if(type==1){
    	    int x,y,z;
    	    scanf("%d%d%d",&x,&y,&z);++xh;
    	    q[i]=(data){1,x,y,i-z,xh};
    	}
    	else{
    	    int x;scanf("%d",&x);
    	    q[i]=(data){2,x,0,i,0};
    	}
        }
        sort(q+1,q+1+T,cmp);
        for(int i=1;i<=T;i++){
    	if(q[i].type==2) update(dfn[q[i].x],1);//update(1,1,n,dfn[q[i].x]);
    	else ans[q[i].id]=Lca(q[i].x,q[i].y);
        }
        for(int i=1;i<=xh;i++) printf("%d %d
    ",ans[i].x,ans[i].y);
        return 0;
    }
    

     消耗战:

    // MADE BY QT666
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int N=1000050;
    int head[N],to[N],nxt[N],w[N],cnt,tt;
    int h[N],t[N],nx[N],tmp,n,m,bj[N];
    ll dp[N],val[N];
    void lnk(int x,int y,int z){
        to[++cnt]=y,nxt[cnt]=head[x],w[cnt]=z,head[x]=cnt;
        to[++cnt]=x,nxt[cnt]=head[y],w[cnt]=z,head[y]=cnt;
    }
    void insert(int x,int y){
        if(x==y) return;
        t[++tmp]=y,nx[tmp]=h[x],h[x]=tmp;
        t[++tmp]=x,nx[tmp]=h[y],h[y]=tmp;
    }
    int size[N],dfn[N],id[N],son[N],top[N],deep[N],fa[N],a[N],zhan[N];
    void dfs1(int x,int f){
        size[x]=1;
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==f) continue;
    	val[y]=min(val[x],1ll*w[i]);
    	deep[y]=deep[x]+1;dfs1(y,x);fa[y]=x;size[y]+=size[x];
    	if(size[y]>size[son[x]]) son[x]=y;
        }
    }
    void dfs2(int x,int f){
        dfn[x]=++tt;top[x]=f;id[tt]=x;
        if(son[x]) dfs2(son[x],f);
        for(int i=head[x];i;i=nxt[i]){
    	int y=to[i];if(y==fa[x]||y==son[x]) continue;
    	dfs2(y,y);
        }
    }
    int Lca(int x,int y){
        while(top[x]!=top[y]){
    	if(deep[top[x]]<deep[top[y]]) swap(x,y);
    	x=fa[top[x]];
        }
        if(deep[x]<deep[y]) swap(x,y);
        return y;
    }
    bool cmp(int a,int b){return dfn[a]<dfn[b];}
    void Dp(int x,int f){
        ll res=0;dp[x]=val[x];
        for(int i=h[x];i;i=nx[i]){
    	int y=t[i];if(y==f) continue;
    	Dp(y,x);res+=dp[y];
        }
        h[x]=0;
        if(!res) dp[x]=val[x];
        else if(!bj[x]&&res<dp[x]) dp[x]=res;
    }
    void solve(){
        int k;scanf("%d",&k);tmp=0;
        for(int i=1;i<=k;i++){scanf("%d",&a[i]);bj[a[i]]=1;}
        sort(a+1,a+1+k,cmp);int tp=0;zhan[++tp]=1;
        for(int i=1;i<=k;i++){
    	if(!tp){zhan[++tp]=a[i];continue;}
    	int p=Lca(zhan[tp],a[i]);
    	while(1){
    	    if(deep[zhan[tp-1]]<=deep[p]){
    		insert(zhan[tp],p);tp--;
    		if(zhan[tp]!=p) zhan[++tp]=p;
    		break;
    	    }
    	    insert(zhan[tp],zhan[tp-1]);tp--;
    	}
    	zhan[++tp]=a[i];
        }
        while(tp>1) insert(zhan[tp],zhan[tp-1]),tp--;
        Dp(1,1);printf("%lld
    ",dp[1]);
        for(int i=1;i<=k;i++) bj[a[i]]=0;
    }
    int main(){
        val[1]=1ll<<60;scanf("%d",&n);
        for(int i=1;i<n;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);lnk(x,y,z);}
        dfs1(1,0);dfs2(1,1);scanf("%d",&m);
        while(m--) solve();
        return 0;
    }
    

    Peaks:

    // MADE BY QT666
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #define RG register
    using namespace std;
    typedef long long ll;
    const int N=400050;
    int n,m,Q,sz,fa[N],rt[N],ls[N*20],rs[N*20],sum[N*20],hsh[N],Fa[N];
    int id[N],dfn[N],ed[N],h[N],v[N],size[N],son[N],top[N];
    struct data{
      int a,b,c;
    }e[500050];
    bool cmp(const data &a,const data &b){return a.c<b.c;}
    int head[N],to[N],nxt[N],cnt,tt,tot,res;
    inline void lnk(int x,int y){
      to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
    }
    inline int find(int x){
      if(x!=fa[x]) fa[x]=find(fa[x]);
      return fa[x];
    }
    inline void dfs1(int x,int f){
      size[x]=1;
      for(RG int i=head[x];i;i=nxt[i]){
        int y=to[i];
        if(y!=f){
          Fa[y]=x;dfs1(y,x);size[x]+=size[y];
          if(size[y]>size[son[x]]) son[x]=y;
        }
      }
    }
    inline void dfs2(int x,int ff){
      dfn[x]=++tot;id[tot]=x;top[x]=ff;
      if(son[x]) dfs2(son[x],ff);
      for(RG int i=head[x];i;i=nxt[i]){
        int y=to[i];
        if(y!=Fa[x]&&y!=son[x]) dfs2(y,y);
      }
      ed[x]=tot;
    }
    inline void insert(RG int x,RG int &y,RG int l,RG int r,RG int u){
      y=++sz;ls[y]=ls[x],rs[y]=rs[x];sum[y]=sum[x]+1;
      if(l==r) return;
      RG int mid=(l+r)>>1;
      if(u<=mid) insert(ls[x],ls[y],l,mid,u);
      else insert(rs[x],rs[y],mid+1,r,u);
    }
    inline int query(RG int x,RG int y,RG int l,RG int r,RG int k){
      if(l==r) return l;
      RG int mid=(l+r)>>1;
      if(sum[ls[y]]-sum[ls[x]]>=k) return query(ls[x],ls[y],l,mid,k);
      else return query(rs[x],rs[y],mid+1,r,k-(sum[ls[y]]-sum[ls[x]]));
    }
    inline int jump(RG int x,RG int lim){
      RG int j=x;
      while(x&&v[top[x]]<=lim){
        j=top[x],x=Fa[top[x]];
      }
      if(v[x]>lim||v[top[x]]<=lim) return j; 
      RG int l=dfn[top[x]],r=dfn[x],ret=0;
      while(l<=r){
        RG int mid=(l+r)>>1;
        if(v[id[mid]]<=lim) r=mid-1,ret=mid;
        else l=mid+1;
      }
      return id[ret];
    }
    int main(){
      scanf("%d%d%d",&n,&m,&Q);
      for(RG int i=1;i<=n;i++) scanf("%d",&h[i]),hsh[++res]=h[i];
      for(RG int i=1;i<=m;i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
      sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++) fa[i]=i;tt=n;
      for(RG int i=1;i<=m;i++){
        RG int x=find(e[i].a),y=find(e[i].b);
        if(y!=x){
          tt++;v[tt]=e[i].c;fa[x]=fa[y]=tt;fa[tt]=tt;
          lnk(tt,x);lnk(tt,y);
        }
      }
      for(RG int i=1;i<=tt;i++){
        RG int g=find(i);
        if(!dfn[g]) dfs1(g,g),dfs2(g,g);
      }
      sort(hsh+1,hsh+res+1);res=unique(hsh+1,hsh+1+res)-hsh-1;
      for(RG int i=1;i<=tot;i++){
        rt[i]=rt[i-1];
        if(id[i]<=n) insert(rt[i],rt[i],1,res,lower_bound(hsh+1,hsh+1+res,h[id[i]])-hsh);
      }
      RG int lastans=0;
      while(Q--){
        RG int u,x,k;scanf("%d%d%d",&u,&x,&k);
        u^=lastans,x^=lastans,k^=lastans;
        RG int Lca=jump(u,x);
        if(sum[rt[ed[Lca]]]-sum[rt[dfn[Lca]-1]]<k) puts("-1"),lastans=0;
        else lastans=query(rt[dfn[Lca]-1],rt[ed[Lca]],1,res,(sum[rt[ed[Lca]]]-sum[rt[dfn[Lca]-1]])-k+1),printf("%d
    ",hsh[lastans]),lastans=hsh[lastans];
      }
      return 0;
    }
    

     上帝与集合:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=100050;
    ll bj[10000005],T;
    bool vis[10000005];
    ll qpow(ll x,ll y,ll mod){
        ll ret=1;
        while(y){
    	if(y&1) (ret*=x)%=mod;
    	(x*=x)%=mod;y>>=1;
        }
        return ret;
    }
    ll getphi(ll P){
        ll M=P;ll res=P;
        for(ll i=2;i*i<=P;i++)
    	if(res%i==0) {
    	    (M/=i)*=i-1;
    	    while(res%i==0) res/=i;
    	}
        if(res>1) (M/=res)*=res-1;
        return M;
    }
    ll solve(ll p){
        if(vis[p]) return bj[p];
        ll phi=getphi(p);vis[p]=1;
        return bj[p]=qpow(2,solve(phi)+phi,p);
    }
    int main(){
        scanf("%lld",&T);bj[1]=0;vis[1]=1;
        while(T--){
    	ll p;scanf("%lld",&p);
    	printf("%lld
    ",solve(p));
        }
        return 0;
    }
    

     Savage:

    //MADE BY QT666
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=100050;
    int P[N],C[N],l[N],n;
    int gcd(int x,int y) {return y?gcd(y,x%y):x;}
    void exgcd(int a,int b,int &x,int &y){
        if(!b) x=1,y=0;
        else exgcd(b,a%b,y,x),y-=(a/b)*x;
    }
    bool check(int i,int j,int M){
        int a=P[i]-P[j],b=M,c=C[j]-C[i];
        int Gcd=gcd(a,b);
        if(c%Gcd) return 1;
        int x,y;
        a/=Gcd;b/=Gcd;c/=Gcd;
        exgcd(a,b,x,y);b=abs(b);
        x=((c*x)%b+b)%b;
        if(!x) x+=b;
        if(x>min(l[i],l[j])) return 1;
        return 0;
    }
    bool judge(int M){
        for(int i=1;i<=n;i++) if(M<C[i]) return 0;
        for(int i=1;i<=n;i++){
    	for(int j=i+1;j<=n;j++){
    	    if(!check(i,j,M)){
    		return 0;
    	    }
    	}
        }
        return 1;
    }
    int main(){
        freopen("savage.in","r",stdin);
        freopen("savage.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
    	scanf("%d%d%d",&C[i],&P[i],&l[i]);
        }
        for(int i=1;i<=1e6;i++){
    	if(judge(i)) {cout<<i<<endl;return 0;}
        }
        return 0;
    }
    
  • 相关阅读:
    java类加载过程
    进程和线程
    Java对象的创建
    java异常—检查异常(checked exception)和未检查异常(unchecked exception)
    try...catch...finally语句块
    Mysql数据库索引
    java-生产者消费者模式
    解压字符串
    Java-break,continue,return用法
    归并排序-Java
  • 原文地址:https://www.cnblogs.com/qt666/p/7606767.html
Copyright © 2011-2022 走看看