2021.11.30 eleveni的水省选题的记录

因为eleveni比较菜,eleveni决定先刷图论,再刷数据结构,同时每天都要刷dp。当然,对于擅长的图论,eleveni决定从蓝题开始刷。当然,eleveni的神秘好友崇青云会监督eleveni刷题。

图论:

[P1772 ZJOI2006]物流运输 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;

//#define int long long
const int N=410;
int n,m,k,e,dis[N],vis[N],dp[N][N],mapi[N][N],no[N];
typedef long long ll;
ll f[N];
int cnt,head[N];
struct node{
	int to,next,val;
}a[N*2];
struct nodei{
	int pos,dis;
	bool operator <(const nodei &b)const{
		return dis>b.dis;
	}
};

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void add(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt; 
}
inline void dijkstra(){
	memset(dis,0x3f3f3f3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[1]=0;
	priority_queue<nodei>q;
	q.push({1,0});
	while(!q.empty()){
		nodei tmp=q.top();q.pop();
		int x=tmp.pos;
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(no[v])continue;
			if(dis[v]>dis[x]+a[i].val){
				dis[v]=dis[x]+a[i].val;
				if(!vis[v])q.push({v,dis[v]});
			}
		}
	}
}

signed main(){
	n=read();m=read();k=read();e=read();
	//cout<<n<<" "<<m<<" "<<k<<" "<<e<<endl;
	for(int i=1;i<=e;i++){
		int u,v,w;
		u=read();v=read();w=read();
		add(u,v,w);add(v,u,w);
		//cout<<u<<" "<<v<<" "<<w<<endl;//
	}
	int d;d=read();
	for(int i=1;i<=d;i++){
		int t,x,y;
		t=read();x=read();y=read();
		for(int j=x;j<=y;j++)mapi[j][t]=1;
	}
	/*for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)cout<<mapi[i][j]<<" ";
		cout<<endl;//
	}
	cout<<endl;//*/
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++){
		memset(no,0,sizeof(no));
		for(int ii=i;ii<=j;ii++)
		for(int ji=1;ji<=m;ji++)
		if(mapi[ii][ji])no[ji]=1;
		dijkstra();
		dp[i][j]=dis[m];
	}
	/*for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cout<<dp[i][j]<<" ";
		cout<<endl;//
	}
	cout<<endl;//*/
	memset(f,0x7f,sizeof(f));
	//cout<<f[1]<<endl;//
	for(int i=1;i<=n;i++){
		f[i]=1ll*dp[1][i]*i;
		for(int j=i-1;j>=0;j--)
		f[i]=min(f[i],f[j]+1ll*dp[j+1][i]*(i-j)+k);
	}
	cout<<f[n];
	return 0;
}

[P1841 JSOI2007]重要的城市 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=210;
int n,m,f[N][N],dis[N][N],mapi[N][N];
int ans;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	n=read();m=read();
	memset(dis,0x3f3f3f3f,sizeof(dis));
	memset(mapi,0x3f3f3f3f,sizeof(mapi));
	for(int i=1;i<=m;i++){
		int u,v,w;
		u=read();v=read();w=read();
		mapi[u][v]=dis[u][v]=f[u][v]=w;
		mapi[v][u]=dis[v][u]=f[v][u]=w;
	}
	for(int i=1;i<=n;i++)mapi[i][i]=dis[i][i]=0;
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
	}
	/*cout<<"mapi"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cout<<mapi[i][j]<<" ";
		cout<<endl;
	}
	cout<<"dis"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cout<<dis[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;*/
	for(int h=1;h<=n;h++){
		//memset(f,0x3f3f3f3f,sizeof(f));
		memcpy(f,mapi,sizeof(mapi));
		for(int i=1;i<=n;i++)f[i][h]=f[h][i]=0x3f3f3f3f;
		for(int k=1;k<=n;k++)if(k!=h)
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
		int flag=0;
		for(int i=1;i<=n;i++)if(i!=h)
		for(int j=1;j<=n;j++)if(j!=h)
		if(f[i][j]>dis[i][j]||f[i][j]==f[0][0])flag=1;
		if(flag==1)cout<<h<<" ";
		ans+=flag;
		/*cout<<"h "<<h<<endl;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)cout<<f[i][j]<<" ";
			cout<<endl;
		}
		cout<<endl;*/
	}
	if(!ans)cout<<"No important cities.";
	//else cout<<ans;
	return 0;
}

