• 【CSP-S2019模拟】题解


    T1:

    找点双就可以了

    没注意空间MLEMLE

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<20|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ob==ib)?EOF:*ib++;
    }
    inline int read(){
        char ch=gc();
        int res=0,f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    #define ll long long
    #define re register
    #define pii pair<int,int>
    #define pic pair<int,char>
    #define fi first
    #define se second
    #define pb push_back
    #define cs const
    #define bg begin
    #define poly vector<int>
    template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
    template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
    cs int N=1000005;
    int adj[N],in[N],nxt[N<<1],to[N<<1],cnt=1;
    inline void addedge(int u,int v){
    	nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v;
    }
    int dfn[N],low[N],tim,bel[N],belnum,num[N],ee[N],ans[N];
    int stk[N],top,n,m,vis[N];
    pii E[N];
    vector<int> cir[N];
    void dfs(int u,int fa){
    	dfn[u]=low[u]=++tim;
    	stk[++top]=u;
    	for(int e=adj[u];e;e=nxt[e]){
    		int v=to[e];
    		if(v==fa)continue;
    		if(!dfn[v]){
    			dfs(v,u),chemn(low[u],low[v]);
    		}
    		else {chemn(low[u],dfn[v]);continue;}
    		if(low[v]>=dfn[u]){
    			int tmp;
    			belnum++;
    			do{
    				tmp=stk[top];
    				cir[belnum].pb(tmp);
    				num[belnum]++;
    				top--;
    			}while(tmp!=v);
    			cir[belnum].pb(u);
    			num[belnum]++;
    		}		
    	}
    
    }
    int main(){
    int size=40<<20;//40M
        //__asm__ ("movl  %0, %%esp
    "::"r"((char*)malloc(size)+size));//调试用这个 
        __asm__ ("movq %0,%%rsp
    "::"r"((char*)malloc(size)+size));//提交用这个 
    
    	n=read(),m=read();
    	for(int i=1;i<=m;i++){
    		int u=read(),v=read();
    		E[i].fi=u,E[i].se=v;
    		addedge(u,v),addedge(v,u);
    	}
    	dfs(1,0);
    	for(int i=1;i<=belnum;i++){
    		for(int j=0;j<cir[i].size();j++){
    			bel[cir[i][j]]=i;
    		}
    		for(int j=0;j<cir[i].size();j++){
    			int u=cir[i][j];
    			for(int e=adj[u];e;e=nxt[e]){
    				int v=to[e];
    				if(bel[v]==bel[u]&&dfn[u]>dfn[v]){
    					ee[i]++;
    					ans[i]^=e>>1;
    				}
    			}
    		}
    	}
    	int res=0;
    	for(int i=1;i<=belnum;i++){
    		if(ee[i]==num[i])res^=ans[i];
    	}
    	cout<<res;exit(0);//必须用exit 
    }
    

    T2:

    矩乘就完了
    为了限制节点之间的不可达赋成inf-inf

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<20|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ob==ib)?EOF:*ib++;
    }
    #define gc getchar
    inline int read(){
        char ch=gc();
        int res=0,f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    #define ll long long
    #define re register
    #define pii pair<int,int>
    #define fi first
    #define se second
    #define pb push_back
    #define cs const
    #define bg begin
    template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
    template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
    cs int N=205;
    int tot;
    cs ll inf=1e18;
    struct mat{
    	ll a[N][N];
    	mat(){for(int i=0;i<N;i++)for(int j=0;j<N;j++)a[i][j]=-inf;}
    	friend inline mat operator *(cs mat &a,cs mat &b){
    		mat c;
    		for(int i=0;i<=tot;i++)
    		for(int k=0;k<=tot;k++)if(a.a[i][k]!=-inf)
    		for(int j=0;j<=tot;j++)if(a.a[i][k]!=-inf)
    		chemx(c.a[i][j],a.a[i][k]+b.a[k][j]);
    		return c;
    	}
    }bas,res;
    namespace Ac{
    	int val[N],fail[N],nxt[N][26];
    	inline void insert(char *s,int v){
    		int p=0;
    		for(int i=1,len=strlen(s+1);i<=len;i++){
    			int c=s[i]-'a';
    			if(!nxt[p][c])nxt[p][c]=++tot;
    			p=nxt[p][c];
    		}
    		val[p]+=v;
    	}
    	inline void build(){
    		queue<int> q;
    		for(int i=0;i<26;i++)if(nxt[0][i])q.push(nxt[0][i]);
    		while(!q.empty()){
    			int u=q.front();q.pop();
    			val[u]+=val[fail[u]];
    			for(int i=0;i<26;i++){
    				int v=nxt[u][i];
    				if(v)fail[v]=nxt[fail[u]][i],q.push(v);
    				else nxt[u][i]=nxt[fail[u]][i];
    			}
    		}
    		for(int i=0;i<=tot;i++){
    			for(int c=0;c<26;c++){
    				int v=nxt[i][c];
    				chemx(bas.a[i][v],(ll)val[v]);
    			}
    		}
    	}
    }
    ll n;
    int m,a[N];
    char s[N];
    int main(){
    	cin>>n;
    	m=read();
    	for(int i=1;i<=m;i++){
    		a[i]=read();
    	}
    	for(int i=1;i<=m;i++){
    		scanf("%s",s+1);
    		Ac::insert(s,a[i]);
    	}
    	Ac::build();
    	n--;res=bas;
    	for(;n;n>>=1,bas=bas*bas)if(n&1)res=res*bas;
    	ll ans=0;
    	for(int i=0;i<=tot;i++)chemx(ans,res.a[0][i]);
    	cout<<ans;
    }
    

    T3:

    裸的线段树建图做差分约束

    不知道为什么topsorttopsort跑出来就对了spfaspfa就错了

    #include<bits/stdc++.h>
    using namespace std;
    const int RLEN=1<<20|1;
    inline char gc(){
        static char ibuf[RLEN],*ib,*ob;
        (ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
        return (ob==ib)?EOF:*ib++;
    }
    #define gc getchar
    inline int read(){
        char ch=gc();
        int res=0,f=1;
        while(!isdigit(ch))f^=ch=='-',ch=gc();
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
        return f?res:-res;
    }
    #define ll long long
    #define re register
    #define pii pair<int,int>
    #define pic pair<int,char>
    #define fi first
    #define se second
    #define pb push_back
    #define cs const
    #define bg begin
    #define poly vector<int>
    template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
    template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
    cs int N=1000005;
    vector<pii> e[N];
    int n,m,tot,pos[N],in[N];
    inline void addedge(int u,int v,int  w){
    	e[u].pb(pii(v,w));in[v]++;
    }
    namespace Seg{
    	int tr[N<<2];
    	#define lc (u<<1)
    	#define rc ((u<<1)|1)
    	#define mid ((l+r)>>1)
    	void build(int u,int l,int r){
    		tr[u]=++tot;
    		if(l==r){pos[l]=tr[u];return;}
    		build(lc,l,mid),build(rc,mid+1,r);
    		addedge(tr[lc],tr[u],0),addedge(tr[rc],tr[u],0);
    	}
    	void update(int u,int l,int r,int st,int des,int p){
    		if(st>des)return;
    		if(st<=l&&r<=des)return addedge(tr[u],p,0);
    		if(st<=mid)update(lc,l,mid,st,des,p);
    		if(mid<des)update(rc,mid+1,r,st,des,p);
    	}
    }
    int a[N],str,dis[N],vis[N];
    int s,p[N],d[N],ms[N];
    queue<int> q;
    inline void topsort(){
    	for(int i=1;i<=tot;i++)if(!in[i])q.push(i);
    	while(!q.empty()){
    		int u=q.front();q.pop();vis[u]=1;
    		for(int i=0;i<e[u].size();i++){
    			pii x=e[u][i];
    			in[x.fi]--;
    			chemx(dis[x.fi],dis[u]+x.se);
    			if(!in[x.fi])q.push(x.fi);
    		}
    	}
    }
    int main(){
    	n=read(),s=read(),m=read();
    	Seg::build(1,1,n);
    	str=++tot;
    	for(int i=1;i<=s;i++){
    		p[i]=read(),d[i]=read();
    		dis[pos[p[i]]]=d[i];
    	}
    	for(int i=1;i<=m;i++){
    		int l=read(),r=read(),k=read();
    		tot++;a[0]=l-1,a[k+1]=r+1;
    		for(int j=1;j<=k;j++)
    		a[j]=read(),addedge(tot,pos[a[j]],1);
    		for(int j=1;j<=k+1;j++)
    		Seg::update(1,1,n,a[j-1]+1,a[j]-1,tot);
    	}
    	for(int i=1;i<=tot;i++)if(i!=str)addedge(str,i,1);
    	topsort();
    	for(int i=1;i<=n;i++)if(dis[pos[i]]>1e9)puts("Impossible"),exit(0);
    	for(int i=1;i<=s;i++){
    		if(dis[pos[p[i]]]!=d[i])puts("Impossible"),exit(0);
    	}
    	puts("Possible");
    	for(int i=1;i<=n;i++)cout<<dis[pos[i]]<<" ";
    }
    

    总结:

    犯了一堆sbsb错误
    没注意空间
    调试技巧太烂
    不会写代码了

    再出类似的问题剁头

  • 相关阅读:
    学习windows的半天+学习Git分布式系统的半天
    输出从1加到100的结果、打印100以内的质数、计算一个文件中的每个英文单词出现的次数
    Linux操作系统--初级--进程管理的命令
    Linux操作系统--初级--防火墙
    Linux操作系统--初级--dns服务
    Linux操作系统--初级--网络安全基础
    Linux操作系统--初级--进程管理
    Linux操作系统--初级--Linux网络
    Linux操作系统--初级--Linux磁盘管理
    Linux操作系统--初级--Linux的用户与用户组(权限管理)
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/12328399.html
Copyright © 2020-2023  润新知