DAY4DAY4DAY4
T1T1T1
泉泉泉
Description
济南,中国环渤海地区南翼和黄河中下游地区中心城市,山东省省会,山东省第一大城市,山东省政治、文化、教育中心,华东五大城市之一,区域性金融中心,副省级城市。济南位于山东省中西部,北临黄河,南依泰山。济南分别与西南部的聊城、北部的德州和滨州、东部的淄博、南部的莱芜和泰安交界。济南有着2700 余年的历史,是龙山文化的发祥地。因境内有“七十二名泉”故被称为“泉城”,并素有“四面荷花三面柳,一城山色半城湖”
的美誉。济南历史上涌现了很多文人墨客,著名有李清照、辛弃疾等。济南是国家创新型城市、中国软件名城、全国重要的交通枢纽和物流中心。继济南全运会取得圆满成功后,2013年济南将举办第十届中国艺术节,并成为2015 年“第二十二届国际历史科学大会”的主办城市,为济南建设国际大都市注入了新的活力。
济南市“泉历史研究小组”依据济南特有的泉脉关系将济南的泉水分为六个区域,分别是市中区、历下区、天桥区、槐荫区、历城区、长清区。
作为光荣的济南泉历史研究小组中的一员,铭铭收集了历史上N 个不同年份时不同泉区的泉水流量指数,这个指数是一个小于2^30 的非负整数。第i 个年份时六个泉区的泉水流量指数分别为A(i,1),A(i,2),A(i,3),A(i,4),A(i,5)与A(i,6)。
现在铭铭希望知道有多少对不同的年份:i 和j,满足这两年恰好有K 个泉区的泉水流量指数对应相同。
Input
第一行有2 个整数,分别是N 个K。
之后N 行,每行有6 个整数。第i 行的第j 个数字(i,j)表示第i 个年份中第j 个泉区的泉水流量指数。
Output
只一行,一个整数。表示有多少对不同的年份,满足恰有K 个泉区的泉水流量指数对应相同。
Sample Input
3 3
1 2 3 4 5 6
1 2 3 0 0 0
0 0 0 4 5 6
Sample Output
2
Data Constraint
有8%的数据,N<=1000,A<=20
有8%的数据,N<=1000,A<=2^30
有24%的数据,N<=100000,A<=20
有28%的数据,N<=10000,A<=2^30
有32%的数据,N<=100000,A<=2^30
对于100%的数据,0<=K<=6,且所有数据中K 是等概率出现的,即对于任意的0<=x<=6,都有大约1/7 的数据中K=x。
额,后面两题实在是太难了,只会第一题的暴力分。于是乎,就花十分钟不到完成了16分的暴力,然后开始想更高的分,可不知道是不是因为脑子短路,硬是想不出任何方法,最终造就了今日的三题总分16。
考后其实这题并不是很难,思路很简单易懂。首先将问题转化为求至少有K个相同的组数,那么枚举所有情况,然后用哈希判是否满足,最后再通过容斥求出答案即可。
AC Code:
#include <cstdio>
#include <algorithm>
#include<tr1/unordered_map>
#define ull unsigned long long
#define ll long long
using namespace std::tr1;
const int maxn = 1e5 + 10;
int n,k,a[maxn][7],mx;
ll ans,f[70],C[7][7],T[7];
ull mod = 212370440130137957;
int prime = 233317;
ull base = 131;
unordered_map <ull,int> ma;
int read()
{
int x = 0,w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') w = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * w;
}
int cnt(int a)
{
int res = 0;
while (a)
{
res += a % 2;
a >>= 1;
}
return res;
}
ll sum(int x)
{
int tot = 0,b[10],cnt = 0;
ll res = 0;
ma.clear();
while (x)
{
cnt ++;
if (x % 2 == 1) b[++ tot] = cnt;
x >>= 1;
}
for (int i = 1; i <= n; i ++)
{
ull k = 0;
for (int j = 1; j <= tot; j ++)
k = (k * base + a[i][b[j]]) % mod + prime;
res += 1ll * ma[k];
ma[k] ++;
}
return res;
}
int main()
{
T[0] = T[1] = 1;
for (int i = 2; i <= 6; i ++) T[i] = T[i - 1] * i;
for (int i = 0; i <= 6; i ++)
for (int j = 0; j <= i; j ++)
C[i][j] = T[i] / (T[j] * T[i - j]);
n = read(),k = read();
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= 6; j ++) a[i][j] = read();
mx = (1 << 6) - 1;
for (int i = 0; i <= mx; i ++)
{
ll u = sum(i);
int ct = cnt(i);
if (ct >= k)
{
if ((ct - k) & 1) ans -= u * C[ct][k]; else ans += u * C[ct][k];
}
}
printf("%lld",ans);
return 0;
}
T2T2T2
刺客信条刺客信条刺客信条
Description
故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客。最终,凭借着他的努力和出众的天赋,成为了杰出的刺客大师,他不仅是个身手敏捷的武林高手,飞檐走壁擅长各种暗杀术。刺客组织在他的带领下,为被剥削的平民声张正义,赶跑了原本统治意大利的圣殿骑士首领-教皇亚历山大六世。在他的一生中,经历了无数次惊心动魄、扣人心弦的探险和刺杀。
曾经有一次,为了寻找Altair 留下的线索和装备,Ezio 在佛罗伦萨中的刺客墓穴进行探索。这个刺客墓穴中有许多密室,且任何两个密室之间只存在一条唯一的路径。这些密室里都有一个刺客标记,他可以启动或者关闭该刺客标记。为了打开储存着线索和装备的储藏室,Ezio 必须操作刺客标记来揭开古老的封印。要想解开这个封印,他需要通过改变某些刺客标记的启动情况,使得所有刺客标记与封印密码“看起来一样”。在这里,“看起来一样”
的定义是:存在一种“标记”密室与“密码”密室之间一一对应的关系,使得密室间的连接情况和启动情况相同(提示中有更详细解释)。幸运的是,在Ezio 来到刺客墓穴之前,在Da Vinci 的帮助下,Ezio 已经得知了打开储藏室所需要的密码。
而你的任务则是帮助Ezio 找出达成目标所需要最少的改动标记次数。
Input
第一行给出一个整数n,表示密室的个数。
第二行至第n 行,每行给出两个整数a 和b,表示第a 个密室和第b 个密室之间存在一条通道。
第n+1 行,给出n 个整数,分别表示当时每个密室的启动情况(0 表示关闭,1 表示启动)。
第n+2 行,给出n 个整数,分别表示密码中每个密室的启动情况。
Output
输出只有一行,即输出最少改动标记次数。
Sample Input
4
1 2
2 3
3 4
0 0 1 1
1 0 0 0
Sample Output
1
Data Constraint
对于30%的数据,n<=10。
对于60%的数据,n<=100。
对于100%的数据,n<=700,且每个密室至多与11 个密室相通。
Hint
样例解释:
密室的编号是可以变的!将第三个密室关闭后,在当前标记和密码之间,存在1->4,2->3,3->2,4->1 的对应关系,重新编号后连接情况没有改变,且标记与密码对应。对于更一般的情况,存在一个1 到n 的置换P,使得对于任意密室之间的道路u-v,都一定有密码密室中的道路P(u)-P(v);如果不存在密室之间的道路u-v,则一定没有密码密室中的道路P(u)-P(v)。
看到题面直接自闭,考后才看懂题目大意,思路尚不清晰,还在思考。
T3T3T3
逃考逃考逃考
Description
高考又来了,对于不认真读书的来讲真不是个好消息。为了小杨能在家里认真读书,他的亲戚决定驻扎在他的家里监督他学习,有爷爷奶奶、外公外婆、大舅、大嫂、阿姨……
小杨实在是忍无可忍了,这种生活跟监狱有什么区别!为了他亲爱的小红,为了他的dota,他决定越狱!
假设小杨的家是个n*m 的矩阵,左下角坐标为(0,0),右上角坐标为(x1,y1)。小杨有n 个亲戚,驻扎在矩阵里(位置不同,且不在矩阵的边上)。小杨家里的每个地方都被亲戚监控着,而且只被距离最近的亲戚监控:
也就是说假设小杨所在的位置是(3,3),亲戚A 在(3,0),A 距离小杨距离是3;亲戚B 在(6,7),则B 距离小杨距离是5。距离A < 距离B,所以(3,3)位置由A 监控。
如果“最近距离”出现同时有几个亲戚,那么那个位置同时被那几个亲戚监控。
给出小杨的坐标(x0,y0)。因为被发现的人数越少,越狱成功的机会越大,所以小杨需要你设计一条越狱路线到达矩形的边上,且被发现的人数最少。
Ps:小杨做的方向是任意的,也就是说路线上的任意位置只需要是实数。
保证一开始小杨只被一个亲戚监控着。
.
Input
第一行,一个正整数t<=3,表示数据个数。
接下来t 个数据:
第一行n,表示小杨的亲戚个数。
接下来一行四个正整数,表示矩形右上角的坐标(x1,y1)和小杨的坐标(x0,y0)。
接下来n 行,每行两个正整数,代表一个亲戚的位置。
Output
每个数据输出一个正整数,表示小杨越狱被发现人数的最小值。
Sample Input
3
4
10 10 5 5
5 6
3 5
7 5
5 3
0
10 10 5 5
3
3 3 2 2
1 1
2 2
2 1
Sample Output
1
0
1
Data Constraint
前50%数据,n<=200;
其余数据n<=600。
Hint
样例解释:
第一个数据,小杨直接往上走,只被(5,6)监控过。
第二个数据,小杨被(7,7)监控,走到(9,9)被(7,11)监控,然后直接往上走。
这题虽然很难,但思路比较简单,起码比起第二问还比较能叫人接受。关键是有个知识点我还未掌握所以敲不出来,半平面交,由于几何的基础较薄弱,可能学起来需要较长时间,不过慢慢来,会把这题学会的。
前一天晚上学带旋Treap学得头有点昏,第二天直接爆16,不过感觉Treap应该是我学得最清楚的一个平衡树了,不过还得多找些题练练手,别生了。
今日二三题着实有点难,关键还是自己技能包不够强。
带我明日回家休养生息一天,回来再与你们大战800回合。