https://www.luogu.com.cn/problem/P4578

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;

#define int long long
const int N=1010;
int t,n,m,k;
int cnt,head[N*2],vis[N*2],dis[N*2],cnti[N*2];
struct node{
	int to,next,val;
}a[N*N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void add(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline bool spfa(int s){
	queue<int>q;
	memset(dis,0x3f3f3f3f,sizeof(dis));
	dis[s]=0;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		if(cnti[x]>n+m)return false;
		++cnti[x];
		vis[x]=0;
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(dis[v]>dis[x]+a[i].val){
				dis[v]=dis[x]+a[i].val;
				if(!vis[v])q.push(v),vis[v]=1;
			}
		}
	}
	return true;
}

signed main(){
	t=read();
	while(t--){
		cnt=0;
		memset(head,0,sizeof(head));
		memset(vis,0,sizeof(vis));
		memset(cnti,0,sizeof(cnti));
		n=read();m=read();k=read();
		for(int i=1;i<=k;i++){
			int u,v,w;
			u=read();v=read()+n;w=read();
			add(u,v,w);
			add(v,u,-w);
		}
		int start=n+m+1;
		for(int i=1;i<=n+m;i++)add(start,i,0);
		if(spfa(start))puts("Yes");
		else puts("No");
	}
	return 0;
}

https://www.luogu.com.cn/problem/P2792

