Loading

noip模拟71

A. 签到题

签到题,一眼切,但是不会证明.

好像用网络流证.

A_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll long long
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll res=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
		return cit?res:-res;
	}
} using namespace BSS;

#define fre(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
const ll N=1e6+21;

ll m,n,s,t,ans;
ll d[3][N];
signed main(){
	fre(qiandao.in,qiandao.out);
	n=read(),m=read(),s=read(),t=read(); ll u,v;
	for(int i=1;i<=s;i++) {
		u=read(),v=read(),d[1][u]++,d[2][v]++;
	}
	for(int i=1;i<=n;i++) ans+=(d[1][i]%t>0);
	for(int i=1;i<=m;i++) ans+=(d[2][i]%t>0);
	printf("%lld\n",ans),exit(0);
}

B. M 弟娃

签到题,树剖 + 倍增 + 线段树乱写就行.

B_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll int 
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	auto read=[]()->ll{
		ll res=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
		return cit?res:-res;
	};
} using namespace BSS;

#define fre(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
#define ls (x<<1)
#define rs (x<<1|1)
const ll N=3e5+21;

ll n,m,ts,ans,cnt,ops,lg2;
ll head[N],dep[N],dfn[N],siz[N],rk[N],hson[N],top[N],fa[N][21];
struct I { ll u,v,nxt; } e[N<<1];
struct II { ll w,lzy; } tr[N<<2];
auto add=[](ll u,ll v)->void{
	e[++ts].u=u,e[ts].v=v,e[ts].nxt=head[u];
	head[u]=ts;
};
void dfs1(ll u,ll dad){
	dep[u]=dep[dad]+1,siz[u]=1,fa[u][0]=dad;
	for(int i=1;i<=lg2;i++){
		fa[u][i]=fa[fa[u][i-1]][i-1];
		if(!fa[u][i]) break;
	}
	for(int i=head[u];i;i=e[i].nxt){
		if(e[i].v==dad) continue;
		dfs1(e[i].v,u),siz[u]+=siz[e[i].v];
		if(siz[hson[u]]<siz[e[i].v]){	
			hson[u]=e[i].v;
		}
	}
}
void dfs2(ll u,ll Top){
	top[u]=Top,dfn[u]=++cnt,rk[cnt]=u;
	if(!hson[u]) return ; 
	dfs2(hson[u],Top);
	for(int i=head[u];i;i=e[i].nxt){
		if(e[i].v==fa[u][0] or e[i].v==hson[u]) continue;
		dfs2(e[i].v,e[i].v);
	}
}
auto getval=[](ll x,ll w)->void { tr[x].w+=w,tr[x].lzy+=w; };
auto pushup=[](ll x)-> void { ; };
auto spread=[](ll x,ll l,ll r)->void{
	ll &lzy=tr[x].lzy;
	getval(ls,lzy),getval(rs,lzy),lzy=0;
};
void update(ll x,ll l,ll r,ll ql,ll qr,ll w){
	if(ql>qr) return ;
	if(l>=ql and r<=qr) return getval(x,w),void();
	ll mid=(l+r)>>1; if(tr[x].lzy) spread(x,l,r);
	if(ql<=mid) update(ls,l,mid,ql,qr,w);
	if(qr>mid) update(rs,mid+1,r,ql,qr,w);
	tr[x].w=(tr[ls].w>tr[rs].w ? tr[ls].w : tr[rs].w);
}
signed main(){
	fre(magic.in,magic.out);
	n=read(),ops=read(),lg2=log2(n)+1; ll u,v,x,L;
	for(int i=2;i<=n;i++){
		u=read(),v=read(),add(u,v),add(v,u);
	}
	dfs1(1,0),dfs2(1,1);
	while(ops--){
		u=read(),v=read();
		if(dfn[u]<=dfn[v] and dfn[u]+siz[u]>dfn[v]){
			x=v;
			for(int i=lg2;i>=0;i--) if(dep[fa[x][i]]>dep[u]) x=fa[x][i];
			update(1,1,n,1,n,1),update(1,1,n,dfn[x],dfn[x]+siz[x]-1,-1);
			update(1,1,n,dfn[v],dfn[v]+siz[v]-1,1);
		}
		else if(dfn[v]<=dfn[u] and dfn[v]+siz[v]>dfn[u]){
			swap(u,v),x=v;
			for(int i=lg2;i>=0;i--) if(dep[fa[x][i]]>dep[u]) x=fa[x][i];
			update(1,1,n,1,n,1),update(1,1,n,dfn[x],dfn[x]+siz[x]-1,-1);
			update(1,1,n,dfn[v],dfn[v]+siz[v]-1,1);
		}
		else{
			update(1,1,n,dfn[u],dfn[u]+siz[u]-1,1);
			update(1,1,n,dfn[v],dfn[v]+siz[v]-1,1);
		}
		printf("%d\n",tr[1].w);
	}
	exit(0);
}

