##周总结## 19.7.15~19.7.21

周总结 19.7.15~19.7.21 本周BZOJ 9题

目标周过题量为21,daily3!
今日是周总结开始的日子,希望能坚持下去。
周总结我其实很早之前就有打算,cx老师也多次劝我,但是一直缺少一个决心,有时候也不知道每天要写些什么。 借写题的机会,正好可以顺便总结,等一年后,回首观之,希望能惊艳到自己吧。

坑: bzoj3039

今天开始周总结。

下午校内训练 AC 2 (内部题目) 晚上补 1 模板题
晚上补了 CF 1187 F 期望题 我没有特判len[0]=1 1187完结!
打算开始进军BZOJ

###跟着黄学长的脚步###

BZOJ 1601 最小生成树

/*
  user: sky48
  language: c++
  for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 100005
#define M 305
typedef long long ll;
using namespace std;
int n,ans,top,a[M],a1,t1,t2,fa[M];
struct node {
	int a,b,v;
}s[N];
int gets()
{
	int v=0; char ch;bool f=0;
	while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
	while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
	return f?-v:v;
}
bool cmp(const node &x,const node &y){
	return x.v<y.v;
}
int getfa(int x){
	return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
int main ()
{
	n=gets();
	rep(i,1,n) 
		a[i]=gets(), s[++top].a=0, s[top].b=i, s[top].v=a[i], fa[i]=i;
	rep(i,1,n) rep(j,1,n){
		a1=gets();
		if(i<j) s[++top].a=i, s[top].b=j, s[top].v=a1;
	}
	sort(1+s,1+s+top,cmp);
	rep(i,1,top){
		t1=getfa(s[i].a), t2=getfa(s[i].b);
		if(t1==t2) continue;
		ans+=s[i].v; fa[t1]=t2;
	}
	cout<<ans<<endl; 
	return 0;
}

BZOJ 1303 中位数套路题

/*
  user: sky48
  language: c++
  for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 100005
typedef long long ll;
using namespace std;
int n,m,a1,a[N],s[N*2],ans,flag,sum;
int gets()
{
	int v=0; char ch;bool f=0;
	while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
	while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
	return f?-v:v;
}
int main ()
{
	n=gets(); m=gets();
	rep(i,1,n){
		a1=gets();
		if(a1>m) a[i]=1;
		if(a1<m) a[i]=-1;
		if(a1==m) a[i]=0;
	}
	s[n]++; 
	rep(i,1,n){
		if(!a[i]) flag=1; 
		sum+=a[i];
		if(flag) ans+=s[sum+n];
		if(!flag) s[sum+n]++; 
//		cout<
	}
	cout<<ans<<endl; 
	 
	return 0;
}

CF 1186 F - Vus the Cossack and a Graph

想到构造回路以后,感觉好像很水。结果一直被卡T,后面看了别人的博客,加了一些优化才卡进时间。据说本题用随机更快
1186 完结

/*
  user: sky48
  language: c++
  for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 2000005
typedef long long ll;
using namespace std;
int tot=1,to[N*2],head[N],net[N*2],tic,q[N*2],top,n,m,a1,a2;
int du[N],flag[N],num,v[N*2],clc[N];
struct node {
	int a,b;
}ans[N*2];
inline int gets()
{
	int v=0; char ch;bool f=0;
	while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
	while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
	return f?-v:v;
}
inline void ins(int frm,int to2){
	to[++tot]=to2, net[tot]=head[frm], head[frm]=tot;
	to[++tot]=frm, net[tot]=head[to2], head[to2]=tot;
}
inline void dfs(int x){
	clc[x]++;  int tim=clc[x]; //别人博客的优化
	flag[x]=1; 
	for(int t=head[x];t;t=net[t]) if(!v[t]) {
		head[x]=net[t];        //别人博客的优化
		v[t]=v[t^1]=1;
		dfs(to[t]); 
		if(clc[x]>tim)break;   //别人博客的优化
	}
	q[++top]=x;
}
int main ()
{
	n=gets(), m=gets();
	rep(i,1,m) a1=gets(), a2=gets(), ins(a1,a2), du[a1]++, du[a2]++;
	rep(i,1,n)
		if(du[i]&1) ins(0,i);
	int t;
	rep(i,1,n){
		if(flag[i]) continue; 
		top=0;
		dfs(i);
		for(int j=1;j+1<=top;j+=2)
			if(q[j]&&q[j+1]) //shi bian 
				ans[++num].a=q[j], ans[num].b=q[j+1];
		for(int j=2;j+1<=top;j+=2){
			t=j+2;
			if(j+1==top) t=2;
			if(!(q[j-1]&&q[j]&&q[j+1]&&q[t])&&q[j]&&q[j+1])
				ans[++num].a=q[j], ans[num].b=q[j+1];
			
		}//cout<
		
	}
	printf("%d\n",num);
	rep(i,1,num) 
		cout<<ans[i].a<<" "<<ans[i].b<<endl; 
	return 0;
}

极度烦躁

今天校内训练只写了两题。3人ak,人均3+
我B题想复杂了,使用单调队列调了2h,结果后面的水题都没有时间写 虽然也是假题
感觉后两天如果一不小心,明年大家就见不到我了。。/ll

BZOJ 1191 匈牙利算法模板

/*
  user: sky48
  language: c++
  for dream for young
*/
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define N 10005
typedef long long ll;
using namespace std;
int to[N*2],head[N],net[N*2],tot,flag[N],f[N],n,m,a1,a2,ans;
int gets()
{
	int v=0; char ch;bool f=0;
	while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
	while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
	return f?-v:v;
}
void ins(int frm,int to2){
	to[++tot]=to2, net[tot]=head[frm], head[frm]=tot;
//	to[++tot]=frm, net[tot]=head[to2], head[to2]=tot;
}
int fin(int x){
	for(int t=head[x];t;t=net[t]) if(!flag[to[t]]){
		flag[to[t]]=1; 
		if(!f[to[t]]||fin(f[to[t]])){ f[to[t]]=x; return 1;} 
	}
	return 0;
}
int main ()
{
	n=gets(); m=gets();
	rep(i,1,m){
		a1=gets()+1, a2=gets()+1; 
		ins(i,a1); if(a1!=a2) ins(i,a2);
	}
	rep(i,1,n) f[i]=0;
	rep(i,1,m){
		rep(j,1,n) flag[j]=0;
		if(fin(i)) ans++;
		else break;
	}
	cout<<ans<<endl;
	return 0;
}