//只要买了就能享受优惠价
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=55;
const int inf=2e9;
int n,m,k,root,num[N],id[N],vis[N],pre[N],true_id[N];
double minn[N],price[N],ans,val[N];
struct node{
	int from,to;
	double val;
}a[N*N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline double zhuLiu(){
	while(true){
		for(int i=1;i<=n;i++)val[i]=inf;
		for(int i=1;i<=m;i++){
			int u=a[i].from,v=a[i].to;
			if(u!=v&&val[v]>a[i].val)val[v]=a[i].val,pre[v]=u;
		}
		for(int i=1;i<=n;i++)if(i!=root&&val[i]==inf)return -1;
		int cnt=0;
		for(int i=1;i<=n;i++)id[i]=vis[i]=0;
		for(int i=1;i<=n;i++){
			if(i==root)continue;
			ans+=val[i];
			int v=i;
			while(vis[v]!=i&&!id[v]&&v!=root)vis[v]=i,v=pre[v];
			if(!id[v]&&v!=root){
				id[v]=++cnt;
				for(int u=pre[v];u!=v;u=pre[u])id[u]=cnt;
			}
		}
		if(cnt==0)break;
		for(int i=1;i<=n;i++)if(!id[i])id[i]=++cnt;
		for(int i=1;i<=m;i++){
			int u=a[i].from,v=a[i].to;
			a[i].from=id[u];a[i].to=id[v];
			if(a[i].from!=a[i].to)a[i].val-=val[v];
		}
		n=cnt;
		root=id[root];
	}
	return ans;
} 

int main(){
	n=read();
	int top=1;
	root=1;
	for(int i=1;i<=n;i++){
		minn[i]=inf;
		cin>>price[i];
		num[i]=read();
		if(!num[i])continue;
		true_id[i]=++top;
		minn[i]=min(minn[i],price[i]);
		a[++m]={1,top,price[i]};
	}
	k=read();
	for(int i=1;i<=k;i++){
		int u,v;
		double w;
		u=read();v=read();cin>>w;
		if(!true_id[u]||!true_id[v])continue;
		minn[v]=min(minn[v],w);
		a[++m]={true_id[u],true_id[v],w};
	}
	for(int i=1;i<=n;i++)if(num[i]>1)ans+=(num[i]-1)*minn[i];
	n=top;
	printf("%.2lf",zhuLiu());
	return 0;
}

https://www.luogu.com.cn/problem/P3171

悲催的eleveni写挂了的网络流!为毛只有90分???

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;

#define int long long
const int N=2010;
const int M=2e5+10;
const int inf=2e18;
int n,m,start,endi;
int cnt=1,head[N],dep[N],cur[N];
int cnti,headi[N],vis[N],dis[N];
struct node{
	int to,next,val;
}e[M],a[M];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void addi(int u,int v,int w){
	++cnti;
	e[cnti].to=v;
	e[cnti].val=w;
	e[cnti].next=headi[u];
	headi[u]=cnti;
}
inline void spfa(int s){
	queue<int>q;
	for(int i=1;i<=n;i++)dis[i]=inf;
	dis[s]=0;vis[s]=1;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		vis[x]=0;
		for(int i=headi[x];i;i=e[i].next){
			int v=e[i].to;
			if(dis[v]>dis[x]+e[i].val){
				dis[v]=dis[x]+e[i].val;
				if(!vis[v])vis[v]=1,q.push(v);
			}
		}
	}
}
inline void addii(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline void add(int u,int v,int w){
	addii(u,v,w);addii(v,u,w);
}
inline int bfs(int s,int t){
	queue<int>q;
	memset(dep,0,sizeof(dep));
	memcpy(cur,head,sizeof(head));
	dep[s]=1;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(!dep[v]&&a[i].val)dep[v]=dep[x]+1,q.push(v);
		}
	}
	return dep[t];
}
inline int dfs(int x,int t,int f){
	if(x==t)return f;
	int ans=0;
	for(int i=cur[x];i&&f>ans;i=a[i].next){
		cur[x]=i;
		int v=a[i].to;
		int fi=0;
		if(dep[v]==dep[x]+1&&a[i].val&&(fi=dfs(v,t,min(f-ans,a[i].val)))>0)
		a[i].val-=fi,a[i^1].val+=fi,ans+=fi;
	}
	return ans;
}
inline int Dinic(int s,int t){
	int flow=0;
	while(bfs(s,t)){
		int x=0;
		if((x=dfs(s,t,inf))>0)flow+=x;
	}
	return flow;
}

signed main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int u,v,w;
		u=read();v=read();w=read();
		addi(u,v,w);addi(v,u,w);
	}
	spfa(1);
	for(int i=1;i<=n;i++)
	for(int j=headi[i];j;j=e[j].next){
		int v=e[j].to;
		if(dis[v]==dis[i]+e[j].val)add(i+n,v,inf);
	}
	start=n*2+1,endi=n*2+2;
	add(start,1,inf);add(n*2,endi,inf);
	for(int i=1;i<=n;i++){
		int x=read();
		if(i==1||i==n)add(i,i+n,inf);
		else add(i,i+n,x);
	}
	cout<<Dinic(start,endi);
	return 0;
}

