CF453 Div1 簡單題解

2022-04-30 13:18:07 字數 4138 閱讀 9739

pro:給定m,n,表示乙個m面的骰子,甩n次,問出現的最大的數的期望。

sol:容斥,f(i)表示最大數<=i的期望,那麼最大數=x的期望就是f(x)-f(x-1);

#include#define rep(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

const

int maxn=200010

;double

dp[maxn];

double qpow(double a,intx)

return

res;

}int

main()

pro:給定陣列a,求乙個兩兩互質的b,使得abs(a-b)最小,輸出乙個方案。 n<=100,a<=30

sol:兩兩互質,表示之前出現的素因子不能出現,而我們發現》60不可能,因為差值會變很大。 所以我們記錄<=60的素數,然後狀壓dp,記錄一下**,最後倒回去輸出即可。

#include#define rep(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

const

int maxn=110

;const

int maxm=132000

;int

a[maxn],p[maxn],vis[maxn],tot,cnt;

intpre[maxn][maxm],now[maxn][maxm],dp[maxn][maxm],fac[maxn];

vector

g[maxm];

void dfs(int pos,int

now)

intmain()

}rep(i,

1,57

) }

}m=(1

<1

; rep(i,

0,m) rep(j,1,57

)

if(!(fac[j]&i)) g[i].push_back(j),cnt++;

scanf("%d

",&n);

rep(i,

1,n) scanf("

%d",&a[i]);

rep(i,

1,n)}}

}rep(i,

0,m) if(dp[n][i]i;

dfs(n,p);

return0;

}

pro:給定n點m邊的無向圖(不一定連通),然後給沒給點限制乙個0或1,表示經過點的奇偶,讓你找一條路徑,滿足路徑長度<=n*4,而且滿足奇偶要求。

sol:我們dfs,如果兒子的奇偶性未滿足,滿足我們再走一遍(fa->son->fa)即可,發現一定可以構造好。。。然後就是要求的奇數的點一定要連通。

#include#define rep(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

const

int maxn=2000010

;int

laxt[maxn],next[maxn],to[maxn],d[maxn],cnt;

int a[maxn],b[maxn],tot,vis[maxn],t[maxn],f=1

;void add(int u,int

v)void dfs(int u,int

f) }

}}int

main()

rep(i,

1,n) scanf("

%d",&d[i]);

rep(i,

1,n) if(d[i]==1) root=i;

if(root==-1) return puts("

0"),0;//

root=1;

dfs(root,0

); rep(i,

1,n) if(!vis[i]&&d[i]==1) f=0

;

if(!f) return puts("

-1"),0

;

if(t[root]!=d[root]) tot--;

printf(

"%d\n

",tot+1

); printf(

"%d

",root);

rep(i,

1,tot) printf("

%d "

,b[i]);

return0;

}

fwt,不會,佔位。

題意:n個馬,給定了開始的能量值s,以及能力上限m,以及單位時間的能力上公升值r。q次操作,每次給出[l,r],吸走這個區間的馬的能力和sum,求sum,馬的能力被吸走後變為0。

思路:想不到線段樹就可以做。。。。tql ,注意r可能為0,不要除0,免得re。

主要一點就是,區間更新,區間時間一樣了,我們就可以均攤複雜度了,即tag相同的區間利用預處理,不同的繼續下推。

我們先預處理,把每個節點按照達到上限的時間排序,然後得到字首和,用字首和來快速得到,這個區間給定時間差後的sum。

時間複雜度o(n(logn)^2),空間o(nlogn);

#include#define ll long long

#define rep(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

const

int maxn=100010

;const

int inf=2e9;

int s[maxn],m[maxn],r[maxn],t[maxn],vis[maxn<<2

];int t[19][maxn]; ll pre[19][maxn],v[20

][maxn];

struct

in

in(int mm,int rr,int

tt):m(mm),r(rr),t(tt){}

bool friend operator

<(in w,in

v)}fcy[maxn];

void build(int dep,int now,int l,int

r) }

if(l==r)

vis[now]=-1; int mid=(l+r)>>1

; build(dep+1,now<<1

,l,mid);

build(dep+1,now<<1|1,mid+1

,r);

}ll query(

int dep,int now,int l,int r,int ql,int qr,int

times)

if(ql<=l&&qr>=r&&vis[now]>0

)

if(vis[now]>=0) vis[now<<1]=vis[now<<1|1]=vis[now];

int mid=(l+r)>>1; ll res=0

;

if(ql<=mid) res+=query(dep+1,now<<1

,l,mid,ql,qr,times);

if(qr>mid) res+=query(dep+1,now<<1|1,mid+1

,r,ql,qr,times);

if(vis[now<<1]==vis[now<<1|1

]) vis[now]=vis[now<<1]; else vis[now]=-1

;

return

res;

}int

main()

build(

1,1,1

,n);

scanf("%d

",&m);

rep(i,

1,m)

return0;

}

CF444 Div 1簡單題解

題意 給定帶點權和邊權的無向圖,現在讓你選一些點,使得 點權和 被選點對間的邊權和 最大。思路 不難證明,選擇邊和對應的兩點是最優的。include define rep i,a,b for int i a i b i using namespace std const int maxn 20001...

CF 120F Spider 樹的直徑 簡單題

乙個男孩有n只玩具蜘蛛,每只蜘蛛都是乙個樹的結構,現在男孩準備把這n只小蜘蛛通過貼上節點接在一起,形成乙隻大的蜘蛛。大的蜘蛛也依然是樹的結構。輸出大的蜘蛛的直徑。知識 樹的直徑是指樹上的最長簡單路 求樹的直徑有個結論 假設s t這條路徑為樹的直徑,或者稱為樹上的最長路。從任意一點u出發搜到的最遠的點...

CF竟然綠掉了 這學期的目標是DIV1

c題沒出來。昨天cf竟然綠了。竟然綠了。好吧,今年的目標就是紫色,我要進div1!首先自己的dp貪心2分這樣的題目得拿下,然後資料結構圖論的題目,然後才是數學題。今年的目標就是這樣了。昨天的c題沒做出來,首先就是因為這種需要變形構造的題目自己做的太少了。另外這也算是一道資料結構題目。當然也是比較水了...