zoukankan      html  css  js  c++  java
  • codeforce 379(div.2)

    A、B略

    C题 ——贪心,二分查找:

    对于每一个a[i], 在d中二分查找 s-b[i],注意不要忘记计算速度为x时需要花费的最小时间,以及整数范围为64位整数

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 const int maxn = 2*100000+10;
     7 typedef long long LL;
     8 
     9 int n, m, k;
    10 int x, s;
    11 int a[maxn], b[maxn], c[maxn], d[maxn];
    12 
    13 int main() {
    14     scanf("%d%d%d", &n, &m, &k);
    15     scanf("%d%d", &x, &s);
    16     a[0] = x;
    17     b[0] = 0;
    18     for(int i = 1; i <= m; i++) scanf("%d",&a[i]);
    19     for(int i = 1; i <= m; i++) scanf("%d",&b[i]);
    20     for(int i = 0; i < k; i++) scanf("%d",&c[i]);
    21     for(int i = 0; i < k; i++) scanf("%d",&d[i]);
    22     LL  ans = LL(n)*x;
    23     for(int i = 0; i <=  m; i++) {
    24         if(b[i] <= s) {
    25             int temp = b[i];
    26             int tt = upper_bound(d, d+k, s - temp) - d;
    27             if(tt) {
    28                 tt--;
    29                 LL  as = n - c[tt] > 0 ? LL(n - c[tt]) * a[i] : 0;
    30                 ans = min(ans, as);
    31             }
    32             else {
    33                 LL  as = LL(n) * a[i];
    34                 ans = min(ans, as);
    35             }
    36         }
    37     }
    38     printf("%I64d
    ", ans);
    39 }

    D 思路很简单,注意细节即可

      1 #include <cstdio>
      2 #include <vector>
      3 #include <algorithm>
      4 #include <cstring>
      5 #include <cstdlib>
      6 #include <cmath>
      7 using namespace std;
      8 const int maxn = 500000+10;
      9 
     10 struct P{
     11     char ch;
     12     double dist;
     13     P(char c, double d): ch(c), dist(d){}
     14     bool operator < (const P& b)const {
     15         return dist < b.dist;
     16     }
     17 };
     18 vector<P> dig1, dig2, dig3, dig4;
     19 vector<P> ver1, ver2, ver3, ver4;
     20 
     21 int n;
     22 int x0, y0_;
     23 #define y0  y0_ 
     24 void ins(char c, int dx, int dy) {
     25     if(dx == dy) {
     26         if(dx > 0) {
     27             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     28             dig1.push_back(P(c, dis));
     29         }
     30         if(dx < 0) {
     31             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     32             dig3.push_back(P(c, dis));
     33 
     34         }
     35     }
     36     if(dx == -dy) {
     37         if(dx > 0) {
     38             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     39             dig4.push_back(P(c, dis));
     40         }
     41         if(dx < 0) {
     42             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     43             dig2.push_back(P(c, dis));
     44 
     45         }
     46     }
     47     if(dy == 0){
     48         if(dx > 0) {
     49             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     50             ver1.push_back(P(c,dis));
     51         }
     52         if(dx < 0) {
     53             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     54             ver3.push_back(P(c,dis));
     55 
     56         }
     57     }
     58     if(dx == 0){
     59         if(dy > 0) {
     60             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     61             ver2.push_back(P(c, dis));
     62         }
     63         if(dy < 0) {
     64             double dis = sqrt(double(dy)*dy + double(dx)*dx);
     65             ver4.push_back(P (c, dis));
     66         }
     67     }
     68 }
     69 int main () {
     70     scanf("%d", &n);
     71     scanf("%d%d", &x0, &y0);
     72     for(int i = 0; i < n; i++) {
     73         char ch;
     74         int xx, yy;
     75         getchar();
     76         scanf("%c%d%d", &ch, &xx, &yy);
     77         int dy = yy - y0, dx = xx - x0;
     78         ins(ch , dx, dy);
     79     }
     80     sort(dig1.begin(), dig1.end());
     81     sort(dig2.begin(), dig2.end());
     82     sort(dig3.begin(), dig3.end());
     83     sort(dig4.begin(), dig4.end());
     84     sort(ver1.begin(), ver1.end());
     85     sort(ver2.begin(), ver2.end());
     86     sort(ver3.begin(), ver3.end());
     87     sort(ver4.begin(), ver4.end());
     88     if(dig1.size()) {
     89         if(dig1[0].ch == 'Q' ||  dig1[0].ch == 'B') {
     90             printf("YES
    ");
     91             return 0;
     92         }
     93     }
     94     if(dig2.size()) {
     95         if(dig2[0].ch == 'Q' ||  dig2[0].ch == 'B') {
     96             printf("YES
    ");
     97             return 0;
     98         }
     99     }
    100     if(dig3.size()) {
    101         if(dig3[0].ch == 'Q' ||  dig3[0].ch == 'B') {
    102             printf("YES
    ");
    103             return 0;
    104         }
    105     }
    106     if(dig4.size()) {
    107         if(dig4[0].ch == 'Q' ||  dig4[0].ch == 'B') {
    108             printf("YES
    ");
    109             return 0;
    110         }
    111     }
    112     if(ver1.size()) {
    113         if(ver1[0].ch == 'Q' || ver1[0].ch == 'R') {
    114             printf("YES
    ");
    115             return 0;
    116         }
    117     }
    118 
    119     if(ver2.size()) {
    120         if(ver2[0].ch == 'Q' || ver2[0].ch == 'R') {
    121             printf("YES
    ");
    122             return 0;
    123         }
    124     }
    125     if(ver3.size()) {
    126         if(ver3[0].ch == 'Q' || ver3[0].ch == 'R') {
    127             printf("YES
    ");
    128             return 0;
    129         }
    130     }
    131     if(ver4.size()) {
    132         if(ver4[0].ch == 'Q' || ver4[0].ch == 'R') {
    133             printf("YES
    ");
    134             return 0;
    135         }
    136     }
    137     printf("NO
    ");
    138     return 0;
    139 
    140 }

    E题:首先使用并查集将相同颜色的结点缩成一点,此时树中结点黑白相间,只需要求出树的直径(最长路)除以2就是答案。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <vector>
     4 #include <algorithm>
     5 #include <queue>
     6 using namespace std;
     7 
     8 const int maxn = 200000+10;
     9 vector<int> G[maxn];
    10 void add(int v, int u) {
    11     G[v].push_back(u);
    12     G[u].push_back(v);
    13 }
    14 int n;
    15 int col[maxn];
    16 int col2[maxn];
    17 int vis[maxn];
    18 int pa[maxn];
    19 int findpa(int x) {return x == pa[x] ? x : pa[x] = findpa(pa[x]);}
    20 int from, ans;
    21 void dfs(int u, int v, int d) {
    22     if(d > ans) {
    23         ans = d;
    24         from = v;
    25     }
    26     for(int i = 0 ; i< G[v].size(); i++) {
    27         int z = G[v][i];
    28         if(z != u) {
    29             dfs(v, z, d+1);
    30         }
    31     }
    32 }
    33 int U[maxn];
    34 int V[maxn];
    35 int main() {
    36     scanf("%d", &n);
    37     for(int i = 1; i <= n; i++)
    38         scanf("%d", &col[i]);
    39     
    40     for(int i = 1; i < n; i++)
    41         scanf("%d%d", &U[i], &V[i]);
    42     for(int i = 1; i <= n; i++) pa[i] = i;
    43     for(int i = 1; i <= n; i++) {
    44         int fu = findpa(U[i]);
    45         int fv = findpa(V[i]);
    46         if(col[fu] == col[fv]) {
    47             pa[fu] = fv;
    48         }
    49     }
    50     for(int i = 1; i <= n; i++) {
    51         int fu = findpa(U[i]);
    52         int fv = findpa(V[i]);
    53         if(col[fu] != col[fv]) {
    54             add(fu, fv);
    55         }
    56     }
    57     ans = -1;
    58     int u = pa[1];
    59     for(int i = 0; i < G[u].size(); i++) {
    60         int v = G[u][i];
    61         dfs(u, v, 1);
    62     }
    63     u = from;
    64     for(int i = 0; i < G[u].size(); i++) {
    65         int v = G[u][i];
    66         dfs(u, v, 1);
    67     }
    68     ans = (ans+1)/2;
    69     printf("%d
    ", ans);
    70 }

    F题:注意到  a&b + a|b = a+b

    即可根据数组b, c的定义求出a,然后用求出的a反推数组b,c判断是否是解

    详见代码:

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 const int maxn = 200000 + 10;
     7 typedef long long LL;
     8 
     9 LL  a[maxn], b[maxn], c[maxn];
    10 int num[64];
    11 int n;
    12 int main() {
    13     ios::sync_with_stdio(false);
    14     cin >> n;
    15     for(int i = 0; i < n; i++) cin >> b[i];
    16     for(int i = 0; i < n; i++) cin >> c[i];
    17     LL sum = 0;
    18     for(int i = 0; i < n; i++) {
    19         a[i] = b[i] + c[i];
    20         sum += a[i];
    21     }
    22     if(sum % (2*n)) {
    23         cout << -1 << endl;
    24         return 0;
    25     }
    26     sum /= 2*n;
    27     for(int i = 0; i < n; i++) {
    28         a[i] = (a[i] - sum);
    29         if(a[i] % n) {
    30             cout << -1 << endl;
    31             return 0;
    32         }
    33         else{
    34             a[i] /= n;
    35         }
    36     }
    37     for(int i = 0; i < n; i++) {
    38         LL temp = a[i];
    39         for(int j = 0; j < 64; j++) {
    40             num[j] += temp%2;
    41             temp /= 2;
    42         }
    43     }
    44     for(int i = 0; i < n; i++) {
    45         LL b_ = 0, c_ = 0;
    46         for(int j = 0; j < 64; j++) {
    47             if(a[i] & (1LL << j)) {
    48                 b_ += num[j] * (1LL << j);
    49                 c_ += n * (1LL << j);
    50             }
    51             else c_ += num[j] * (1LL << j);
    52         }
    53         if(b_ != b[i] || c_ != c[i]) {
    54                 cout << -1 << endl;
    55                 return 0;
    56         }
    57     }
    58     cout << a[0];
    59     for(int i = 1; i < n; i++) {
    60         cout << " " << a[i];
    61     }
    62     cout << endl;
    63     return 0;
    64 }
  • 相关阅读:
    用C#新建网站的方法
    zhngutils.js
    jQuery源代码学习jQuery对象构建
    前端性能书单
    预则成,不预则废
    表格
    js延时周期执行setTimeout;setInterval;clearTimeout;clearInterval
    url备份
    前端性能集合(各种测试各种资源...)
    Scrum开发模式
  • 原文地址:https://www.cnblogs.com/Kiraa/p/6079673.html
Copyright © 2011-2022 走看看