别人的满分代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int NR=1005+10;
const int MR=3e5+10;
const int INF=1e18;
void Min(int& x,int y){x=min(x,y);}
void Max(int& x,int y){x=max(x,y);}
int n,m;
int a[NR];
int to[MR*5],nxt[MR*5],val[MR*5];
int head[NR<<1];
int tot=1;
void add(int x,int y,int z)
{
	to[tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot++;
}
int s[MR],t[MR],v[MR];
bool vis[NR];
int dis[NR];
void spfa()
{
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;vis[1]=1;queue<int>q;q.push(1);
	while(!q.empty())
	{
		int x=q.front();q.pop();vis[x]=0;
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			if(dis[y]>dis[x]+val[i])
			{
				dis[y]=dis[x]+val[i];
				if(!vis[y])vis[y]=1,q.push(y);
			}
		}
	}
}
int S,T;
int dep[NR<<1];
int now[NR<<1];
bool bfs()
{
	memcpy(now,head,sizeof(now));
	memset(dep,0,sizeof(dep));
	queue<int>q;q.push(S);dep[S]=1;
	while(!q.empty())
	{
		int x=q.front();q.pop();
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];if(!val[i]||dep[y])continue;
			dep[y]=dep[x]+1;q.push(y);if(y==T)return 1;
		}
	}return 0;
}
int dinic(int x,int flow)
{
	if(x==T)return flow;int mxflow=0;
	for(int i=head[x];i;i=nxt[i])
	{
		if(flow==mxflow)return flow;
		int y=to[i];now[x]=i;
		if(!val[i]||dep[y]!=dep[x]+1)continue;
		int num=dinic(y,min(val[i],flow-mxflow));
		mxflow+=num;val[i]-=num,val[i*2-(i^1)]+=num;
	}
	return mxflow;
}
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read(),z=read();
		s[i]=x,t[i]=y;v[i]=z;add(x,y,z),add(y,x,z);
	}spfa();
	memset(head,0,sizeof(head));tot=1;
	for(int i=1;i<=m;i++)
	{
		if(dis[t[i]]==dis[s[i]]+v[i])add(s[i]+n,t[i],INF),add(t[i],s[i]+n,0);
		if(dis[s[i]]==dis[t[i]]+v[i])add(t[i]+n,s[i],INF),add(s[i],t[i]+n,0);
	}
	for(int i=1;i<=n;i++)a[i]=read();S=1,T=n*2;
	add(1,n+1,INF),add(n+1,1,0);add(n,n*2,INF),add(n*2,n,0);
	for(int i=2;i<n;i++)add(i,i+n,a[i]),add(i+n,i,0);
	int ans=0;while(bfs())ans+=dinic(S,INF);printf("%lld\n",ans);
	return 0;
}

https://www.luogu.com.cn/problem/P2472

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;

const int N=10000;
const int inf=(1<<30);
int n,m,maxn,top,h[25][25],true_id[25][25];
int start,endi,cnt=1,head[N],dep[N],cur[N];
struct node{
	int to,next,val;
}a[N*2];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void addi(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline void add(int u,int v,int w){
	addi(u,v,w);addi(v,u,0);
}
inline int bfs(int s,int t){
	memset(dep,0,sizeof(dep));
	memcpy(cur,head,sizeof(head));
	queue<int>q;
	dep[s]=1;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(!dep[v]&&a[i].val)dep[v]=dep[x]+1,q.push(v);
		}
	}
	return dep[t];
}
inline int dfs(int x,int t,int f){
	if(x==t)return f;
	int ans=0;
	for(int i=cur[x];i&&f>ans;i=a[i].next){
		cur[x]=i;
		int v=a[i].to,fi=0;
		if(a[i].val&&dep[v]==dep[x]+1&&(fi=dfs(v,t,min(f-ans,a[i].val)))>0)
		a[i].val-=fi,a[i^1].val+=fi,ans+=fi;
	}
	return ans;
}
inline int Dinic(int s,int t){
	int flow=0;
	while(bfs(s,t)){
		int x=0;
		if((x=dfs(s,t,inf))>0)flow+=x;
	}
	return flow;
}

