【Hitachi2020C】ThREE【构造】【二分图染色】
生活随笔
收集整理的這篇文章主要介紹了
【Hitachi2020C】ThREE【构造】【二分图染色】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
題意:給一棵nnn個結點的樹,構造一個nnn階排列ppp,使得所有距離為333的點對(i,j)(i,j)(i,j)滿足pi+pjp_i+p_jpi?+pj?和pipjp_ip_jpi?pj?至少一個為333的倍數。
分析一下,這個條件等價于所有距離333的點對點權對三取模后不都為111且不都為222
換句話說,所有余數為111的點中不存在距離為333的,222一樣。
因為要求距離為333,可以二分圖染色,把余數相同的放在同一個顏色中。
問題轉換成了:把?n+23?\lfloor\frac{n+2}3\rfloor?3n+2??個111和?n+13?\lfloor\frac{n+1}3\rfloor?3n+1??個222放入兩個集合,要求相同的數只能放在同一個集合。且這兩個集合最多分別只能放x,yx,yx,y個,其中x+y=nx+y=nx+y=n
如果x,yx,yx,y中一個很大,就把兩個都放進去,否則分開放。
根據意識流一定可以放下,瞎搞一波即可。
最后剩下的放333
#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #define MAXN 200005 #define MAXM 400005 using namespace std; struct edge{int u,v;}e[MAXM]; int head[MAXN],nxt[MAXM],cnt; void addnode(int u,int v) {e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt; } int col[MAXN],tot[2],p[MAXN],n; void dfs(int u) {++tot[col[u]];for (int i=head[u];i;i=nxt[i])if (col[e[i].v]==-1)col[e[i].v]=col[u]^1,dfs(e[i].v); } inline void putp(int r,int c)//freedomly put r+3k into color c {int cur=r;for (int i=1;i<=n;i++)if (col[i]==c&&!p[i]){p[i]=cur,cur+=3;if (cur>n) return;} } int main() {scanf("%d",&n);for (int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addnode(u,v),addnode(v,u);}memset(col,-1,sizeof(col));for (int i=1;i<=n;i++) if (col[i]==-1) col[i]=0,dfs(i);int k=(n+1)/3;if (k<=min(tot[0],tot[1])) putp(2,tot[1]<=tot[0]);else putp(2,tot[1]>tot[0]);putp(1,tot[1]>tot[0]);int cur=3;for (int i=1;i<=n;i++)if (!p[i])p[i]=cur,cur+=3;for (int i=1;i<=n;i++) printf("%d%c",p[i]," \n"[i==n]);return 0; }總結
以上是生活随笔為你收集整理的【Hitachi2020C】ThREE【构造】【二分图染色】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【AGC035C】Skolem XOR
- 下一篇: 【HNOI2015】接水果【整体二分】【