C. 变异大老鼠

签到题,裸的树上背包.

C_code
#include<bits/stdc++.h>
using namespace std;
namespace BSS {
	#define ll int 
	#define ull unsigned ll
	#define lf double
	#define lbt(x) (x&(-x))
	#define mp(x,y) make_pair(x,y)
	#define lb lower_bound 
	#define ub upper_bound
	#define Fill(x,y) memset(x,y,sizeof x)
	#define Copy(x,y) memcpy(x,y,sizeof x)
	#define File(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
	inline ll read() {
		ll res=0; bool cit=1; char ch;
		while(!isdigit(ch=getchar())) if(ch=='-') cit=0; 
		while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
		return cit?res:-res;
	}
} using namespace BSS;

#define fre(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
const ll N=305,M=3e4+21;

lf ans;
ll m,n,r,ts;
ll head[N],lst[N],dis[N],cu[N],ru[N],vis[N];
lf re[N][N],f[N][N],g[N][N];
struct I { ll u,v,w,nxt; } e[M<<1];
vector<I> vec;
inline void add(ll u,ll v,ll w){
	e[++ts].u=u,e[ts].v=v,e[ts].w=w;
	e[ts].nxt=head[u],head[u]=ts;
}
queue<ll> que;
void bfs(){
	Fill(dis,0x3f); ll u,v;
	que.push(1),vis[1]=1,dis[1]=0;
	while(que.size()){
		u=que.front(),que.pop();
		for(int i=head[u];i;i=e[i].nxt){
			if(dis[e[i].v]>dis[u]+e[i].w){
				lst[e[i].v]=i,dis[e[i].v]=dis[u]+e[i].w;
				if(!vis[e[i].v]) que.push(e[i].v);
				vis[e[i].v]=1;
			}
		}
		vis[u]=0;
	}
}
lf dfs(ll u,ll lft){
	if(f[u][lft]!=-1) return f[u][lft];
	if(!cu[u]) return f[u][lft]=re[u][lft];
	if(not vis[u]){
		for(ll i=0;i<=r;i++) g[u][i]=0; vis[u]=1;
		for(ll i=head[u];i;i=e[i].nxt){
			for(ll j=r;j>=0;j--){
				// if(g[u][j]!=-1) break;
				for(ll k=0;k<=j;k++)
					g[u][j]=max(g[u][j],g[u][j-k]+dfs(e[i].v,k));
			}
		}
	}
	for(ll i=0;i<=lft;i++)
		f[u][lft]=max(f[u][lft],re[u][i]+(1.0-re[u][i])*g[u][lft-i]/((lf)cu[u]));
	return f[u][lft];
}
signed main(){
	fre(arrest.in,arrest.out);
	n=read(),m=read(),r=read(); ll u,v,w;
	for(int i=1;i<=m;i++){
		u=read(),v=read(),w=read();
		add(u,v,w),add(v,u,w);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=r;j++) 
			scanf("%lf",&re[i][j]);
	}
	bfs(); Fill(head,0),ts=0;
	for(int i=2;i<=n;i++) vec.push_back(e[lst[i]]);
	for(auto i : vec) add(i.u,i.v,0),cu[i.u]++,ru[i.v]++;
	for(ll i=1;i<=n;i++){
		for(ll j=0;j<=r;j++) f[i][j]=-1.0,g[i][j]=-1.0;
		vis[i]=0;
	}
	printf("%.6lf\n",dfs(1,r)),exit(0);
}

D. 朝鲜时蔬

证明确实难以证完,现在没时间整这玩意,以后估计也懒.

基本上 \(60\) 分是考场上有能力就拿到的,\(50\) 分是可以轻松拿到的.

式子一抄就能切,大部分打表就能出规律,但是不好打,先这样.

posted @ 2021-10-09 21:22  AaMuXiiiiii  阅读(33)  评论(0)    收藏  举报