int main(){
	n=read();m=read();maxn=read();
	for(int i=1;i<=n;i++){
		string s;cin>>s;
		for(int j=1;j<=m;j++){
			h[i][j]=s[j-1]-'0';
			if(h[i][j])true_id[i][j]=++top;
		}
	}
	/*cout<<"h"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)cout<<h[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
	cout<<"true_id"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)cout<<true_id[i][j]<<" ";
		cout<<endl;
	}*/
	start=top*2+1,endi=top*2+2;
	int tot=0;
	//cout<<"top "<<top<<" start "<<start<<" endi "<<endi<<endl;//
	for(int i=1;i<=n;i++){
		string s;cin>>s;
		for(int j=1;j<=m;j++){
			if(s[j-1]=='L'&&h[i][j])
			add(start,true_id[i][j],1),++tot;
			if(h[i][j])
			add(true_id[i][j],true_id[i][j]+top,h[i][j]);
			if(h[i][j]&&(i-maxn<=0||(n-i+1)<=maxn||j-maxn<=0||(m-j+1)<=maxn))
			add(true_id[i][j]+top,endi,inf);//,cout<<"Case 1 "<<true_id[i][j]<<endl;
		}
	}
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(h[i][j]){
		for(int k=1;k<=n;k++)for(int l=1;l<=m;l++)if(!(k==i&&l==j))
		if(h[k][l]&&(i-k)*(i-k)+(j-l)*(j-l)<=maxn*maxn)
		add(true_id[i][j]+top,true_id[k][l],inf);//,cout<<true_id[i][j]<<" "<<true_id[k][l]<<endl;
	}
	cout<<tot-Dinic(start,endi);
	return 0;
}

https://www.luogu.com.cn/problem/P3324

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;

#define int long long
const int N=210;
const int inf=(1<<30);
int n,m,A[N],B[N],attack[N][N];
int start,endi,sum;
int cnt=1,head[N],cur[N],dep[N];
struct node{
	int to,next,val;
}a[N*N*10];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void addi(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline void add(int u,int v,int w){
	//cout<<"    Case 3 "<<u<<" "<<v<<" "<<w<<endl;
	addi(u,v,w);addi(v,u,0);
}
inline int bfs(int s,int t){
	memset(dep,0,sizeof(dep));
	memcpy(cur,head,sizeof(head));
	queue<int>q;
	dep[s]=1;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(!dep[v]&&a[i].val)dep[v]=dep[x]+1,q.push(v);
		}
	}
	return dep[t];
}
inline int dfs(int x,int t,int f){
	if(x==t)return f;
	int ans=0;
	for(int i=cur[x];i&&f>ans;i=a[i].next){
		cur[x]=i;
		int v=a[i].to,fi=0;
		if(a[i].val&&dep[v]==dep[x]+1&&(fi=dfs(v,t,min(f-ans,a[i].val)))>0)
		a[i].val-=fi,a[i^1].val+=fi,ans+=fi;
	}
	return ans;
}
inline int Dinic(int s,int t){
	int flow=0;
	while(bfs(s,t)){
		//cout<<"    Case 2"<<endl;// 
		int x=0;
		if((x=dfs(s,t,inf<<1))>0)flow+=x;//,cout<<x<<endl;
	}
	return flow;
}
inline int check(int timei){
	for(int i=1;i<=m;i++)B[i]*=timei;
	memset(head,0,sizeof(head));
	cnt=1;
	for(int i=1;i<=n;i++)add(i+m,endi,A[i]);
	for(int i=1;i<=m;i++)add(start,i,B[i]);
	for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)if(attack[i][j])add(i,j+m,inf);//,cout<<i<<" "<<j<<endl;
	//cout<<"Case 1"<<endl;//
	int now=Dinic(start,endi);
	//cout<<now<<endl;//
	int ans=(now>=sum);
	for(int i=1;i<=m;i++)B[i]/=timei;
	return ans;
}

signed main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)A[i]=read()*10000,sum+=A[i];//,cout<<A[i]<<" ";cout<<endl;
	for(int i=1;i<=m;i++)B[i]=read();//,cout<<B[i]<<" ";cout<<endl;//
	for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)attack[i][j]=read();
	start=n+m+1;endi=n+m+2;
	int L=0,R=1e9+10,mid,ans=0;
	while(L<R){
		mid=(L+R)>>1;
		//cout<<mid<<endl;
		if(check(mid))R=mid,ans=mid;
		else L=mid+1;
	}
	printf("%.6lf",(double)ans/10000);
	return 0;
}

