啊啊啊啊啊啊第四天考的是我最不擅长的图论……整个人都斯巴达了

//另外不得不吐槽下午的上课讲的都是网络流……难道是出题人觉得图论里除了网络流以外的其他算法都没有人权图样图森破?

愚蠢的算法(clumsy)

时限:1s

输入文件:clumsy.in

输出文件:clumsy.out

问题描述

对于一个1~n的排列{p1,p2,…,pn},将pi和pj交换,需要的代价为2*|i-j|-1,记f(p)表示通过交换将排列p变成从小到大的排列,即{1,2,3…,n}的最小代价。一个愚蠢的算法是用g(p)=Σmax(0, i-pi)来估算f(p)。给出1~n的排列的前m个元素,求有多少个排列p满足条件f(p)=g(p)。

输入格式

输入n和m,表示1~n的排列,以及确定了前m个数。

接下来一行包含m个数,表示排列中确定的前m个数。

输出格式

输出一行,表示有多少个排列满足条件,输出答案mod 10^9+7。

样例输入1

3 0

样例输出 1

5

样例输入 2

5 2

1 4

样例输出 2

3

数据规模

对于20%的数据,n≤10

对于50%的数据,n≤200

对于100%的数据,n≤2000,m≤n

原来在考场上看题目半天没想到怎么算f[p]。

然后发现对于每次交换,因为代价是2 * abs(i - j) - 1,所以显然相邻的两个数交换代价是1。然后再仔细观察发现实际上p[i]和p[i+1]交换、p[i+1]和p[i+2]交换……p[j-1]和p[j]交换,然后p[j-1]和p[j-2]交换……p[i+1]和p[i]交换,这样两两相邻的交换实际上就实现了交换p[i]、p[j]的操作。而这样刚好要交换2 * abs(i - j) - 1次,所以实际上交换只要考虑相邻交换就可以了。所以f[p]就是一个全排列中一项p中的逆序对个数。(这一点我在考场上就根本没有想到)

那么接下来考虑何时f[p]=g[p]。

假设当前做了 i 个点,且满足f[p]=g[p]。那么接下来应该在某个位置插入p[i+1]。考虑这样对f[p]、g[p]的影响:

如果直接扔尾巴后面,那么显然g[ p' ] = g[ p ],同时逆序对个数不变,所以f[ p' ] = f[ p ]。答案直接更新就可以了

