zoukankan      html  css  js  c++  java
  • Codeforces 343

    A:

    不会做……

    B:

    看不懂题……

    C:

    二分答案顺序检验。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 const int maxn=100010;
     9 
    10 int n,m;
    11 
    12 long long z[maxn],y[maxn];
    13 
    14 bool check(long long v)
    15 {
    16     int p=1;
    17     for (int a=1;a<=n;a++)
    18         if (p<=m)
    19         {
    20             if (y[p]<z[a])
    21             {
    22                 if (y[p]+v<z[a]) return false;
    23                 long long r=max(max(y[p]+v-(z[a]-y[p]),z[a]),z[a]+max(0ll,(v-(z[a]-y[p]))>>1));
    24                 while (p<=m && y[p]<=r)
    25                     p++;
    26             }
    27             else
    28             {
    29                 long long r=z[a]+v;
    30                 while (p<=m && y[p]<=r)
    31                     p++;
    32             }
    33         }
    34         else return true;
    35     return p>m;
    36 }
    37 
    38 int main()
    39 {
    40     scanf("%d%d",&n,&m);
    41     for (int a=1;a<=n;a++)
    42         scanf("%I64d",&z[a]);
    43     for (int a=1;a<=m;a++)
    44         scanf("%I64d",&y[a]);
    45     if (n==m)
    46     {
    47         bool able=true;
    48         for (int a=1;a<=n;a++)
    49             if (z[a]!=y[a]) able=false;
    50         if (able)
    51         {
    52             printf("0
    ");
    53             return 0;
    54         }
    55     }
    56     long long l=0,r=z[n]+y[m]+1;
    57     while (l+1!=r)
    58     {
    59         long long m=(l+r)>>1;
    60         if (check(m)) r=m;
    61         else l=m;
    62     }
    63     printf("%I64d
    ",r);
    64 
    65     return 0;
    66 }
    View Code

    D:

    三种操作是灌水、抽水和询问,拿两棵线段树分别维护灌水和抽水操作即可。

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cstring>
      4 #include<algorithm>
      5 
      6 using namespace std;
      7 
      8 #define lson l,m,rt<<1
      9 #define rson m+1,r,rt<<1|1
     10 #define wmt 1,n,1
     11 
     12 const int maxn=500010;
     13 
     14 int n,m,en,cnt,l[maxn],r[maxn],y[maxn<<2|1],z[maxn<<2|1];
     15 
     16 struct edge
     17 {
     18     int e;
     19     edge *next;
     20 }*v[maxn],ed[maxn<<1];
     21 
     22 void add_edge(int s,int e)
     23 {
     24     en++;
     25     ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;
     26 }
     27 
     28 void dfs(int now,int pre)
     29 {
     30     l[now]=++cnt;
     31     for (edge *e=v[now];e;e=e->next)
     32         if (e->e!=pre) dfs(e->e,now);
     33     r[now]=cnt;
     34 }
     35 
     36 void build(int l,int r,int rt)
     37 {
     38     y[rt]=-1;z[rt]=0;
     39     if (l==r) return;
     40     int m=(l+r)>>1;
     41     build(lson);
     42     build(rson);
     43 }
     44 
     45 void modify1(int l,int r,int rt,int nowl,int nowr,int v)
     46 {
     47     if (nowl<=l && r<=nowr)
     48     {
     49         y[rt]=v;
     50         return;
     51     }
     52     int m=(l+r)>>1;
     53     if (nowl<=m) modify1(lson,nowl,nowr,v);
     54     if (m<nowr) modify1(rson,nowl,nowr,v);
     55 }
     56 
     57 int query1(int l,int r,int rt,int p)
     58 {
     59     if (l==r) return y[rt];
     60     int m=(l+r)>>1;
     61     if (p<=m) return max(y[rt],query1(lson,p));
     62     else return max(y[rt],query1(rson,p));
     63 }
     64 
     65 void modify2(int l,int r,int rt,int p,int v)
     66 {
     67     z[rt]=v;
     68     if (l==r) return;
     69     int m=(l+r)>>1;
     70     if (p<=m) modify2(lson,p,v);
     71     else modify2(rson,p,v);
     72 }
     73 
     74 int query2(int l,int r,int rt,int nowl,int nowr)
     75 {
     76     if (nowl<=l && r<=nowr) return z[rt];
     77     int m=(l+r)>>1;
     78     if (nowl<=m)
     79     {
     80         if (m<nowr) return max(query2(lson,nowl,nowr),query2(rson,nowl,nowr));
     81         else return query2(lson,nowl,nowr);
     82     }
     83     else return query2(rson,nowl,nowr);
     84 }
     85 
     86 int main()
     87 {
     88     scanf("%d",&n);
     89     for (int a=1;a<n;a++)
     90     {
     91         int s,e;
     92         scanf("%d%d",&s,&e);
     93         add_edge(s,e);
     94         add_edge(e,s);
     95     }
     96     dfs(1,0);
     97     build(wmt);
     98     scanf("%d",&m);
     99     for (int a=1;a<=m;a++)
    100     {
    101         int opt,p;
    102         scanf("%d%d",&opt,&p);
    103         if (opt==1) modify1(wmt,l[p],r[p],a);        
    104         else
    105         {
    106             if (opt==2) modify2(wmt,l[p],a);
    107             else
    108             {
    109                 int v1=query1(wmt,l[p]);
    110                 int v2=query2(wmt,l[p],r[p]);
    111                 if (v1>v2) printf("1
    ");
    112                 else printf("0
    ");
    113             }
    114         }
    115     }
    116 
    117     return 0;
    118 }
    View Code

    E:

    不会……

  • 相关阅读:
    常见的灰度发布系统规则
    golang中的路由分组
    艾森豪威尔矩阵
    列文定理
    吃狗粮定理
    mysql事务 锁
    mysql中explain优化分析
    mysql hash索引优化
    各种浏览器内核介绍
    浏览器 兼容性问题总结
  • 原文地址:https://www.cnblogs.com/zhonghaoxi/p/3323744.html
Copyright © 2011-2022 走看看