Codeforces Round #261 (Div. 2)

A. Pashmak and Garden

题意:给你两个正方形的顶点坐标,让你求出另两个顶点的坐标

题解:分情况讨论即可

代码:

 1 var x1,x2,y1,y2:longint;
 2 begin
 3   readln(x1,y1,x2,y2);
 4   if x1=x2 then writeln(x1+abs(y2-y1),' ',y1,' ',x1+abs(y2-y1),' ',y2)
 5   else if y1=y2 then writeln(x1,' ',y1+abs(x1-x2),' ',x2,' ',y1+abs(x1-x2))
 6   else
 7    begin
 8      if abs(x1-x2)<>abs(y1-y2) then writeln('-1')
 9      else writeln(x1,' ',y2,' ',x2,' ',y1);
10    end;
11 end.        
View Code

B. Pashmak and Flowers

题意:给你一个数列,如果从中选2个数,那么这两个数最大差值为多少?有多少种取法可以取到这个最大值?n (2 ≤ n ≤ 2·105).

题解:考场上扫了一遍数列,记录了4个临时变量mx,mi,w1,w2分别表示当前遇到的最大值,最小值,最大值有几个,最小值有几个

        因为没处理好边界,就是刚开始的2个,结果fst了。。。也可以排一下序,直接输出a[n]-a[1],并且把最大值的个数*最小值的个数输出即可

 1 var n,x,y,w1,w2,t,mx,mi:int64;
 2     i:longint;
 3 begin
 4   readln(n);
 5   mx:=-1;mi:=1000000000;
 6   for i:=1 to n do
 7    begin
 8      read(x);
 9      if x>mx then begin mx:=x;w2:=1;end
10      else if x=mx then inc(w2);
11      if x<mi then begin mi:=x;w1:=1;end
12      else if x=mi then inc(w1);
13    end;
14   if mx-mi<>0 then writeln(mx-mi,' ',w1*w2)
15   else writeln(0,' ',n*(n-1)>>1);
16 end.          
View Code

D. Pashmak and Parmida's problem

题意:给你一个数列,定义f(l,r,ax)为 满足 l<=k<=r 并且 a[k]=x 的数量,求这个数列中有多少个二元组i,j是的 i<j 并且满足 f(1,i,a[i])>f(j,n,a[j])  n<=10^6  a[i]<=10^9

题解:因为数很大,数的个数很少,我们可以离散化,这样我们就可以类似桶排从前往后和从后往前各扫一遍求出 f(1,i,a[i])和f(j,n,a[j])

        然后有限制条件 i<j,所以我们使用树状数组求前缀和  从后往前扫 扫到 j 的时候 j之后的g[j]都加上了,我们求 f[i-1]-1的前缀和就是i 对答案的贡献

代码:

 1 const maxn=1000000+100;
 2 var a,b,rk,s,f,g,ss:array[0..maxn] of int64;
 3     i,n,tot:longint;
 4     ans:int64;
 5 procedure sort(l,r:longint);
 6  var i,j,x,y:longint;
 7  begin
 8  i:=l;j:=r;x:=a[(i+j)>>1];
 9  repeat
10   while a[i]<x do inc(i);
11   while a[j]>x do dec(j);
12   if i<=j then
13    begin
14    y:=a[i];a[i]:=a[j];a[j]:=y;
15    y:=rk[i];rk[i]:=rk[j];rk[j]:=y;
16    inc(i);dec(j);
17    end;
18  until i>j;
19  if i<r then sort(i,r);
20  if j>l then sort(l,j);
21  end;
22 procedure init;
23  begin
24    readln(n);
25    for i:=1 to n do begin read(a[i]);rk[i]:=i;end;
26    sort(1,n);
27  end;
28 procedure add(x:longint);
29  begin
30  while x<=n do
31   begin
32    inc(ss[x]);
33    inc(x,x and (-x));
34   end;
35  end;
36 function sum(x:longint):int64;
37 var t:longint;
38  begin
39  t:=0;
40  while x>0 do
41    begin
42     inc(t,ss[x]);
43     dec(x,x and (-x));
44    end;
45  exit(t);
46  end;
47 procedure main;
48  begin
49    tot:=0;
50    for i:=1 to n do
51     begin
52       if (i=1) or (a[i]<>a[i-1]) then inc(tot);
53       b[rk[i]]:=tot;
54     end;
55    fillchar(s,sizeof(s),0);
56    for i:=1 to n do
57     begin
58       inc(s[b[i]]);
59       f[i]:=s[b[i]];
60     end;
61    fillchar(s,sizeof(s),0);
62    for i:=n downto 1 do
63     begin
64       inc(s[b[i]]);
65       g[i]:=s[b[i]];
66     end;
67    ans:=0;
68    //for i:=1 to n do writeln(f[i],' ',g[i]);
69    for i:=n downto 2 do
70     begin
71       add(g[i]);inc(ans,sum(f[i-1]-1));//writeln(f[i-1]-1,' ',sum(f[i-1]-1));
72     end;
73    writeln(ans);
74  end;
75 
76 begin
77   init;
78   main;
79 end.  
View Code

C. Pashmak and Buses

题意:有k辆车,有n个学生,问能否给这n个学生安排d天坐车,是的没有两个同学d天都在同一辆车上。 n, k, d (1 ≤ n, d ≤ 1000; 1 ≤ k ≤ 109).

不会捉。。。

E. Pashmak and Graph

题意:n个点,m条边的无向图,请你找出一条最长的路径(可以有环),使的这条路径上的边权严格递增nm (2 ≤ n ≤ 3·105; 1 ≤ m ≤ min(n·(n - 1), 3·105))

不会捉。。。

posted @ 2014-08-16 12:43  ZYF-ZYF  Views(311)  Comments(0Edit  收藏  举报