如果扔到 j 的位置,那么逆序对加了i - j + 1个,此时g[ p' ]也需要增加i - j + 1。但是在 j 前面的k,max(0 , k - p[k])是不受j的影响的。那这样就要求在j后面的所有k>j,有max(0 , (k+1) - p[k])比max(0 , k - p[k])大1。

然后是dp。记f[i,j]表示前i个元素的排列中,最后j个元素pk满足k-pk≥0的方案数,

f[i , j] = f[i-1 , j-1] + Σf[i-1 , k],k>=j。

f[1 , 1] = 1。

f[i , j] = f[i , j-1] + f[i-1 , j-1]。

f[1 , 1] = 1;

题目中还有给定的前m个数,那么对于固定的数字,在转移的时候只用这个位置转移就可以。对于未知的数字,因为有一些数的位置已经确定,所以可以知道i前面至少有几个数,那么i只能放在后面。

圆桌会议(conference)

时限:5s

输入文件:conference.in

输出文件:conference.out

问题描述

有n组人要一起开一个圆桌会议(编号为0~n-1),会议的圆桌上有m个位置(编号为0~m-1)。每个组有ai个人,他们需要被安排在(li,(li+1)%m,(li+2)%m,…,ri)的座位范围内。每个座位只能安排一个人就坐,并且每个人都需要被安排一个座位。现在你需要判断是否存在满足条件的座位安排。

输入格式

输入包含不超过10组数据。

第一行有一个数字T,表示数据组数。

接下来有T组数据,每组数据第一行包含两个数n,m,表示有多少组的人与圆桌的位置数。

每组数据接下来包含n行,每行包含3个数li,ri,ai。

输出格式

对于每组数据,输出”Yes”或”No”,表示是否存在符合条件的安排。

样例输入

2

2 4

0 1 2

1 2 2

2 3

2 0 2

1 1 1

样例输出

No

Yes

数据规模

对于30%的数据,n≤1000,m≤100000

对于100%的数据,T≤10,其中有不超过3组的数据范围为n≤105,m≤109,其余与30%数据范围相同

好坑的一道题……首先很容易看出这是个二分图,那么可以用网络流模型。然而n*m的边数不是我们能接受的,即使是离散化之后也有2*n=20w的点,就是400e的边。这显然不能接受。

正解是用了一个叫Hall定理的

注意到这只是一个判定性问题,不需要输出最多多少个人之类的。而且建边也是连续的区间,所以网络流是有写多余的。

Hall定理是:如果对于二分图的左部的任意一个大小为n子集,在右边总有大小>=n的集合能和它联通,那么这个二分图一定有完全匹配。

首先断环成链,对于任意区间[l , r],令len = r - l + 1,把所有包括在[l , r]的询问[li , ri]提取出来并把a[i]求和,如果Σa[i]>len,则一定无解。

显然询问[l , r]中当l=li或者r=ri时才是有用的,因为如果l=li时成立,那么l<li时也一定成立。r同理。

考虑当sum=Σa[i]>len时无解,由len=r-l+1移项得:sum+l-1>r。所以我们只要判定这个式子成立,原式就无解。

那么首先将所有询问按r升序排列,用一个线段树维护key=sum+l-1。对于区间[1 , li]的每一个l,询问[l , ri]的sum都要增加ai,所以用区间操作搞掉就好了

判断的时候 只要找[1 , ri]的maxkey,如果maxkey>ri就无解了

最短路(shortest)

时限:1s

输入文件:shortest.in

输出文件:shortest.out

题目描述

给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1。定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1到i的最短路径,边集T构成最短路树。

给出最短路树,求对于除了源点1外的每个点i,求最短路,要求不经过给出的最短路树上的1到i的路径的最后一条边。

输入格式

第一行包含两个数n和m,表示图中有n个点和m条边。

接下来m行,每行有四个数ai,bi,li,ti,表示图中第i条边连接ai和bi权值为li,ti为1表示这条边是最短路树上的边,ti为0表示不是最短路树上的边。

输出格式

输出n-1个数,第i个数表示从1到i+1的要求的最短路。无法到达输出-1。

样例输入

5 9

3 1 3 1

1 4 2 1

2 1 6 0

2 3 4 0

5 2 3 0

3 2 2 1

5 3 1 1

3 5 2 0

4 5 4 0

样例输出

6 7 8 5

数据规模

对于30%的数据,n≤100,m≤2000

对于100%的数据,n≤4000,m≤100000,1≤li≤100000

lwher:首先题意是给你最短路树,问所有点不经过最后一条树边的最短路。

首先注意到从1到x的最短路要不经过最后一条非树边,一定是走到树边的某一节点然后绕一圈到达x。

然后在树边上加非树边的过程会产生环,那么要统计加入的边对其他点最短路的影响,用剖分搞

所以树链剖分。

akf:更快的是采用一种类似最小生成树的方法:把非树边sort,然后加入树边中。每条非树边更新过一个联通块后不可能用相同的边再更新了,所以并查集搞定

福建省队集训被虐记——DAY4的更多相关文章

  1. 福建省队集训被虐记——DAY2

    唉--第二天依然被虐--但是比第一天好一点--我必须负责任的指出:志灿大神出的题比柯黑的不知道靠谱到哪里去了--柯黑出的简直不可做 但是被虐的命运是无法改变的--求各位神犇别D我 黄巨大真是强啊,不愧 ...

  2. 福建省队集训被虐记——DAY3

    昨天没写--今天补上吧 一如既往的跪了 棋盘 [问题描述] 给出一个N*M的方格棋盘,每个格子里有一盏灯和一个开关,开始的时候,所有的灯都是关着的.用(x, y)表示第x行,y列的格子.(x, y)的 ...

  3. 福建省队集训被虐记——DAY1

    今天算是省冬的第一天--早上柯黑出题,说是"信心欢乐赛",其实是"使你失去信心.不再欢乐的比赛" 顺便orz一下来看这篇文章的各路神犇--求轻虐 水题 (py. ...

  4. zju 校队选拔 被虐记

    选拔已经开始了三天才想起来写游记 QAQ.. 7.12 弱弱的Sky_miner来到了ZJU,过程中被热成狗... 然后见到了无数大二大三的大佬们,过程中被热成狗... 后来听靖哥哥说集训的注意事项, ...

  5. JS省队集训记

    不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...

  6. HN2018省队集训

    HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...

  7. 2018HN省队集训

    HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...

  8. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

  9. [2018HN省队集训D9T1] circle

    [2018HN省队集训D9T1] circle 题意 给定一个 \(n\) 个点的竞赛图并在其中钦定了 \(k\) 个点, 数据保证删去钦定的 \(k\) 个点后这个图没有环. 问在不删去钦定的这 \ ...

随机推荐

  1. 段错误bug的调试

    我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的.实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难 免会在此处犯些小错误,而通常这些错误又是那么的浅显而易 ...

  2. bzoj2154

    #include<cstdio> #include<cstdlib> #include<iostream> #include<fstream> #inc ...

  3. AndroidStudio常见提示

    Required:请求的是String字符串 .     Found:   et.getText()返回的是text.Editable

  4. python数据类型—列表(增改删查,统计,取值,排序)

    列表是最常用的数据类型之一,通过列表可以对数据实现方便的存储,修改等操作. 先声明一个空列表: >>> names = [] >>> names [] 可以存多个值 ...

  5. [Oracle] 使用触发器实现IP限制用户登录

    在Oracle里,不像MySQL那样方便,可以直接在用户上进行IP限制,Oracle要实现用户级别的IP限制,可以使用触发器来迂回实现,下面是一个触发器的例子: create or replace t ...

  6. C#委托的详细使用

    代码如下: public delegate void GreetingDelegate(string name);//定义委托,它定义了可以代表方法的类型 class Program { public ...

  7. iOS平台下cookie的使用

    iOS平台下cookie的使用 首先,先介绍下iOS对cookie的操作的两个类: 帖子来源于:http://blog.csdn.net/chun799/article/details/1720690 ...

  8. 可用与禁用 E:enabled { sRules }

    <!DOCTYPE html><html lang="zh-cmn-Hans"><head><meta charset="utf ...

  9. MS-SQL数据库备份方法

    一.手动备份 打开企业管理器 --> 右键点击需要备份的数据库 --> 所有任务 --> 备份数据库 或者: 查询分析器: use master  backup database 数 ...

  10. tomcat免安装版注册为系统服务

    环境: OS:windows7_64bit JDK:jdk1.6_64bit tomcat:apache-tomcat-7.0.61-windows-x64 1.修改tomcat/bin/servic ...