BYRBT

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\n");
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\n",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\n");
112                 else printf("0\n");
113             }
114         }
115     }
116 
117     return 0;
118 }
View Code

 

E:

不会……

posted @ 2013-09-16 10:20  zhonghaoxi  阅读(374)  评论(0编辑  收藏  举报
BYRBT