Codeforces 459(#261 (Div. 2) ) 解题报告

A:给你一个正方形的两点,让你求其余亮点

解法:乱搞

解题代码:

 1 // File Name: a.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月15日 星期五 23时24分04秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 
28 int main(){
29     int n , m ,n1,m1; 
30     scanf("%d %d %d %d",&n,&m,&n1,&m1);
31    // printf("%d %d %d %d
",n,m1,n1,m);
32    if(n == n1)
33    {
34        printf("%d %d %d %d
",n+abs(m-m1),m,n1+abs(m-m1),m1);   
35    }else if(m == m1){
36        printf("%d %d %d %d
",n,m+abs(n-n1),n1 ,abs(n-n1)+m1);   
37    }else {
38       if(abs(n-n1) != abs(m-m1)) 
39         {
40           printf("-1
");
41           return 0; 
42         }
43       printf("%d %d %d %d
",n,m1,n1,m);
44    }
45 return 0;
46 }
View Code

B:求n个数中最大差值的总数

解法:乱搞

解题代码:

 1 // File Name: b.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月15日 星期五 23时41分47秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 map<int,int>a;
28 int main(){
29    int n;
30    a.clear();
31    int mxnum = -1e9+1; 
32    int minum = 1e9 + 1;
33    int temp ;
34    scanf("%d",&n);
35    for(int i =1 ;i <= n;i ++)
36    {
37        scanf("%d",&temp);
38        a[temp] = a[temp] + 1; 
39        if(temp > mxnum)
40          mxnum = temp ;
41        if(temp < minum)
42            minum = temp ;
43    }
44    printf("%d ",mxnum - minum);
45    if(mxnum != minum)
46    {
47        printf("%lld
",1ll*a[mxnum]*a[minum]);
48    }else {
49        printf("%lld
",1ll*a[mxnum]*(a[mxnum] - 1)/2) ;
50    }
51 return 0;
52 }
View Code

C:给你n个人,有k辆车,有d天d个景点,求怎么安排使得任意两人不能d天都同一辆车

解法:可以知道一竖行的数字不能都相等,那这就是一个求d位k进制的数

解题代码:

 1 // File Name: c.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月16日 星期六 00时10分50秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 LL n ,k,d;
28 int dp[1004][1004];
29 int check()
30 {
31    LL t = 1;
32    for(int i = 1;i <= d ;i ++)
33    {
34       t = t * k ; 
35       if(t >= n)
36           return 0 ;
37    }
38    printf("-1
");
39    return 1;
40 }
41 int main(){
42     scanf("%I64d %I64d %I64d",&n,&k,&d);
43     if(check())
44         return 0 ;
45     for(int i =1;i <= d;i ++)
46         dp[i][1] = 1; 
47     int t = 0 ; 
48     for(int i = 2;i <= n;i ++)
49     {    
50         t = 1 ; 
51         for(int j = 1;j <= d;j ++)
52         {
53            t = dp[j][i-1] + t; 
54            if(t == k+1)
55            {
56              dp[j][i] = 1; 
57            }else {
58              dp[j][i] = t;
59            }
60            t = t /(k+1);
61         }
62     }
63     for(int i = 1;i <= d;i ++)
64     {    
65         for(int j = 1;j <= n;j ++)
66           printf("%d ",dp[i][j]);
67         printf("
");
68     }    
69     return 0;
70 }
View Code

D:给你一个公式 f(i,j,x) 求的是 序列中 i 到 j 等于 x 数的个数 ,现在问你有多少 (1  <= i < j <= n) f(1,i,a[i]) > f(j,n,a[j])

解法:树状数组,从后往前扫一遍,用map记录个数,再加一个辅助数组表示这个从后往前是第几个,然后再从前往后扫,map记录个数,每遍历到一个,就删除一个辅助数组的值,直接数状数组求和累加就行。

 1 // File Name: d.cpp
 2 // Author: darkdream
 3 // Created Time: 2014年08月16日 星期六 00时57分59秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 const int maxn = 1000010;
28 map<int ,int >mp;
29 map<int ,int >be;
30 int a[maxn];
31 int num[maxn];
32 int n;
33 int anst[maxn];
34 int lowbit(int x)
35 {
36     return x &(-x);
37 }
38 void update(int x,int st)
39 {
40    while(x <= n)
41    {
42       anst[x] += st;
43       x += lowbit(x);
44    }
45 }
46 LL getsum(int x)
47 {
48   LL sum = 0 ; 
49   while(x >= 1 )
50   {
51     sum +=  anst[x];
52     x -= lowbit(x);
53   }
54   return sum;
55 }
56 int main(){
57     scanf("%d",&n);
58     int temp ; 
59     mp.clear();
60     be.clear();
61     for(int i = 1;i <= n;i ++)
62     {
63         scanf("%d",&a[i]);
64     }
65     for(int i = n;i >= 1; i --)
66     {
67          int t= mp[a[i]];
68          mp[a[i]]++;
69          num[i] = t+1;
70          update(t+1,1);
71     }
72     LL ans = 0 ; 
73     for(int i = 1;i <= n;i ++)
74     {
75         int t = be[a[i]];
76         update(num[i],-1);
77         be[a[i]] = t + 1; 
78         //printf("%I64d
",getsum(t));
79         ans += getsum(t);
80     }
81     printf("%I64d
",ans);
82     return 0 ;
83 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3916857.html