今天的题有点难改完,于是我带了很久
T1jzoj3838. 【NOIP2014模拟9.14】Super Big Stupid Cross
Description
“我是超级大沙茶”——Mato_No1
为了证明自己是一个超级大沙茶,Mato 神犇决定展示自己对叉(十字型)有多么的了解。
Mato 神犇有一个平面直角坐标系,上面有一些线段,保证这些线段至少与一条坐标轴平行。Mato 神犇需要指出,这些线段构成的最大的十字型有多大。
称一个图形为大小为R(R 为正整数)的十字型,当且仅当,这个图形具有一个中心点,它存在于某一条线段上,并且由该点向上下左右延伸出的长度为R 的线段都被已有的线段覆盖。
你可以假定:没有两条共线的线段具有公共点,没有重合的线段。
Input
第一行,一个正整数N,代表线段的数目。
以下N 行,每行四个整数x1,y1,x2,y2(x1=x2 或y1=y2),描述了一条线段。
Output
当不存在十字型时:输出一行“Human intelligence is really terrible”(不包括引号)。
否则:输出一行,一个整数,为最大的R。
Sample Input
输入1:
1
0 0 0 1
输入2:
3
-1 0 5 0
0 -1 0 1
2 -2 2 2
Sample Output
输出1:
Human intelligence is really terrible
输出2:
2
Data Constraint
对于50%的数据:N≤1000。
对于100%的数据:1≤N≤100000,所有坐标的范围在-10^9~10^9 中。
后50%内,所有数据均为随机生成。
想法:
两个
1:二分答案,扫描线+线段树维护
2:取长度前5000个暴力n^2
总结:一定要找水法,筛去不必要的信息
最简单
T2jzoj3873. 【NOIP2014八校联考第4场第2试10.20】乐曲创作(music)
Description
小可可是音乐学院的一名学生,他需要经常创作乐曲完成老师布置的作业。
可是,小可可是一个懒惰的学生。所以,每次完成作业时,他不会重新创作一首新的乐曲,而是去修改上一次创作过的乐曲作为作业交给老师。小可可的乐曲由N个音调不同的音符组成,分别记为音符1…N。因此,他创作的乐曲是由1…N的一个排列构成,例如N=5时,他创作的乐曲可能为:2,1,3,5,4。但是,小可可每一次会按照一定的要求修改上一次创作的乐曲。他规定,修改过后的乐曲必须与上一次创作的乐曲的悦耳值相同。所谓悦耳值就是他所创作的乐曲,也就是1…N的排列中逆序对的个数。逆序对是指对于1…N的一个排列A1,A2,…,An中的两个数Ai,Aj,满足i《j而Ai>Aj,例如:2,1,3,5,4 这个排列中有2个逆序对,分别为:(2,1),(5,4)。可是,满足条件的排列有很多,小可可会选择在这些满足条件的排列中字典序大于上次创作乐曲的排列的字典序,且字典序尽量小的那一个排列作为新的乐曲。这里的字典序指:排列A:A1,A2…An和排列B:B1,B2…Bn,若存在一个数k,使得Ak《Bk,且A1=B1,A2=B2,……,Ak-1=Bk-1,我们就称排列A的字典序小于排列B的字典序。
由于小可可最近要参加学校的篮球比赛,他没有空余时间完成老师布置的作业,于是他希望作为他好友的你帮助他完成作业。
Input
第1行1个正整数N,表示小可可的乐曲由N个音调不同的音符组成。
第2行为N个不同的正整数,表示1…N的一个排列,即小可可上次创作的乐曲。
Output
输出只有一行,为1…N的一个排列,表示你帮助小可可修改后的乐曲。
数据保证有满足条件的解。
Sample Input
输入1:
3
2 3 1
输入2:
5
2 1 3 5 4
Sample Output
输出1:
3 1 2
输出2:
2 1 4 3 5
Data Constraint
30%的数据,1≤N≤10;
60%的数据,1≤N≤1000;
100%的数据,1≤N≤500000。
想法:
很绕,但实现起来很简单
首先从后往前找到第一个可以开始修改的位置t,它满足不是序列a[i~n]中的最大值,且a[i+1~n]的逆序对个数>0,不然在里面无法进行交换使得新序列b的逆序对个数=原序列a的逆序对个数
如何求逆序对个数?
从后往前扫,将每个数a[i]放入一个权值线段树,每个节点表示l~r里的数出现的总次数,查询1~a[i]-1当前有多少个数就好
然后把a[t]换成a[t+1~n]中比a[i]大且最小的数,在线段树删除
对于t+1~n的数i,对它们二分判断它是a[i~n]中的第几大切尽量小,mid+X(a[t]~a[i-1]在a[t~n]中的逆序对和)《=sum(a[t~n]中的逆序对个数),mid+X+len(n-i)*(len-1)/2>=sum,则r=mid,else l=mid+1
然后线段树线段树找出第i个数取什么,在线段树中删除,更新x
T3jzoj3889. 【NOIP2014模拟10.25B组】序列问题
Description
小H是个善于思考的学生,她正在思考一个有关序列的问题。
她的面前浮现出了一个长度为n的序列{ai},她想找出两个非空的集合S、T。
这两个集合要满足以下的条件:
两个集合中的元素都为整数,且都在 [1, n] 里,即Si,Ti ∈ [1, n]。
对于集合S中任意一个元素x,集合T中任意一个元素y,满足x < y。
对于大小分别为p, q的集合S与T,满足 a[s1] xor a[s2] xor a[s3] … xor a[sp] = a[t1] and a[t2] and a[t3] … and a[tq].
小H想知道一共有多少对这样的集合(S,T),你能帮助她吗?
Input
第一行,一个整数n
第二行,n个整数,代表ai。
Output
仅一行,表示最后的答案。
Sample Input
4
1 2 3 3
Sample Output
4
【样例解释】
S = {1,2}, T = {3}, 1 ^ 2 = 3 = 3 (^为异或)
S = {1,2}, T = {4}, 1 ^ 2 = 3 = 3
S = {1,2}, T = {3,4} 1 ^ 2 = 3 & 3 = 3 (&为与运算)
S = {3}, T = {4} 3 = 3 = 3
Data Constraint
30%: 1 <= n <= 10
60%: 1 <= n <= 100
100%: 1 <= n <= 1000, 0 <= ai < 1024
想法:
设f[i,j,1]表示从n~i,and值为j的方案数
f[i,j,2]表示从n~i,到某个点and值为x,到i xor值为就的方案数
f[c,j,1]:=f[d,j,1];
f[c,j,2]:=f[d,j,2];
f[c,a[i],1]:=f[c,a[i],1]+1;
f[c,j and a[i],1]:=f[c,j and a[i],1]+f[d,j,1];
f[c,j xor a[i],2]:=f[c,j xor a[i],2]+f[d,j,2];
f[c,j xor a[i],2]:=f[c,j xor a[i],2]+f[d,j,1];
end;
(c为i,d为i+1)
注意高精度压位+滚动数组,压4位开77个即可
function jf(a,b:arr):arr;
var
i:longint;
begin
if a[0]<b[0] then a[0]:=b[0];
for i:=1 to a[0] do
begin
a[i]:=a[i]+b[i];
if a[i]>9999 then
begin
a[i]:=a[i]-10000;
a[i+1]:=a[i+1]+1;
end;
end;
if a[a[0]+1]<>0 then inc(a[0]);
exit(a);
end;