• 21牛客多校第八场


    A

    签到题,注意(x=0)的特例,求逆元即可

    #include<bits/stdc++.h>
    #define inf 2139062143
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    #define MAXN 100100
    #define MOD 4933
    #define Fill(a,x) memset(a,x,sizeof(a))
    #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    #define ren for(int i=fst[x];i;i=nxt[i])
    #define pls(a,b) (a+b)%MOD
    #define mns(a,b) (a-(b)+MOD)%MOD
    #define mul(a,b) (1LL*(a)*(b))%MOD
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int qp(int x,int t,int res=1)
    {
    	for(;t;t>>=1,x=mul(x,x)) if(t&1) res=mul(res,x);
    	return res;
    }
    int n,m,k,a,l;
    int main()
    {
    	n=read(),m=read(),k=read(),a=read(),l=read();
    	int x,y,z,res=1;
    	rep(i,1,k) {x=read(),y=read(),z=read();if(x) res=mul(res,qp(z,MOD-2,z-y));} 
    	printf("%d
    ",pls(res,a));
    }
    

    D

    由于(a+b=(a|b)+(a&b)),则每一位的限制是独立的,分别(O(n))判断

    #include<bits/stdc++.h>
    #define inf 2139062143
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    #define MAXN 100100
    #define MOD 998244353
    #define Fill(a,x) memset(a,x,sizeof(a))
    #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    #define ren for(int i=fst[x];i;i=nxt[i])
    #define pls(a,b) (a+b)%MOD
    #define mns(a,b) (a-(b)+MOD)%MOD
    #define mul(a,b) (1LL*(a)*(b))%MOD
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,b[MAXN],c[MAXN],ans=1;
    inline int cheq(int x,int j)
    {
    	rep(i,2,n)
    	{
    		if((c[i]>>j)&1){if(!x) return 0;}
    		else if((b[i]>>j)&1) x^=1;
    		else {if(x) return 0;}
    	}
    	return 1;
    }
    int main()
    {
    	n=read();
    	rep(i,2,n) b[i]=read();
    	rep(i,2,n) {c[i]=read(),c[i]-=b[i];if(c[i]<0) return puts("0"),0;}
    	dwn(j,29,0)
    	{
    		if((c[2]>>j)&1)
    			{if(!cheq(1,j)) return puts("0"),0;}
    		else if((b[2]>>j)&1)
    		{
    			int tmp=cheq(1,j)+cheq(0,j);
    			if(!tmp) return puts("0"),0;
    			else ans*=tmp;
    		}
    		else 
    			{if(!cheq(0,j)) return puts("0"),0;}
    	}
    	printf("%d
    ",ans);
    }
    

    E

    签到题 (puts("no"))

    #include<bits/stdc++.h>
    #define inf 2139062143
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    #define MAXN 100100
    #define MOD 998244353
    #define Fill(a,x) memset(a,x,sizeof(a))
    #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    #define ren for(int i=fst[x];i;i=nxt[i])
    #define pls(a,b) (a+b)%MOD
    #define mns(a,b) (a-(b)+MOD)%MOD
    #define mul(a,b) (1LL*(a)*(b))%MOD
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int main()
    {
    	rep(T,1,read()) 
    	{
    		puts("no");
    	}
    }
    

    F

    考虑按照列分治,每次分治处理出(mid)两侧的点分别能到达(mid)这一列的哪些点

    (bitset)记录,这一部分复杂度为(O(frac{n^2mlogm}{w}))

    把所有询问挂到起点的位置,每次分治都可以计算出询问点的列在([l,r])范围内且 起点与终点分别位于(mid)两侧的答案

    注意终点列在(mid)时需要特殊处理

    #include<bits/stdc++.h>
    #define inf 2139062143
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    #define MAXN 500100
    #define MOD 998244353
    #define Fill(a,x) memset(a,x,sizeof(a))
    #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    #define ren for(int i=fst[x];i;i=nxt[i])
    #define pls(a,b) (a+b)%MOD
    #define mns(a,b) (a-(b)+MOD)%MOD
    #define mul(a,b) (1LL*(a)*(b))%MOD
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,ans[MAXN],cur[550][550];
    struct Ask{int x,y,id;}g;
    bool operator < (Ask &a,Ask &b) {return a.y<b.y;}
    char ch[550][550];
    bitset<505> f[510][510];
    vector<Ask> q[550][550];
    void Div(int l,int r)
    {
    	int mid=l+r>>1;if(l<mid) Div(l,mid-1);if(mid<r) Div(mid+1,r);
    	rep(i,1,n)
    	{
    		f[i][mid].reset();
    		if(ch[i][mid]=='0')
    		{
    			f[i][mid][i]=1;
    			if(i!=1) f[i][mid]|=f[i-1][mid];
    		}
    	}
    	rep(j,mid+1,r) rep(i,1,n) if(ch[i][j]!='1')
    	{
    		if(i!=1) f[i][j]=f[i-1][j]|f[i][j-1];
    		else f[i][j]=f[i][j-1];
    	}
    	dwn(i,n,1)
    	{
    		f[i][mid].reset();
    		if(ch[i][mid]=='0')
    		{
    			f[i][mid][i]=1;
    			if(i!=n) f[i][mid]|=f[i+1][mid];
    		}
    	}
    	dwn(j,mid-1,l) dwn(i,n,1) if(ch[i][j]!='1')
    	{
    		if(i!=n) f[i][j]=f[i+1][j]|f[i][j+1];
    		else f[i][j]=f[i][j+1];
    	}
    	rep(j,l,mid) rep(i,1,n) if(q[i][j].size())
    		for(int &st=cur[i][j],ed=q[i][j].size()-1;st<=ed;st++)
    		{
    			g=q[i][j][st];if(g.y>r) break;
    			if(g.y==mid) ans[g.id]=f[i][j][g.x];
    			else ans[g.id]=(f[i][j]&f[g.x][g.y]).any();
    		}
    }
    int main()
    {
    	n=read(),m=read();int Q,x,a,b,c,d;
    	rep(i,1,n) scanf("%s",ch[i]+1);
    	Q=read();rep(i,1,Q)
    	{
    		x=read(),a=read(),b=read(),c=read(),d=read();
    		if(x==1) {if(b==d&&a<=c) q[a][b].pb({c,d,i});}
    		else if(x==2) {if(a==c&&b<=d) q[a][b].pb({c,d,i});}
    		else if(a<=c&&b<=d) q[a][b].pb({c,d,i});
    	}
    	rep(i,1,n) rep(j,1,m) if(q[i][j].size())
    		sort(q[i][j].begin(),q[i][j].end());
    	Div(1,m);rep(i,1,Q) puts(ans[i]?"yes":"no");
    }
    

    J

    (dp)出不在(s ightarrow t)链上的点离开的最长链,则题目转化为链上的博弈

    例如对于((x,y,0))这个状态,表示两人在((x,y))位置,当前决策人是(x)

    当前的决策人要么继续向前走一步,要么选择离开这条链,对手则可以在((x+1,y))内选择一个最大值离开

    容易发现维护一个(RMQ)之后状态只有(O(n))个,直接(dfs)模拟即可,而这个(RMQ)可以在递归的过程中维护

    #include<bits/stdc++.h>
    #define inf 2139062143
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    #define MAXN 500100
    #define MOD 998244353
    #define Fill(a,x) memset(a,x,sizeof(a))
    #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    #define ren for(int i=fst[x];i;i=nxt[i])
    #define pls(a,b) (a+b)%MOD
    #define mns(a,b) (a-(b)+MOD)%MOD
    #define mul(a,b) (1LL*(a)*(b))%MOD
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,nxt[MAXN<<1],fst[MAXN],to[MAXN<<1],cnt,dp[MAXN],in[MAXN],fa[MAXN];
    int s,t,g[MAXN],tot,w1[MAXN],w2[MAXN],mx1,mx2;
    void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
    void getf(int x,int pa)
    {
    	fa[x]=pa;ren if(to[i]^pa) getf(to[i],x);
    }
    void dfs(int x,int pa)
    {
    	ren if(to[i]^pa)
    	{
    		dfs(to[i],x);
    		if(!in[to[i]]) dp[x]=max(dp[x],dp[to[i]]+1);
    	}
    }
    int solve(int x,int y,int now)
    {
    	if(y==x+1)
    	{
    		mx1=max(w1[x],w1[y]),mx2=max(w2[x],w2[y]);
    		return w1[x]-w2[y];
    	}
    	int res=now?solve(x,y-1,now^1):solve(x+1,y,now^1);
    	if(!now) res=max(res,w1[x]-mx2),mx1=max(mx1,w1[x]),mx2=max(mx2,w2[x]);
    	else res=min(res,mx1-w2[y]),mx1=max(mx1,w1[y]),mx2=max(mx2,w2[y]);
    	return res;
    }
    int main()
    {
    	n=read(),s=read(),t=read();int a,b;
    	rep(i,2,n) a=read(),b=read(),add(a,b),add(b,a);
    	getf(s,0);for(a=t;a;a=fa[a]) {in[a]=1;g[++tot]=a;}
    	dfs(s,0);n=tot;rep(i,1,n>>1) swap(g[i],g[n-i+1]);
    	rep(i,1,n) w1[i]=i-1+dp[g[i]],w2[i]=n-i+dp[g[i]];
    	printf("%d
    ",solve(1,n,0));
    }
    

    K

    对于一个直线要么沿着短边前进获得(2)的贡献,要么沿着对角线走获得(3)的贡献

    不妨令(a,b)分别表示短边和对角线长度,则答案为(max{2x+3y+4},xa+yble pi;x,yin N)

    显然(x,y)不能超过(2),否则根据(3a)(2b)的大小关系一定能得到更优的解

    直接枚举这个较小数即可

    #include<bits/stdc++.h>
    #define inf 2139062143
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    #define MAXN 100100
    #define MOD 998244353
    #define Fill(a,x) memset(a,x,sizeof(a))
    #define rep(i,s,t) for(int i=(s),i##end=(t);i<=i##end;++i)
    #define dwn(i,s,t) for(int i=(s),i##end=(t);i>=i##end;--i)
    #define ren for(int i=fst[x];i;i=nxt[i])
    #define pls(a,b) (a+b)%MOD
    #define mns(a,b) (a-(b)+MOD)%MOD
    #define mul(a,b) (1LL*(a)*(b))%MOD
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const db pi=acos(-1);
    db a,b;int ans;
    int main()
    {
    	rep(T,1,read())
    	{
    		cin>>a>>b;if(a>b) swap(a,b);
    		b=sqrt(a*a+b*b);ans=0;
    		rep(i,0,2)
    		{
    			if(i*b<pi) ans=max(ans,3*i+2*(int)((pi-i*b)/a));
    			if(i*a<pi) ans=max(ans,2*i+3*(int)((pi-i*a)/b));
    		}
    		printf("%d
    ",ans+4);
    	}
    }
    
  • 相关阅读:
    Win10设置文件夹权限报错-(提示:无法枚举容器中的对象 访问被拒绝)
    判断上传文件是否是图片文件
    PB调用C#编写的Dll类库
    C#txt文件创建并写入信息
    三十分钟学完Vue
    html增加锚点定位
    Asp.Net WebApi 调试利器“单元测试”
    ios端 返回上一级后 卡在正在加载中处理方式
    [转]如何为图片添加热点链接?(map + area)
    JS获取当前时间并格式化"yyyy-MM-dd HH:mm:ss"
  • 原文地址:https://www.cnblogs.com/yyc-jack-0920/p/15124379.html
Copyright © 2020-2023  润新知