(事实上,总是可以让每一场都比,因此$w_{i}$并没有意义)

当$k=2$时,有如下做法——

新建一个点,向所有奇度数的点连边,并对得到的图求欧拉回路,那么只需要将欧拉回路上的边交替染色,即可保证$|s_{i,1}-s_{i,2}|\le 1$(路径长度为奇数时的起点),去掉新建的点后仍有$|s_{i,1}-s_{i,2}|\le 2$,也即合法

当$k$任意时,有如下做法——

随机一组方案,找到两种不合法的颜色$a$和$b$(即$\exists i,|s_{i,a}-s_{i,b}|\ge 3$),将图中颜色为$a$或$b$的边用$k=2$时的方式重新染色,重复此过程直至找到不到$a$和$b$,显然此时即合法

考虑这一做法的复杂度(和有限性),令$C=\sum_{i=1}^{n}\sum_{j=1}^{k}s_{i,j}^{2}$,考虑调整对$C$的影响:假设调整后的为$s'_{i,j}$,代入该式即使得$C$减少$\sum_{i=1}^{n}(s_{i,a}^{2}+s_{i,b}^{2}-s{'}_{i,a}^{2}-s{'}_{i,b}^{2})$

由于$s_{i,a}+s_{i,b}$固定,因此$|s'_{i,a}-s'_{i,b}|\le 1$时必然取到最小,即每一项该值均非负

另一方面,对于$|s_{i,a}-s_{i,b}|\ge 3$的位置,该值至少为4,也即$C$至少减少4

同时$C$非负,因此轮数为$o(C)$,其实际意义可以看作选择两条边满足有公共点且颜色相同,那么先确定其中一条边,由于没有重边,显然另一条边至多有$o(n)$种,即$C\le nm$

另外,每一轮调整复杂度为$o(n\log k+m)$(找$x,y$和求欧拉回路)

时间复杂度为$o(n^{2}m\log k+nm^{2})$,由于跑不满,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define M 1005
5 #define fi first
6 #define se second
7 struct Edge{
8 int nex,to;
9 }edge[N+M<<1];
10 pair<int,int>e[M];
11 multiset<int>S[N];
12 int n,m,t,E,P,head[N],vis[N+M],ans[M],sum[N][M];
13 void add(int x,int y){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 head[x]=E++;
17 }
18 void dfs(int k){
19 for(int i=head[k];i!=-1;i=edge[i].nex)
20 if (vis[i>>1]<0){
21 vis[i>>1]=0;
22 dfs(edge[i].to);
23 vis[i>>1]=P,P^=1;
24 }
25 }
26 int main(){
27 srand(time(0));
28 scanf("%d%d%d",&n,&m,&t);
29 for(int i=1;i<=n;i++)scanf("%*d");
30 for(int i=1;i<=m;i++)scanf("%d%d",&e[i].fi,&e[i].se);
31 for(int i=1;i<=m;i++){
32 ans[i]=rand()%t+1;
33 sum[e[i].fi][ans[i]]++;
34 sum[e[i].se][ans[i]]++;
35 }
36 for(int i=1;i<=n;i++)
37 for(int j=1;j<=t;j++)S[i].insert(sum[i][j]);
38 while (1){
39 int x=0,y=0;
40 for(int i=1;i<=n;i++)
41 if ((*--S[i].end())-(*S[i].begin())>=3){
42 x=y=1;
43 for(int j=2;j<=t;j++){
44 if (sum[i][j]>sum[i][x])x=j;
45 if (sum[i][j]<sum[i][y])y=j;
46 }
47 break;
48 }
49 if ((!x)&&(!y))break;
50 E=P=0;
51 memset(head,-1,sizeof(head));
52 for(int i=1;i<=m;i++)
53 if ((ans[i]==x)||(ans[i]==y)){
54 add(e[i].fi,e[i].se);
55 add(e[i].se,e[i].fi);
56 }
57 for(int i=1;i<=n;i++)
58 if ((sum[i][x]+sum[i][y])&1)add(0,i),add(i,0);
59 memset(vis,-1,sizeof(vis));
60 for(int i=1;i<=n;i++)dfs(i);
61 for(int i=1;i<=n;i++){
62 S[i].erase(S[i].find(sum[i][x]));
63 S[i].erase(S[i].find(sum[i][y]));
64 sum[i][x]=sum[i][y]=0;
65 }
66 for(int i=1,j=0;i<=m;i++)
67 if ((ans[i]==x)||(ans[i]==y)){
68 if (vis[j])ans[i]=x;
69 else ans[i]=y;
70 sum[e[i].fi][ans[i]]++;
71 sum[e[i].se][ans[i]]++;
72 j++;
73 }
74 for(int i=1;i<=n;i++){
75 S[i].insert(sum[i][x]);
76 S[i].insert(sum[i][y]);
77 }
78 }
79 for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
80 return 0;
81 }

[cf1240F]Football的更多相关文章

  1. POJ 3071 Football

    很久以前就见过的...最基本的概率DP...除法配合位运算可以很容易的判断下一场要和谁比.    from——Dinic算法                         Football Time ...

  2. Football Foundation (FOFO) TOJ 2556

    The football foundation (FOFO) has been researching on soccer; they created a set of sensors to desc ...

  3. 17111 Football team

    时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: C++;C Description As every one known, a footbal ...

  4. CodeForces 432B Football Kit

     Football Kit Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Subm ...

  5. Football(POJ3071)

    Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3469   Accepted: 1782 Descript ...

  6. 16年大连网络赛 1006 Football Games

    题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=725&pid=1006 Football Games Time ...

  7. 三分--Football Goal(面积最大)

    B - Football Goal Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

  8. HDU5873:Football Games

    题目链接: Football Games 分析: 先将分数排序,然后 设当前队编号为p,设个指针为p+1,然后p>1,每次p-=2,指针右移一位p==1,指针指向的队-=1p==0,从指针开始到 ...

  9. Codeforces Gym 100425H H - Football Bets 构造

    H - Football BetsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...

随机推荐

  1. 重磅 | 阿里开源首个 Serverless 开发者平台 Serverless Devs

    Serverless 从概念提出到应用,已经走过了 8 个年头,开发者对 Serverless 的使用热情不断高涨.为帮助开发者实现一键体验多云产品,极速部署 Serverless 项目,10 月 2 ...

  2. Salesforce 生命周期管理(一)应用生命周期浅谈

    本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...

  3. LuckySheet一款在线Excel使用心得

    1.LuckySheet简介 Luckysheet ,是一款国产的纯JS实现的类似excel的在线表格,功能强大.配置简单.完全开源. 开源地址 https://gitee.com/mengshuke ...

  4. jmeter基础功能及认识

    1.基础知识: JMeter是免费开源的,纯java开发的性能测试工具,可以测试静态和动态的资源,例如:静态文件.java服务小程序.CGI脚本.java对象.数据库.FTP服务器.邮件服务器和Per ...

  5. 初学python-day5 流程控制

    流程控制 一.判断语句 1.if语句(单一条件分支) 结构: if    表达式: 为真的时候执行的语句 概述:当程序运行到if语句时候,首页要计算表达式的值,判断真假,如果表达式的职位为真,则执行i ...

  6. 【c++ Prime 学习笔记】第6章 函数

    6.1 函数基础 函数定义包括:返回类型.函数名字.由0个或多个形参组成的列表以及函数体 通过调用运算符()来执行函数,它作用于一个表达式,该表达式是函数或函数指针.圆括号内是一个逗号隔开的实参列表, ...

  7. 正则表达式: NFA引擎匹配原理

    NFA引擎匹配原理 1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...

  8. Noip模拟47 2021.8.25

    期望得分:55+24+53 实际得分:0+0+3 乐死 累加变量清零了吗? 打出更高的部分分暴力删了吗? 样例解释换行你看见了吗? T1 Prime 打出55分做法没删原来的暴力,结果就轻松挂55分 ...

  9. 21.6.4 test

    \(NOI\) 模拟赛 太离谱了,碳基生物心态极限 \(T1\),字符串滚出OI,最后想了个区间dp,期望得分32pts,实际得分0pts,不知为啥挂了.正解是没学过的SAM. \(T2\),正解博弈 ...

  10. linux安装后ping不通局域网其他主机的解决方式

    安装了linux后尝试进行机器间的相互通讯,发现自己虚拟机并不能查看ip地址,也不能够ping通任何一台局域网内的主机 上网查了一下发现是网卡并没有打开,需要进行如下配置 查看ls 一下/etc/sy ...