zoukankan      html  css  js  c++  java
  • Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)

    https://files.cnblogs.com/files/Winniechen/usaco2012-2013.pdf

    做的不是很好,还请见谅!

    如果有什么疑问,可以QQ上找我。

    QQ号:1967199892

    附上代码:

    BZOJ3010: [Usaco2012 Dec]Gangs of Istanbull

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    #define N 105
    void Update(int& gang,int& cows,int come)
    {
    	if(!cows)gang=come;
    	if(gang==come)cows++;
    	else cows--;
    }
    int n,m;vector<int > v;
    int max_cow(int gang,int cows,vector <int>v)
    {
    	sort(v.begin()+1,v.end());
    	while(v.back()>0)
    	{
    		for(int i=v.size()-1;i;i--)
    		{
    			Update(gang,cows,i);
    			v[i]--;
    			if(v[i-1]<=v[i])break;
    		}
    	}
    	for(int i=0;i<v[0];i++)Update(gang,cows,0);
    	return gang==0?cows:0;
    }
    int main()
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=0;i<m;i++)
    	{
    		int x;
    		scanf("%d",&x);
    		v.push_back(x);
    	}
    	int gang=0,cow=0,ret=max_cow(gang,cow,v);
    	if(ret>0)
    	{
    		printf("YES
    %d
    ",ret);
    		for(int i=0;i<n;i++)
    		{
    			int pre_gang=gang,pre_cow=cow;
    			for(int j=0;;j++)
    			{
    				if(!v[j])continue;
    				v[j]--;
    				Update(gang,cow,j);
    				if(max_cow(gang,cow,v)==ret){printf("%d
    ",j+1);break;}
    				v[j]++;
    				gang=pre_gang;cow=pre_cow;
    			}
    		}
    	}else
    	{
    		printf("NO
    ");
    	}
    	return 0;
    }

    BZOJ3011: [Usaco2012 Dec]Running Away From the Barn

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    #define N 200005
    #define ll long long
    struct node
    {
    	int dis,ls,rs;
    	ll x;
    }mp[N];
    struct no
    {
    	int to,next;
    	ll val;
    }e[N];
    int head[N],cnt;
    void add(int x,int y,ll z)
    {
    	e[cnt].to=y;
    	e[cnt].val=z;
    	e[cnt].next=head[x];
    	head[x]=cnt++;
    	return ;
    }
    int fa[N],n,siz[N];
    ll dep[N],L;
    int merge(int x,int y)
    {
    	if(!x)return y;
    	if(!y)return x;
    	if(mp[x].x<mp[y].x)swap(x,y);
    	mp[x].rs=merge(mp[x].rs,y);
    	if(mp[mp[x].rs].dis>mp[mp[x].ls].dis)swap(mp[x].ls,mp[x].rs);
    	mp[x].dis=mp[mp[x].rs].dis+1;
    	return x;
    }
    int find(int x)
    {
    	if(x==fa[x])return x;
    	return fa[x]=find(fa[x]);
    }
    void dfs(int x,int from)
    {
    	siz[x]=1;
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(to1!=from)
    		{
    			mp[to1].x=dep[to1]=dep[x]+e[i].val;
    			dfs(to1,x);
    			siz[x]+=siz[to1];
    			int fx=find(x),fy=find(to1);
    			fa[fx]=fa[fy]=merge(fx,fy);
    		}
    	}
    	int fx=find(x);
    	while(mp[fx].x>L+dep[x])
    	{
    		fa[fx]=fa[mp[fx].ls]=fa[mp[fx].rs]=merge(mp[fx].ls,mp[fx].rs);
    		siz[x]--;
    		fx=find(x);
    	}
    	return ;
    }
    int main()
    {
    	fa[1]=1;
    	memset(head,-1,sizeof(head));
    	scanf("%d%lld",&n,&L);
    	for(int i=2;i<=n;i++)
    	{
    		fa[i]=i;
    		int x;
    		ll y;
    		scanf("%d%lld",&x,&y);
    		add(x,i,y);
    	}
    	dfs(1,0);
    	for(int i=1;i<=n;i++)
    	{
    		printf("%d
    ",siz[i]);
    	}
    	return 0;
    }

    BZOJ3012: [Usaco2012 Dec]First!

    #include <cstdio>
    #include <algorithm>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <set>
    #include <vector>
    using namespace std;
    #define N 30005
    struct node
    {
    	int son[27],flag;
    }a[N*10];
    struct no
    {
    	int to,next;
    }e[N];
    int head[30],cnt,ans[N],in1[N],tot=1,n;
    char s[N][305];
    void add(int x,int y)
    {
    	e[cnt].to=y;
    	e[cnt].next=head[x];
    	head[x]=cnt++;
    	in1[y]++;
    }
    void insert(int x)
    {
    	int rt=1;
    	int len=strlen(s[x]);
    	for(int i=0;i<len;i++)
    	{
    		int idx=s[x][i]-'a'+1;
    		if(!a[rt].son[idx])a[rt].son[idx]=++tot;
    		rt=a[rt].son[idx];
    	}
    	a[rt].flag=1;
    }
    bool tsort()
    {
    	queue <int>q;
    	for(int i=1;i<=26;i++)if(!in1[i])q.push(i);
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		for(int i=head[x];i!=-1;i=e[i].next)
    		{
    			int to1=e[i].to;
    			in1[to1]--;
    			if(!in1[to1])q.push(to1);
    		}
    	}
    	for(int i=1;i<=26;i++)if(in1[i])return 0;
    	return 1;
    }
    bool check(int x)
    {
    	int rt=1;
    	int len=strlen(s[x]);
    	for(int i=0;i<len;i++)
    	{
    		if(a[rt].flag)return 0;
    		int idx=s[x][i]-'a'+1;
    		for(int j=1;j<=26;j++)
    		{
    			if(j!=idx&&a[rt].son[j])add(idx,j);
    		}
    		rt=a[rt].son[idx];
    	}
    	return tsort();
    }
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%s",&s[i]);
    		insert(i);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		memset(head,-1,sizeof(head));
    		memset(in1,0,sizeof(in1));cnt=0;
    		if(!check(i))continue;
    		ans[++ans[0]]=i;
    	}
    	printf("%d
    ",ans[0]);
    	for(int i=1;i<=ans[0];i++)
    	{
    		printf("%s
    ",s[ans[i]]);
    	}
    	return 0;
    }

    BZOJ3013: [Usaco2012 Nov]Balanced Cow Breeds

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    #define N 1005
    #define mod 2012
    int f[N*2],n,sum;
    char s[N];
    int main()
    {
    	scanf("%s",s+1);n=strlen(s+1);sum=f[1]=1;
    	for(int i=1;i<=n&&sum>0;i++)
    	{
    		int x=0;
    		if(s[i]=='(')x=1;else x=-1;
    		sum+=x;
    		if(x==-1)
    		{
    			for(int j=1;j<=sum;j++)
    			{
    				f[j]=(f[j-x]+f[j])%mod;
    			}
    		}else
    		{
    			for(int j=sum;j>=1;j--)
    			{
    				f[j]=(f[j-x]+f[j])%mod;
    			}
    		}
    		f[sum+1]=0;
    	}
    	if(sum!=1)
    	{
    		puts("0");return 0;
    	}
    	printf("%d
    ",f[1]);
    	return 0;
    }

    BZOJ3014: [Usaco2012 Nov]Balanced Trees

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <iostream>
    using namespace std;
    #define N 40005
    struct node
    {
    	int to,next;
    }e[N<<1];
    int head[N],cnt,vis[N],n,ans,f[N],mf[N],g[N],mg[N];
    int a[N],siz[N],mx[N],rot,sn,maxx;
    void add(int x,int y)
    {
    	e[cnt].to=y;
    	e[cnt].next=head[x];
    	head[x]=cnt++;
    }
    void get_root(int x,int from)
    {
    	siz[x]=1,mx[x]=0;
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(to1!=from&&!vis[to1])
    		{
    			get_root(to1,x);
    			siz[x]+=siz[to1];
    			mx[x]=max(mx[x],siz[to1]);
    		}
    	}
    	mx[x]=max(sn-siz[x],mx[x]);
    	if(mx[x]<mx[rot])rot=x;
    }
    void get_left(int x,int from,int now,int last,int sum)
    {
    	siz[x]=1;
    	if(now||a[x]==-1)now-=a[x];else last++;sum=max(sum,now-last);
    	if(!now)f[last]=1,mf[last]=max(mf[last],sum),maxx=max(last,maxx);
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(to1!=from&&!vis[to1])
    		{
    			siz[x]+=siz[to1];
    			get_left(to1,x,now,last,sum);
    		}
    	}
    }
    void get_right(int x,int from,int now,int last,int sum)
    {
    	siz[x]=1;
    	if(now||a[x]==1)now+=a[x];else last++;sum=max(sum,now-last);
    	if(!now)g[last]=1,mg[last]=max(mg[last],sum),maxx=max(last,maxx);
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(to1!=from&&!vis[to1])
    		{
    			siz[x]+=siz[to1];
    			get_right(to1,x,now,last,sum);
    		}
    	}
    }
    int tms[N];
    void calc(int x)
    {
    	int v=0,maxn=0,tot=0;
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		f[0]=1,mf[0]=0;
    		maxx=0;tms[++tot]=i;
    		int to1=e[i].to;
    		if(!vis[to1])
    		{
    			get_left(to1,x,0,0,0);
    			for(int k=0;k<=maxx;k++)ans=max(ans,g[k]*f[k]*max(mf[k]+k,mg[k]+k));
    			for(int k=1;k<=maxx;k++)f[k]=0,mf[k]=0;
    			maxx=0;
    			get_right(to1,x,a[x]==1,a[x]==-1,a[x]==1),maxn=max(maxx,maxn);ans=max(ans,mg[0]);
    			if(a[x]==-1)g[1]=1,mg[1]=max(mg[1],1),maxx=max(maxx,1);
    		}
    	}
    	for(int i=0;i<=maxn;i++)g[i]=0,mg[i]=0;maxn=0;
    	for(int j=tot;j;j--)
    	{
    		int i=tms[j],to1=e[i].to;f[0]=1,mf[0]=0;maxx=0;
    		if(!vis[to1])
    		{
    			get_left(to1,x,0,0,0);
    			for(int k=0;k<=maxx;k++)ans=max(ans,g[k]*f[k]*max(mf[k]+k,mg[k]+k));
    			for(int k=1;k<=maxx;k++)f[k]=0,mf[k]=0;
    			maxx=0;
    			get_right(to1,x,a[x]==1,a[x]==-1,a[x]==1),maxn=max(maxx,maxn);ans=max(ans,mg[0]);
    			if(a[x]==-1)g[1]=1,mg[1]=max(mg[1],1),maxx=max(maxx,1);
    		}
    	}
    	for(int i=0;i<=maxn;i++)g[i]=0,mg[i]=0;maxn=0;
    }
    void dfs(int x)
    {
    	//printf("%d
    ",x);
    	//printf("%d
    ",ans);
    	vis[x]=1;calc(x);
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(!vis[to1])
    		{
    			rot=0,sn=siz[to1];
    			get_root(to1,x);
    			dfs(rot);
    		}
    	}
    }
    char s[2];
    int main()
    {
    	scanf("%d",&n);memset(head,-1,sizeof(head));
    	for(int i=2;i<=n;i++)
    	{
    		int x;
    		scanf("%d",&x);
    		add(x,i);add(i,x);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%s",s);
    		if(s[0]=='(')a[i]=1;
    		else a[i]=-1;
    	}
    	mx[0]=1<<30;sn=n;rot=0;get_root(1,0);dfs(rot);
    	printf("%d
    ",ans);
    }

    BZOJ3015: [Usaco2012 Nov]Concurrently Balanced Strings

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <map>
    #include <iostream>
    using namespace std;
    #define N 50005
    int a[10][N],n,k,ans,R[10][N<<1];char s[N];
    map<vector<int> ,pair<int ,int > >mp;
    int main()
    {
    	scanf("%d%d",&k,&n);
    	for(int i=0;i<k;i++)
    	{
    		scanf("%s",s);
    		for(int j=0;j<n;j++)
    		{
    			if(s[j]=='(')a[i][j]=1;
    			else a[i][j]=-1;
    		}
    	}
    	vector<int>L(k,n);
    	for(int i=0;i<k;i++)
    	{
    		for(int j=0;j<=2*n;j++)
    		{
    			R[i][j]=n;
    		}
    		R[i][n]=0;
    	}
    	mp[L]=make_pair(0,1);
    	for(int i=0;i<n;i++)
    	{
    		int left=0;
    		for(int j=0;j<k;j++)
    		{
    			if(a[j][i]==1)R[j][++L[j]]=i+1;
    			else L[j]--,R[j][L[j]]=min(R[j][L[j]],i+1);
    			left=max(left,R[j][L[j]]);
    		}
    		if(left==n)continue;
    		pair<int ,int >&tmp=mp[L];
    		if(tmp.first==left)ans+=tmp.second++;
    		else tmp=make_pair(left,1);
    	}
    	printf("%d
    ",ans);
    	return 0;
    }

    BZOJ3048: [Usaco2013 Jan]Cow Lineup

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <iostream>
    using namespace std;
    #define N 100005
    struct node
    {
    	int x,rnk,idx;
    }a[N];
    int n,k,num[N],ans,tot;
    bool cmp(const node &a,const node &b){return a.x<b.x;}
    bool cmp1(const node &a,const node &b){return a.idx<b.idx;}
    int main()
    {
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;i++){scanf("%d",&a[i].x);a[i].idx=i;}sort(a+1,a+n+1,cmp);
    	int cnt=0;for(int i=1;i<=n;i++){if(a[i].x!=a[i-1].x)cnt++;a[i].rnk=cnt;}sort(a+1,a+n+1,cmp1);
    	int r=1,l=1;while(tot<=k+1&&r<=n){tot+=(!num[a[r].rnk]);num[a[r].rnk]++;ans=max(ans,num[a[r].rnk]);r++;}
    	for(int i=r;i<=n;i++)
    	{
    		tot+=(!num[a[i].rnk]);num[a[i].rnk]++;
    		while(tot>k+1)
    		{
    			num[a[l].rnk]--;
    			if(!num[a[l].rnk])tot--;
    			l++;
    		}
    		ans=max(num[a[i].rnk],ans);
    	}
    	printf("%d
    ",ans);
    }

    BZOJ3049: [Usaco2013 Jan]Island Travels

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <iostream>
    using namespace std;
    #define N 55
    #define M 1<<15
    #define p(i,j) ((i-1)*c+j)
    int f[16][M],map[N][N],dis[N*N],vis[N*N],n,r,c,head[N*N],cnt,idx[N];
    struct node{int to,next,val;}e[N*N*10];
    void add(int x,int y,int z){e[cnt].to=y;e[cnt].next=head[x];e[cnt].val=z;head[x]=cnt++;}
    priority_queue <pair<int ,int > >q;
    void Dijkstra(int S)
    {
    	memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));
    	while(!q.empty())q.pop();q.push(make_pair(0,S));dis[S]=0;
    	while(!q.empty())
    	{
    		int x=q.top().second;q.pop();
    		if(vis[x])continue;
    		vis[x]=1;
    		for(int i=head[x];i!=-1;i=e[i].next)
    		{
    			int to1=e[i].to;
    			if(dis[to1]>dis[x]+e[i].val)
    			{
    				dis[to1]=dis[x]+e[i].val;
    				q.push(make_pair(-dis[to1],to1));
    			}
    		}
    	}
    	return ;
    }
    char s[N][N];int dx[4]={0,1,-1,0},dy[4]={1,0,0,-1};
    void dfs(int x,int y,int cnt)
    {
    	for(int i=0;i<4;++i)
    	{
    		int xx=x+dx[i];
    		int yy=y+dy[i];
    		if(xx<1||xx>r||yy<1||yy>c||s[xx][yy]!='X'||map[xx][yy])continue;
    		map[xx][yy]=cnt;
    		dfs(xx,yy,cnt);
    	}
    }
    int main()
    {
    	memset(head,-1,sizeof(head));
    	scanf("%d%d",&r,&c);
    	for(int i=1;i<=r;i++)
    	{
    		scanf("%s",s[i]+1);
    	}
    	for(int i=1;i<=r;i++)
    	{
    		for(int j=1;j<=c;j++)
    		{
    			if(s[i][j]=='X')
    			{
    				if(!map[i][j])map[i][j]=++n,idx[n]=p(i,j),dfs(i,j,n);
    			}
    			else if(s[i][j]=='S')map[i][j]=0;
    			else map[i][j]=-1;
    		}
    	}
    	for(int i=1;i<=r;i++)
    	{
    		for(int j=1;j<=c;j++)
    		{
    			if(map[i][j]==-1)continue;
    			if(j!=c&&map[i][j+1]!=-1)add(p(i,j),p(i,j+1),!map[i][j+1]),add(p(i,j+1),p(i,j),!map[i][j]);
    			if(i!=r&&map[i+1][j]!=-1)add(p(i,j),p(i+1,j),!map[i+1][j]),add(p(i+1,j),p(i,j),!map[i][j]);
    		}
    	}
    	memset(map,0x3f,sizeof(map));memset(f,0x3f,sizeof(f));
    	for(int i=1;i<=n;i++)
    	{
    		f[i][1<<(i-1)]=0;Dijkstra(idx[i]);
    		for(int j=1;j<=n;j++)
    		{
    			map[i][j]=dis[idx[j]];
    		}
    	}
    	for(int S=1;S<(1<<n);S++)
    	{
    		for(int i=1;i<=n;i++)
    		{
    			if(!(S&(1<<i-1)))continue;
    			for(int j=1;j<=n;j++)
    			{
    				if(!(S&(1<<j-1)))continue;
    				int s=S^(1<<i-1);
    				f[i][S]=min(f[j][s]+map[j][i],f[i][S]);
    			}
    		}
    	}
    	int ans=1<<30;
    	for(int i=1;i<=n;i++)ans=min(ans,f[i][(1<<n)-1]);
    	printf("%d
    ",ans);
    	return 0;
    }

    BZOJ3050: [Usaco2013 Jan]Seating

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <iostream>
    #include <queue>
    #include <algorithm>
    using namespace std;
    #define N 500005
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    int sum[N<<2],lsum[N<<2],rsum[N<<2],cover[N<<2];
    int n,Q;
    void PushUp(int m,int rt)
    {
        lsum[rt]=lsum[rt<<1];
        rsum[rt]=rsum[rt<<1|1];
        if(lsum[rt]==(m-(m>>1)))lsum[rt]+=lsum[rt<<1|1];
        if(rsum[rt]==(m>>1))rsum[rt]+=rsum[rt<<1];
        sum[rt]=max(max(sum[rt<<1],sum[rt<<1|1]),lsum[rt<<1|1]+rsum[rt<<1]);
        return ;
    }
    void PushDown(int l,int rt)
    {
        if(cover[rt]!=-1)
        {
            cover[rt<<1]=cover[rt<<1|1]=cover[rt];
            rsum[rt<<1]=lsum[rt<<1]=sum[rt<<1]=cover[rt]*(l-(l>>1));
            rsum[rt<<1|1]=lsum[rt<<1|1]=sum[rt<<1|1]=cover[rt]*(l>>1);
            cover[rt]=-1;
        }
        return ;
    }
    void build(int l,int r,int rt)
    {
        cover[rt]=-1;
        if(l==r)
        {
            rsum[rt]=lsum[rt]=sum[rt]=1;
            return ;
        }
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        PushUp(r-l+1,rt);
        return ;
    }
    void Update(int L,int R,int c,int l,int r,int rt)
    {
        if(L<=l&&r<=R)
        {
            rsum[rt]=c*(r-l+1);
            lsum[rt]=c*(r-l+1);
            sum[rt]=c*(r-l+1);
            cover[rt]=c;
            return ;
        }
        PushDown(r-l+1,rt);
        int m=(l+r)>>1;
        if(m>=L)Update(L,R,c,lson);
        if(m<R)Update(L,R,c,rson);
        PushUp(r-l+1,rt);
        return ;
    }
    int query(int x,int l,int r,int rt)
    {
        if(l==r)return l;
        PushDown(r-l+1,rt);
        int m=(l+r)>>1;
        if(sum[rt<<1]>=x)
        {
            return query(x,lson);
        }else if(lsum[rt<<1|1]+rsum[rt<<1]>=x)
        {
            return m-rsum[rt<<1]+1;
        }else
        {
            return query(x,rson);
        }
    }
    int read()
    {
    	int x=0;
    	char c=getchar();
    	while(c<'0'||c>'9')c=getchar();
    	while('0'<=c&&c<='9')
    	{
    		x=(x<<3)+(x<<1)+(c-'0');
    		c=getchar();
    	}
    	return x;
    }
    char s[10];
    int main()
    {
        n=read(),Q=read();
        build(1,n,1);
        int ans=0;
        while(Q--)
        {
            int x,y;
            scanf("%s",s);
            x=read();
            if(s[0]=='A')
            {
                if(sum[1]<x)
                {
                    ans++;
                }else
                {
                    int p=query(x,1,n,1);
                    Update(p,p+x-1,0,1,n,1);
                }
            }else
            {
                y=read();
                Update(x,y,1,1,n,1);
            }
        }
        printf("%d
    ",ans);
        return 0;
    }

    BZOJ3062: [Usaco2013 Feb]Taxi

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <iostream>
    using namespace std;
    #define N 100005
    int a[N],b[N],n,m;long long ans;
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d%d",&a[i],&b[i]);ans+=abs(b[i]-a[i]);
    	}
    	a[n+1]=m,b[n+1]=0;
    	sort(a+1,a+n+2);sort(b+1,b+n+2);
    	for(int i=1;i<=n+1;i++)ans+=abs(b[i]-a[i]);
    	printf("%lld
    ",ans);
    	return 0;
    }

    BZOJ3063: [Usaco2013]Route Designing

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <queue>
    using namespace std;
    #define N 100005
    #define ll long long
    struct node
    {
    	int x,y;
    	friend bool operator<(const node &a,const node &b)
    	{
    		if(a.x==b.x)return a.y<b.y;
    		return a.x<b.x;
    	}
    }e[N];
    ll f[N],g[N],a[N],b[N];
    int n,m,r;
    int main()
    {
    	scanf("%d%d%d",&n,&m,&r);
    	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),f[i]=a[i];
    	for(int i=1;i<=m;i++)scanf("%lld",&b[i]),g[i]=b[i];
    	for(int i=1;i<=r;i++)scanf("%d%d",&e[i].x,&e[i].y);
    	sort(e+1,e+r+1);
    	for(int i=1;i<=r;i++)
    	{
    		int x=e[i].x,y=e[i].y;
    		ll t=f[x];
    		f[x]=max(g[y]+a[x],f[x]);
    		g[y]=max(t+b[y],g[y]);
    	}
    	ll ans=0;
    	for(int i=1;i<=n;i++)ans=max(ans,f[i]);
    	for(int i=1;i<=m;i++)ans=max(ans,g[i]);
    	printf("%lld
    ",ans);
    }

    BZOJ3074: [Usaco2013 Mar]The Cow Run

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <iostream>
    #include <set>
    using namespace std;
    #define N 1005
    long long f[N][N],g[N][N];
    int n,a[N];
    int main()
    {
    	memset(f,0x3f,sizeof(f));memset(g,0x3f,sizeof(g));
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    	sort(a+1,a+n+1);
    	int p=lower_bound(a+1,a+n+1,0)-a;
    	if(p!=1)f[p-1][1]=g[p-1][1]=1ll*n*(0-a[p-1]);
    	if(a[p]>=0)f[p][1]=g[p][1]=1ll*n*(a[p]-0);
    	for(int i=2;i<=n;i++)
    	{
    		for(int j=1;j<=n-i+1;j++)
    		{
    			int k=i+j-1;
    			f[j][i]=min(f[j+1][i-1]+(n-i+1)*(a[j+1]-a[j]),g[j+1][i-1]+(n-i+1)*(a[k]-a[j]));
    			g[j][i]=min(f[j][i-1]+(a[k]-a[j])*(n-i+1),g[j][i-1]+(a[k]-a[k-1])*(n-i+1));
    		}
    	}
    	printf("%lld
    ",min(f[1][n],g[1][n]));
    	return 0;
    }

    BZOJ3075: [Usaco2013]Necklace

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <queue>
    using namespace std;
    #define N 10005
    char str[N],sub[N];
    int nxt[N],f[N][1005],n,m;
    void get_next()
    {
    	int j=0;nxt[1]=0;
    	for(int i=2;i<=m;i++)
    	{
    		while(sub[j+1]!=sub[i]&&j)j=nxt[j];
    		nxt[i]=(sub[j+1]==sub[i])?++j:0;
    	}
    }
    int main()
    {
    	memset(f,0x3f,sizeof(f));
    	scanf("%s%s",str+1,sub+1);n=strlen(str+1),m=strlen(sub+1);get_next();
    	f[0][0]=0;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<m;j++)if(f[i-1][j]!=0x3f3f3f3f)
    		{
    			f[i][j]=min(f[i][j],f[i-1][j]+1);
    			int k=j;
    			while(k&&str[i]!=sub[k+1])k=nxt[k];
    			if(sub[k+1]==str[i])k++;
    			f[i][k]=min(f[i][k],f[i-1][j]);
    		}
    	}
    	int ans=1<<30;
    	for(int i=0;i<m;i++)ans=min(ans,f[n][i]);
    	printf("%d
    ",ans);
    }

    BZOJ3126: [Usaco2013 Open]Photo

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <iostream>
    using namespace std;
    #define N 200005
    int l1[N],r1[N],n,m,f[N],q[N];
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n+1;i++)r1[i]=i-1;
    	for(int i=1;i<=m;i++)
    	{
    		int x,y;
    		scanf("%d%d",&x,&y);
    		l1[y+1]=max(x,l1[y+1]);r1[y]=min(x-1,r1[y]);
    	}
    	for(int i=n;i>=1;i--)r1[i]=min(r1[i+1],r1[i]);
    	for(int i=2;i<=n+1;i++)l1[i]=max(l1[i],l1[i-1]);
    	int h=0,t=0,j=1;
    	for(int i=1;i<=n+1;i++)
    	{
    		while(j<=r1[i]&&j<=n)
    		{
    			if(f[j]==-1){j++;continue;}
    			while(f[j]>f[q[t]]&&h<=t)t--;
    			q[++t]=j;j++;
    		}
    		while(l1[i]>q[h]&&h<=t)h++;
    		if(h<=t)f[i]=f[q[t]]+(i!=n+1);
    		else f[i]=-1;
    	}
    	printf("%d
    ",f[n+1]);
    	return 0;
    }

    BZOJ3127: [Usaco2013 Open]Yin and Yang

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    #define N 100005
    #define ll long long
    int siz[N],mx[N],head[N],cnt,tot,sn,rot,vis[N],n,len;
    struct node
    {
    	int to,next,val;
    }e[N<<1];
    ll ans,f[N][2],g[N][2];
    void add(int x,int y,int z)
    {
    	e[cnt].to=y;
    	e[cnt].val=z;
    	e[cnt].next=head[x];
    	head[x]=cnt++;
    }
    void get_root(int x,int from)
    {
    	siz[x]=1;mx[x]=0;
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(to1!=from&&!vis[to1])
    		{
    			get_root(to1,x);
    			siz[x]+=siz[to1];
    			mx[x]=max(mx[x],siz[to1]);
    		}
    	}
    	mx[x]=max(mx[x],sn-siz[x]);
    	if(mx[rot]>mx[x])rot=x;
    }
    void calc(int x,int from,int now,int cnt)
    {
    	if(now==0)
    	{
    		if(cnt>=2)ans++;
    		cnt++;
    	}
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(to1!=from&&!vis[to1])
    		{
    			calc(to1,x,now+e[i].val,cnt);
    		}
    	}
    }
    void get_dep(int x,int from,int now,int l,int r)
    {
    	if(l<=now&&now<=r)
    	{
    		if(now>=0)f[now][1]++;
    		else g[-now][1]++;
    	}else
    	{
    		if(now>=0)f[now][0]++;
    		else g[-now][0]++;
    	}
    	l=min(l,now);r=max(r,now);len=max(max(r,-l),len);
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(!vis[to1]&&to1!=from)
    		{
    			get_dep(to1,x,now+e[i].val,l,r);
    		}
    	}
    }
    void dfs(int x)
    {
    	vis[x]=1;calc(x,0,0,0);
    	get_dep(x,0,0,1,-1),ans+=f[0][1]*(f[0][1]-1)/2;f[0][0]=f[0][1]=0;
    	for(int i=1;i<=len;i++)ans+=f[i][0]*g[i][1]+g[i][0]*f[i][1]+f[i][1]*g[i][1],f[i][0]=f[i][1]=g[i][1]=g[i][0]=0;
    	for(int i=head[x];i!=-1;i=e[i].next)
    	{
    		int to1=e[i].to;
    		if(!vis[to1])
    		{
    			len=0;get_dep(to1,0,e[i].val,0,0);ans-=f[0][1]*(f[0][1]-1)/2;f[0][1]=f[0][0]=0;
    			for(int i=0;i<=len;i++)ans-=f[i][0]*g[i][1]+g[i][0]*f[i][1]+f[i][1]*g[i][1],f[i][0]=f[i][1]=g[i][1]=g[i][0]=0;
    			sn=siz[to1];
    			rot=0;get_root(to1,0);
    			dfs(rot);
    		}
    	}
    }
    int main()
    {
    	memset(head,-1,sizeof(head));
    	scanf("%d",&n);
    	for(int i=1;i<n;i++)
    	{
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		add(x,y,z*2-1);
    		add(y,x,z*2-1);
    	}
    	sn=n;mx[0]=n;
    	get_root(1,0);
    	dfs(rot);
    	printf("%lld
    ",ans);
    	return 0;
    }
    

      

  • 相关阅读:
    Java StringBuilder、基本类型的包装类
    立个Flag不学好PHP誓不罢休
    LAMP搭建 转
    CentOS使用yum源中自带的rpm包安装LAMP环境
    CentOS RedHat YUM 源扩展补充(32位、64位均有)
    解决phpmyadmin上传文件大小限制的配置方法
    lanmp v2.5一键安装包发布(包括lamp,lnmp,lnamp安装)
    图像处理 jpg png gif svg
    NAT模式/路由模式/全路由模式 (转)
    网页制作中绝对路径和相对路径的区别
  • 原文地址:https://www.cnblogs.com/Winniechen/p/9188049.html
Copyright © 2011-2022 走看看