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\) 分是可以轻松拿到的.
式子一抄就能切,大部分打表就能出规律,但是不好打,先这样.

浙公网安备 33010602011771号