20180713 考試記錄
阿新 • • 發佈:2018-07-15
丟了 != 樹狀 滿足 ima char turn {} 數組
T1 [Codeforces Round #250 Div1 B] The Child and Zoo
Solution
分析性質後,發現與最大生成樹相關,然後就直接套就行了
Code
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define F(i,a,b) for(register int i=(a);i<=(b);i++) using namespace std; typedef long long LL; LL rd() { LL x=0,f=1; char c=getchar(); while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();} while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar(); return x*f; } const int N=200010,M=2000010; LL n,m; LL da[N],fa[N],siz[N];//1 struct Ed{ int fr,to,w; Ed(int a=0,int b=0,int c=0):fr(a),to(b),w(c) {} bool operator < (const Ed oth) {return w>oth.w;} }edg[M]; int getf(int x) {return fa[x]==x?x:getf(fa[x]);} int main() { // freopen("zoo.in","r",stdin); // freopen("zoo.out","w",stdout); n=rd(),m=rd(); F(i,1,n) da[i]=rd(),fa[i]=i,siz[i]=1; F(i,1,m) { int a=rd(),b=rd(); edg[i]=Ed(a,b,min(da[a],da[b])); } sort(edg+1,edg+1+m); LL ans=0; F(i,1,m) { int u=getf(edg[i].fr),v=getf(edg[i].to); if(u!=v) { ans+=siz[u]*siz[v]*edg[i].w; if(siz[u]>siz[v]) swap(u,v); fa[u]=v; siz[v]+=siz[u]; } } printf("%.6lf",(double)(ans<<1)/(n*(n-1))); return 0; }
T2 segment
利用每次插入的長度單調遞增的規律,用右端點<=當前右端點的數目-左端點<當前左端點數目
具體代碼就是先離散化然後兩個樹狀數組維護每個值存在的個數
代碼丟了QAQ
T3 Codeforces 40E
Solution
當我們選完前n-1列後最後一列一定只有一種情況,同理在一列上選前n-1個數後最後一個數只有一種情況滿足題意
那麽可知每一列的情況數為\(2^{n-s-1}\) n為行數 s為預先填上的數目
然後利用乘法原理吧每一列乘起來
PS:有一些特判要註意 如要挑沒有預先填數的一列把它的情況數看做1
Code
//By Menteur_Hxy #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define F(i,a,b) for(register int i=(a);i<=(b);i++) using namespace std; typedef long long LL; LL rd() { LL x=0,f=1; char c=getchar(); while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();} while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar(); return x*f; } const int N=1000010; LL n,m,k,MOD,flag; LL cnt[N],len[N],num[N],fla[N]; LL ans=1; LL qpow(LL a,LL b) { LL t=1; while(b) { if(b&1) t=t*a%MOD; a=a*a%MOD; b>>=1; } return t; } int main() { n=rd(),m=rd();k=rd(); if((n+m)&1) {puts("0");return 0;} if(n<m) swap(n,m),flag=1; F(i,1,k) { int a=rd(),b=rd(),c=rd(); if(flag) swap(a,b); num[a]++; if(c==-1) fla[a]^=1; if(num[a]==m) if(!fla[a]) {puts("0");return 0;} } MOD=rd(); flag=0; F(i,1,n) { if(!num[i]&&!flag) {flag=1;continue;} if(num[i]==m) continue;//1 ans=ans*qpow(2ll,m-num[i]-1)%MOD; } printf("%lld",ans); return 0; }
20180713 考試記錄