https://www.luogu.com.cn/problem/P4001

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;

const int N=1e6+10;
const int inf=(1<<30);
int n,m;
int cnt=1,head[N],dep[N],cur[N];
struct node{
	int to,next,val;
}a[N*6];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void addi(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline void add(int u,int v,int w){
	addi(u,v,w);addi(v,u,w);
}
inline int bfs(int s,int t){
	memset(dep,0,sizeof(dep));
	memcpy(cur,head,sizeof(head));
	queue<int>q;
	dep[s]=1;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(!dep[v]&&a[i].val)dep[v]=dep[x]+1,q.push(v);
		}
	}
	return dep[t];
}
inline int dfs(int x,int t,int f){
	if(x==t)return f;
	int ans=0;
	for(int i=cur[x];i&&f>ans;i=a[i].next){
		cur[x]=i;
		int v=a[i].to,fi=0;
		if(a[i].val&&dep[v]==dep[x]+1&&(fi=dfs(v,t,min(f-ans,a[i].val)))>0)
		a[i].val-=fi,a[i^1].val+=fi,ans+=fi;
	}
	return ans;
}
inline int Dinic(int s,int t){
	int flow=0;
	while(bfs(s,t)){
		int x=0;
		if((x=dfs(s,t,inf))>0)flow+=x;
	}
	return flow;
}
inline int id(int x,int y){
	return (x-1)*m+y;
}

int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)for(int j=1;j<m;j++){
		int x=read();
		add(id(i,j),id(i,j+1),x);
	}
	for(int i=1;i<n;i++)for(int j=1;j<=m;j++){
		int x=read();
		add(id(i,j),id(i+1,j),x);
	}
	for(int i=1;i<n;i++)for(int j=1;j<m;j++){
		int x=read();
		add(id(i,j),id(i+1,j+1),x);
	}
	cout<<Dinic(1,n*m);
	return 0;
}

https://www.luogu.com.cn/problem/P5043

树哈希

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

