第一周 2.29 --- 3.6

2.29

cf 620 e New Year Tree

dfs序,线段树区间修改,颜色不超过60种

改了好久,还是写得太少

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<vector>
  6 using namespace std;
  7 
  8 typedef long long LL;
  9 const int maxn = 5e6+5;
 10 int a[maxn],b[maxn],ql,qr,qv;
 11 LL sum[maxn],add[maxn];
 12 int vis[maxn],id[maxn],last[maxn],cnt;
 13 vector<int> g[maxn];
 14 int n,m;
 15 
 16 void dfs(int u){
 17     id[u] = ++cnt;
 18     for(int i = 0;i < g[u].size();i++){
 19         int v = g[u][i];
 20         if(id[v]) continue;
 21         dfs(v);
 22     }
 23     last[u] = cnt;
 24 }
 25 
 26 void Push_up(int o){
 27     sum[o] = sum[o<<1]|sum[o<<1|1];
 28 }
 29 
 30 void Push_down(int o){
 31     if(add[o]){
 32         add[o<<1] = add[o<<1|1] = add[o];
 33         sum[o<<1] = 1LL << (add[o]);
 34         sum[o<<1|1] = 1LL << (add[o]);
 35         add[o] = 0LL;
 36     }
 37 }
 38 
 39 void Build(int o,int l,int r){
 40     if(l == r){
 41         sum[o] = 1LL << (b[l]);
 42         return;
 43     }
 44     int mid = (l+r)/2;
 45     Build(o<<1,l,mid);
 46     Build(o<<1|1,mid+1,r);
 47     Push_up(o);
 48 }
 49 
 50 void Update(int o,int l,int r){
 51     if(ql <= l && r <= qr){
 52         add[o] = qv*1LL;
 53         sum[o] = 1LL << qv;
 54         return;
 55     }
 56     Push_down(o);
 57     int mid = (l+r)/2;
 58     if(ql <= mid) Update(o<<1,l,mid);
 59     if(qr > mid) Update(o<<1|1,mid+1,r);
 60     Push_up(o);
 61 }
 62 
 63 LL Query(int o,int l,int r){
 64     if(ql <= l && r <= qr){
 65         return sum[o];
 66     }
 67     Push_down(o);
 68     LL ans = 0LL;
 69     int mid = (l+r)/2;
 70     if(ql <= mid) ans |= Query(o<<1,l,mid);
 71     if(qr > mid) ans |= Query(o<<1|1,mid+1,r);
 72     return ans;
 73 }
 74 
 75 void solve(){
 76     memset(add,0,sizeof(add));
 77     Build(1,1,n);
 78     int cmd,c,v;
 79     for(int i = 1;i <= m;i++){
 80         scanf("%d",&cmd);
 81         if(cmd == 1){
 82             scanf("%d %d",&v,&c);
 83             ql = id[v],qr = last[v],qv = c;
 84          //   printf("ql = %d qr = %d qv = %d\n",ql,qr,qv);
 85             Update(1,1,n);
 86         }
 87         else{
 88             scanf("%d",&v);
 89             LL res = 0LL;
 90             ql = id[v],qr = last[v];
 91             res = Query(1,1,n);
 92          //   printf("i = %d res = %I64d\n",i,res);
 93             int zz = 0;
 94             for(int i = 1;i <= 61;i++){
 95                 if(res & (1LL<<i)) zz++;
 96             }
 97             printf("%d\n",zz);
 98         }
 99     }
100 }
101 
102 int main(){
103     while(scanf("%d %d",&n,&m) != EOF){
104         for(int i = 1;i <= n;i++) g[i].clear();
105         for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
106         int u,v;
107         for(int i = 1;i <= n-1;i++){
108             scanf("%d %d",&u,&v);
109             g[u].push_back(v);
110             g[v].push_back(u);
111         }
112         memset(vis,0,sizeof(vis));
113         cnt = 0;
114         dfs(1);
115        // for(int i = 1;i <= n;i++) printf("id[%d] = %d last[%d] = %d\n",i,id[i],i,last[i]);
116        memset(b,0,sizeof(b));
117        for(int i = 1;i <= n;i++) b[id[i]] = a[i];
118        solve();
119     }
120     return 0;
121 }
View Code

 

cf 633d 633D - Fibonacci-ish

好神奇

又wa又t的

再用一个map存下已经枚举过的对

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<map>
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 int a[1005],n;
10 map<LL,int> h;
11 map<pair<int,int>,int> hh;
12 LL f[1005];
13 int ans,len;
14 
15 void dfs(int d){
16     f[d] = f[d-1]+f[d-2];
17     if(h[f[d]] <= 0){
18         len = d-1;
19         return;
20     }
21     h[f[d]]--;
22     dfs(d+1);
23     h[f[d]]++;
24 }
25 
26 void solve(){
27     sort(a+1,a+n+1);
28     ans = 2;
29     hh.clear();
30     for(int i = 1;i <= n;i++){
31         for(int j = 1;j <= n;j++){
32             if(i == j) continue;
33             if(hh[make_pair(a[i],a[j])] != 0) continue;
34             hh[make_pair(a[i],a[j])] = 1;
35             f[1] = 1LL*a[i];f[2] = 1LL*a[j];
36 
37             h[f[1]]--;h[f[2]]--;
38             len = 2;
39             dfs(3);
40          //   printf("f[1] = %I64d f[2] = %I64d len = %d\n",f[1],f[2],len);
41             ans = max(ans,len);
42             h[f[1]]++;h[f[2]]++;
43         }
44     }
45     printf("%d\n",ans);
46 }
47 
48 int main(){
49     while(scanf("%d",&n) != EOF){
50         h.clear();
51         for(int i = 1;i <=n;i++){
52             scanf("%d",&a[i]);
53             h[1LL*a[i]]++;
54         }
55         solve();
56     }
57     return 0;
58 }
View Code

 3.1 - 3.2

