zoukankan      html  css  js  c++  java
  • Codeforces Round #576 (Div. 2)

    英语场,手速场。

    题目链接:http://codeforces.com/contest/1199


    A:

    O(n)扫一遍,对于每个a[i],往前扫x个往后扫y个完事。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson (curpos<<1)
    15 #define rson (curpos<<1|1)
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 const int maxn = 1e5 + 10;
    21 int n, x, y, a[maxn];
    22 
    23 int main() {
    24     scanf("%d%d%d", &n, &x, &y);
    25     rep1(i, 1, n) scanf("%d", &a[i]);
    26     rep1(i, 1, n) {
    27         int flag1 = 1, flag2 = 1;
    28         for (int j = i - 1; j >= 1 && j >= i - x; j--)
    29             if (a[j] < a[i]) {
    30                 flag1 = 0; break;
    31             }
    32         for (int j = i + 1; j <= n && j <= i + y; j++)
    33             if (a[j] < a[i]) {
    34                 flag2 = 0; break;
    35             }
    36         if (flag1 && flag2) {
    37             printf("%d
    ", i);
    38             return 0;
    39         }
    40     }
    41     return 0;
    42 }
    View Code

    B:

    给定H和L,求解r^2-(r-H)^2=L^2,并输出r-H。

    小学数学。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson (curpos<<1)
    15 #define rson (curpos<<1|1)
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 int H, L;
    21 
    22 int main() {
    23     scanf("%d%d", &H, &L);
    24     double h = H, l = L;
    25     printf("%.6f
    ", (l * l + h * h) / 2.0 / h - h);
    26     return 0;
    27 }
    View Code

    C:

    题意巨恶心的一题。

    给定一个数组,定义数组大小为数组元素个数*数组所含数字种类数。给定一个压缩算法,该压缩算法选择一个区间[l,r],然后逐个检查数组元素是否在区间内。若<l,则使之变为l;若>r,则使之变为r。

    题目给定n(数组长度)和b,问在执行该压缩算法后,最少变几个元素,使得数组大小<=8*b。

    一开始没认真思考压缩算法的作用,盲目贪心导致wa11。贪心显然是错的,不能保证压缩后的数组所有元素都在区间内。

    用一个vector<pair<int,int>>来记录数字和出现次数。尺取维护当前区间元素个数。对于给定的b,显然有k=8*b/n,K=pow(2,k)。这样就确定了算法结束后最终剩余多少种数字。O(n)判一遍完事。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson (curpos<<1)
    15 #define rson (curpos<<1|1)
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 int n, I, k, K = 1, total = 0, ans;
    21 map<int, int>cnt;
    22 vector<pair<int, int>>v;
    23 
    24 int main() {
    25     scanf("%d%d", &n, &I); k = (I << 3) / n;
    26     rep1(i, 1, k) {
    27         K <<= 1;
    28         if (K > n) break;
    29     }
    30     for (int i = 0, a; i < n; i++) {
    31         scanf("%d", &a);
    32         cnt[a]++;
    33     }
    34     for (auto i : cnt) v.pb(i);
    35     for (int i = 0; i < min(K, (int)v.size()); i++)
    36         total += v[i].second;
    37     ans = total;
    38     for (int i = K; i < (int)v.size(); i++)
    39         total = total + v[i].second - v[i - K].second, ans = max(ans, total);
    40     printf("%d
    ", n - ans);
    41     return 0;
    42 }
    View Code

    D:

    给定一个数组和q次操作,操作分为两类:1、把数组某个元素修改为给定值val;2、检查整个数组,若某元素小于给定值val,变为val。输出q次操作之后的数组。

    一眼线段树。单点修改很简单,区间修改就上lazy tag。

     1 /* basic header */
     2 #include <bits/stdc++.h>
     3 /* define */
     4 #define ll long long
     5 #define dou double
     6 #define pb emplace_back
     7 #define mp make_pair
     8 #define sot(a,b) sort(a+1,a+1+b)
     9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
    10 #define rep0(i,a,b) for(int i=a;i<b;++i)
    11 #define eps 1e-8
    12 #define int_inf 0x3f3f3f3f
    13 #define ll_inf 0x7f7f7f7f7f7f7f7f
    14 #define lson (curpos<<1)
    15 #define rson (curpos<<1|1)
    16 /* namespace */
    17 using namespace std;
    18 /* header end */
    19 
    20 const int maxn = 2e5 + 10;
    21 int n, m, a[maxn], ans[maxn];
    22 struct SegmentTree {
    23     struct Node {
    24         int val, add;
    25     } mem[maxn << 2];
    26     SegmentTree() {}
    27 
    28     void build(int *a, int curpos, int curl, int curr) {
    29         if (curl == curr) {
    30             mem[curpos].val = a[curl];
    31             mem[curpos].add = 0;
    32             return;
    33         }
    34         int mid = curl + curr >> 1;
    35         build(a, lson, curl, mid); build(a, rson, mid + 1, curr);
    36     }
    37 
    38     void update(int curpos, int pos, int curl, int curr, int val) {
    39         if (curl == curr) {
    40             mem[curpos].val = val;
    41             mem[curpos].add = 0;
    42             return;
    43         }
    44         int mid = curl + curr >> 1;
    45         mem[lson].add = max(mem[curpos].add, mem[lson].add);
    46         mem[rson].add = max(mem[curpos].add, mem[rson].add);
    47         mem[curpos].add = 0;
    48         if (pos <= mid) update(lson, pos, curl, mid, val);
    49         else update(rson, pos, mid + 1, curr, val);
    50     }
    51 
    52     void maintain(int curpos, int curl, int curr) {
    53         if (curl == curr) {
    54             ans[curl] = max(mem[curpos].val, mem[curpos].add);
    55             return;
    56         }
    57         mem[lson].add = max(mem[lson].add, mem[curpos].add);
    58         mem[rson].add = max(mem[rson].add, mem[curpos].add);
    59         int mid = curl + curr >> 1;
    60         maintain(lson, curl, mid); maintain(rson, mid + 1, curr);
    61     }
    62 } st;
    63 
    64 int main() {
    65     scanf("%d", &n);
    66     rep1(i, 1, n) scanf("%d", &a[i]);
    67     st.build(a, 1, 1, n);
    68     scanf("%d", &m);
    69     while (m--) {
    70         int op; scanf("%d", &op);
    71         if (op == 1) {
    72             int pos, val; scanf("%d%d", &pos, &val);
    73             st.update(1, pos, 1, n, val);
    74         } else {
    75             int val; scanf("%d", &val);
    76             st.mem[1].add = max(st.mem[1].add, val);
    77         }
    78     }
    79     st.maintain(1, 1, n);
    80     rep1(i, 1, n) printf("%d ", ans[i]);
    81     return 0;
    82 }
    View Code
  • 相关阅读:
    C# Http方式下载文件到本地
    C#中如何让ListView控件点击选中整行
    C#中toolStrip或statusStrip遮挡了SplitContainer怎么办?
    C# 判断字符串是否符合十六进制,八进制,二进制和十进制整数格式的正则表达式
    从零讲JAVA ,给你一条清晰地学习道路!该学什么就学什么!!
    Java or Python?初学者的选择
    从Java的前景与就业情况看,Java是你首选的编程语言,没有之一
    好书推荐:Java与模式.pdf
    java多线程、集合和IO面试题_02
    走出创业过程中悲伤的低谷
  • 原文地址:https://www.cnblogs.com/JHSeng/p/11273719.html
Copyright © 2011-2022 走看看