#define int long long
const int N=1001;
int n,m,ans[N][N];
int cnt,head[N];
struct node{
	int to,next;
}a[N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void add(int u,int v){
	++cnt;
	a[cnt].to=v;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline int Hash(int x,int f){
	int q[N],top=0,now=N;
	memset(q,0,sizeof(q));
	for(int i=head[x];i;i=a[i].next){
		int v=a[i].to;
		if(v==f)continue;
		q[++top]=Hash(v,x);
	}
	sort(q+1,q+top+1);
	for(int i=1;i<=top;i++)now=now*2333+q[i];
	return now*2333+N+1;
}

signed main(){
	m=read();
	for(int i=1;i<=m;i++){
		n=read();
		memset(head,0,sizeof(head));
		cnt=0;
		for(int j=1;j<=n;j++){
			int x=read();
			if(x)add(x,j),add(j,x);
		}
		for(int j=1;j<=n;j++)ans[i][j]=Hash(j,0);
		sort(ans[i]+1,ans[i]+n+1);
		for(int j=1,k=0;j<=i;j++){
			while(k<=n)if(ans[i][++k]!=ans[j][k])break;
			if(k>n){
				cout<<j<<endl;
				break;
			}
		}
	}
	/*for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++)cout<<ans[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;*/
	return 0;
}

动态规划:

https://www.luogu.com.cn/problem/P2327

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1e4+10;
int n,num[N],f[N][2][2];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	n=read();
	for(int i=1;i<=n;i++)num[i]=read();
	f[0][0][0]=f[0][0][1]=1;
	for(int i=1;i<=n;i++){
		if(num[i]==0)f[i][0][0]+=f[i-1][0][0];
		else if(num[i]==1){
			f[i][0][0]+=f[i-1][1][0];
			f[i][1][0]+=f[i-1][0][1];
			f[i][0][1]+=f[i-1][0][0];
		}else if(num[i]==2){
			f[i][1][0]+=f[i-1][1][1];
			f[i][0][1]+=f[i-1][1][0];
			f[i][1][1]+=f[i-1][0][1];
		}else if(num[i]==3)f[i][1][1]+=f[i-1][1][1];
	}
	cout<<f[n][0][0]+f[n][1][0];
	return 0;
}

https://www.luogu.com.cn/problem/P5414

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=110;
int t,n,a[N],f[N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	t=read();
	while(t--){
		memset(f,0,sizeof(f));
		n=read();
		for(int i=1;i<=n;i++)a[i]=read();
		for(int i=1;i<=n;i++){
			for(int j=1;j<i;j++)if(a[j]<=a[i])f[i]=max(f[i],f[j]);
			f[i]+=a[i];
		}
		int maxn=0,tot=0;
		for(int i=1;i<=n;i++)tot+=a[i],maxn=max(maxn,f[i]);
		cout<<tot-maxn<<endl;
	}
	return 0;
}

https://www.luogu.com.cn/problem/P2513

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1010;
const int mod=1e4;
int n,k,f[N][N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	n=read();k=read();
	f[1][0]=1;
	for(int i=2;i<=n;i++){
		int sum=0;
		for(int j=0;j<=k;j++){
			sum+=f[i-1][j];sum%=mod;
			f[i][j]=sum;
			if(j-i+1>=0)sum-=f[i-1][j-i+1],sum=(sum%mod+mod)%mod;
		}
	}
	cout<<f[n][k];
	return 0;
}

数论:

除法分块

https://www.luogu.com.cn/problem/P2261

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

#define int long long
int n,k,ans;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

signed main(){
	n=read();k=read();
	ans=1ll*n*k;
	n=min(n,k);
	for(int L=1,R=0;L<=n;L=R+1){
		R=min(n,k/(k/L));
		ans-=1ll*(k/L)*(L+R)*(R-L+1)/2;
	}
	cout<<ans;
	return 0;
}

基础算法:

https://www.luogu.com.cn/problem/P2434

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=5e4+10;
int n;
struct node{
	int from,to;
	bool operator <(const node &b)const{
		return from<b.from;
	}
}a[N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	n=read();
	for(int i=1;i<=n;i++)cin>>a[i].from>>a[i].to;
	sort(a+1,a+n+1);
	a[n+1].from=1000010;
	int L=a[1].from,R=a[1].to;
	for(int i=2;i<=n+1;i++){
		if(a[i].from<=R)R=max(R,a[i].to);
		else{
			cout<<L<<" "<<R<<endl;
			L=a[i].from;R=a[i].to;
		}
	}
	return 0;
}

https://www.luogu.com.cn/problem/P3252

这是道搜索题,鬼知道为啥标签是动态规划

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1e6+10;
int n,s,sum[N],num[N],val[N];
int cnt,head[N],ans;
struct node{
	int to,next;
}a[N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
inline void add(int u,int v){
	++cnt;
	a[cnt].to=v;
	a[cnt].next=head[u];
	head[u]=cnt;
}
inline void dfs(int x,int fa){
	sum[x]=sum[fa]+val[x];
	if(sum[x]>=s&&num[sum[x]-s]>0)++ans;
	++num[sum[x]];
	for(int i=head[x];i;i=a[i].next){
		int v=a[i].to;
		dfs(v,x);
	}
	--num[sum[x]];
}

int main(){
	n=read();s=read();
	num[0]=1;
	for(int i=1;i<=n;i++)val[i]=read();
	for(int i=1;i<n;i++){
		int u,v;
		u=read();v=read();
		add(u,v);
	}	
	dfs(1,0);
	cout<<ans;
	return 0;
}
 posted on 2021-12-05 14:43  eleveni  阅读(52)  评论(0)    收藏  举报