不知道在做什么

3.3

wa了好多好多次

感谢一神教二分

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 
 8 const int maxn = 1e6+5;
 9 int n,k,c[maxn],v[maxn];
10 int mn[maxn][20],mx[maxn][20];
11 double p[maxn];
12 int h[maxn];
13 
14 void RMQ_init1(){
15     for(int i = 1;i <= n;i++) mx[i][0] = v[i];
16     for(int j = 1;(1<<j) <= n;j++){
17         for(int i = 1;i+(1<<j)-1 <= n;i++)
18         mx[i][j] = max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
19     }
20 }
21 
22 void RMQ_init2(){
23     for(int i = 1;i <= n;i++) mn[i][0] = c[i];
24     for(int j = 1;(1<<j) <= n;j++){
25         for(int i = 1;i+(1<<j)-1 <= n;i++)
26             mn[i][j] = min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]);
27     }
28 }
29 
30 int RMQ1(int L,int R){
31     int k = 0;
32     while(1 << (k+1) <= (R-L+1)) k++;
33     return max(mx[L][k],mx[R-(1<<k)+1][k]);
34 }
35 
36 int RMQ2(int L,int R){
37     int k = 0;
38     while(1<<(k+1) <= (R-L+1)) k++;
39     return min(mn[L][k],mn[R-(1<<k)+1][k]);
40 }
41 
42 int ok(int x,int y){
43     int l = 100*RMQ1(x,y);
44     int r = RMQ2(x,y);
45     return l < r;
46 }
47 
48 void solve(){
49     memset(h,0,sizeof(h));
50     int lb,ub,mid,res = 0;
51     for(int i = 1;i <= n;i++){
52         lb = i,ub = n;
53         for(int k = 1;k <= 50;k++){
54             mid = ub-(ub-lb)/2;
55             if(ok(i,mid)){
56                 lb = mid;
57             }
58             else ub = mid-1;
59          //   printf("i = %d lb = %d ub = %d mid = %d\n",i,lb,ub,mid);
60           //  if(lb >= ub) break;
61         }
62         h[i] = min(100*RMQ1(i,lb),RMQ2(i,lb));
63         if(lb+1 <= n) h[i]= max(h[i],min(100*RMQ1(i,lb+1),RMQ2(i,lb+1)));
64       //  printf("res = %d\n",res);
65     }
66     sort(h+1,h+n+1);
67     double ans = 0.0, b = 1.0 * k / n;
68     for(int i = 1; i <= n - k + 1; i++){
69         ans += b * h[i];
70         b *= 1.0 * (n - k + 1 - i) / (n - i);
71     }
72    printf("%.9lf\n",ans);
73 }
74 
75 int main(){
76     while(scanf("%d %d",&n,&k) != EOF){
77         for(int i = 1;i <= n;i++) scanf("%d",&v[i]);//max
78         for(int i = 1;i <= n;i++) scanf("%d",&c[i]);//min
79         RMQ_init1();
80         RMQ_init2();
81         solve();
82     }
83     return 0;
84 }
View Code

 

3.4

喜欢的事情,不管怎么样,坚持去做就好了>_<

干巴爹啊

 

3.5

cf 631 c Report

自己先做的时候是扫了一遍所有的操作,看最后是怎样的,这样是不对的

每个点都只和最后操作它上的操作有关

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn = 2e5+5;
 8 int n,m,len;
 9 int a[maxn],b[maxn],t[maxn],r[maxn];
10 int time[maxn],type[maxn];
11 
12 void solve(){
13     memset(b,0,sizeof(b));
14     int l = 1,r = len;
15     int tt = 0,cmd = 0;
16     for(int i = len;i >= 1;i--){
17         if(time[i] > tt){
18             tt = time[i];
19             cmd = type[i];
20         }
21         if(cmd == 2){
22             b[i] = a[l];l++;
23         }
24         else{
25             b[i] = a[r];r--;
26         }
27     }
28     for(int i = 1;i <= len;i++) printf("%d ",b[i]);
29     for(int i = len+1;i <= n;i++) printf("%d ",a[i]);
30     printf("\n");
31 }
32 
33 int main(){
34     while(scanf("%d %d",&n,&m) != EOF){
35         for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
36         len = 0;
37         for(int i = 1;i <= m;i++){
38             scanf("%d %d",&t[i],&r[i]);
39             time[r[i]] = i;
40             type[r[i]] = t[i];
41             len = max(len,r[i]);
42         }
43         sort(a+1,a+len+1);
44         solve();
45     }
46     return 0;
47 }
View Code

 

转载于:https://www.cnblogs.com/wuyuewoniu/p/5229376.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值