BZOJ 1059 匈牙利算法模板

校内训练

CF 102220 - The 13th Chinese Northeast Collegiate Programming Contest

坑:

A D F I

BZOJ 4205 建图有新意Good

把每个点拆开连向一排新的点。

BZOJ 2756 二分加dinic

校内训练

cf 102263 - ArabellaCPC 2019

E

K Smart Strategies GREAT

斜线DP 考虑答案就是把所有弄成一棵树,树上的叶子个数。那就考虑什么时候叶子个数会+1,那就是这一条斜线上i点和i左下角的那个点的方向不一样,所以我们考虑,如果i是右,i左下角是下,那么叶子个数+1 。然后DP就由左下角转移即可。 代码是借鉴他人的,这么简洁的代码真是优秀呀。

/*
  user: sky48
  language: c++
  for dream for young
*/
#include<iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define mod 1000000007
#define N 105
#define M 10005
typedef long long ll;
using namespace std;
int n,m,lim,t,f[2][M][3],x,y;
int gets()
{
	int v=0; char ch;bool f=0;
	while(!isdigit(ch=getchar())) if(ch=='-') f=1; v=ch-48;
	while( isdigit(ch=getchar())) v=(v<<1)+(v<<3)+ch-48;
	return f?-v:v;
}
int add(int x,int y){
	if(x+y>mod) return x+y-mod;
	return x+y;
}
int main ()
{
//	freopen("tt.txt","r",stdin);
	n=gets(); m=gets(); lim=gets();
	if(lim>5000){ puts("0"); return 0;}
	f[0][1][0]=1;
	for(int o=n+m-1;o>=2;o--){
		if(o<=n) x=o-1, y=1; 
		else x=n, y=o-n;
		
		for(int now=0;x>=1&&y<=m;x--,y++,now++){
			
			t^=1;
			rep(k,1,lim){
				if(now==0){
					f[t][k][0]=add(f[t^1][k][0],f[t^1][k][1]);
					f[t][k][1]=add(f[t^1][k][0],f[t^1][k][1]);
				}
				else {
					f[t][k][0]=add(f[t^1][k][0],f[t^1][k][1]);
					f[t][k][1]=add(f[t^1][k-1][0],f[t^1][k][1]);
				}
				if(x==n) f[t][k][1]=0;
				if(y==m) f[t][k][0]=0;
//				cout<
			}
		}
		
	}
	cout<<add(f[t][lim][0],f[t][lim][1])<<endl; 
	
	return 0;
}

BZOJ4514 最大费用最大流 (学习) 未AC

二分图新的分法:该题和质因数有关,将质因数为奇数的放一侧,将质因数为偶数的放一侧。

BZOJ1934 water 网络流

校内训练

SYSU-10 (Dhaka 2010)

坑:D G H I J

你可能感兴趣的:(周总结)