新的一周><

3.14

cf 635d D - Factory Repairs

用自己的办法wa了两发之后,才明白一神和wtw 说的是什么 T_T

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 typedef long long LL;
 8 const int maxn = 2e5+5;
 9 int n,k,a,b,q;
10 LL sq[4*maxn],sh[4*maxn],s[4*maxn];
11 int L[maxn],R[maxn];
12 int p,v,ql,qr;
13
14 void Push_up(int o){
15     s[o] = s[o<<1] + s[o<<1|1];
16     sq[o] = sq[o<<1]+sq[o<<1|1];
17     sh[o] = sh[o<<1]+sh[o<<1|1];
18 }
19
20 void Update(int o,int l,int r){
21     if(l == r){
22         s[o] += 1LL*v;
23         sq[o] = s[o];sh[o] = s[o];
24         if(sq[o] > b) sq[o] = b;
25         if(sh[o] > a) sh[o] = a;
26         return;
27     }
28     int mid = (l+r)/2;
29     if(p <= mid) Update(o<<1,l,mid);
30     else Update(o<<1|1,mid+1,r);
31     Push_up(o);
32 }
33
34 LL queryq(int o,int l,int r){
35     if(ql <= l && r <= qr){
36         return sq[o];
37     }
38     int mid = (l+r)/2;
39     LL ans = 0LL;
40     if(ql <= mid) ans += queryq(o<<1,l,mid);
41     if(qr > mid) ans += queryq(o<<1|1,mid+1,r);
42     return ans;
43 }
44
45 LL queryh(int o,int l,int r){
46     if(ql <= l && r <= qr){
47         return sh[o];
48     }
49     int mid = (l+r)/2;
50     LL ans = 0LL;
51     if(ql <= mid) ans += queryh(o<<1,l,mid);
52     if(qr > mid) ans += queryh(o<<1|1,mid+1,r);
53     return ans;
54 }
55
56 void solve(){
57     int cmd,dd,aa,pp;
58     memset(sq,0,sizeof(sq));
59     memset(sh,0,sizeof(sh));
60     memset(s,0,sizeof(s));
61     for(int i = 1;i <= q;i++){
62         scanf("%d",&cmd);
63         if(cmd == 1){
64             scanf("%d %d",&p,&v);
65             Update(1,1,n);
66         }
67         else{
68             scanf("%d",&pp);
69             LL qian = 0LL,hou = 0LL,res = 0LL;
70             ql = 1;qr = pp-1;
71             if(qr >= ql) qian = queryq(1,1,n);
72             ql = pp+k;qr = n;
73             hou = queryh(1,1,n);
74             res = qian + hou;
75         //    printf("qian = %I64d hou = %I64d res = %I64d\n",qian,hou,res);
76             printf("%I64d\n",res);
77         }
78     }
79 }
80
81 int main(){
82     while(scanf("%d %d %d %d %d",&n,&k,&a,&b,&q) != EOF){
83         solve();
84     }
85     return 0;
86 }

View Code

hihocoder 1273 清理海报

觉得很难写的原因是,觉得写起来很繁

滚去想第三题(最后那20分还没骗到)

最后憋了一小时骗了20分

没有搞清楚,一个点在另一个矩形里面应该怎么判断,矩形面积包含应该怎么判断

后来看别人的代码

是把一张海报和另一张海报有交叉的建成图,然后dfs来求的 (建图也完全没想到嘛....T_T)

另外还要注意作为起点的那张海报在 dfs的过程中 会不会被 别的海报把四个角都覆盖掉

这个地方 用的异或 来算,好巧妙 (是自己见得太少....T_T)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7
 8 typedef pair<int,int> pii;
 9 const int maxn = 1005;
10 int xyi[maxn],yyi[maxn],xer[maxn],yer[maxn];
11 vector<int> g[maxn];
12 int vis[maxn];
13 int n,w,h;
14
15 int xiangjiao(int i,int j){
16     int minx = max(xyi[i],xyi[j]);
17     int miny = max(yyi[i],yyi[j]);
18     int maxx = min(xer[i],xer[j]);
19     int maxy = min(yer[i],yer[j]);
20     if(minx >= maxx || miny >= maxy) return 0;
21     return 1;
22 }
23
24 int in(int x,int y,int j){
25     if(x > xyi[j] && y > yyi[j] && x < xer[j] && y < yer[j]) return 1;
26     return 0;
27 }
28
29 int baohan(int i,int j){
30     int res = 0;
31     if(in(xyi[i],yyi[i],j)) res = res|1;
32     if(in(xer[i],yer[i],j)) res = res|2;
33     if(in(xyi[i],yer[i],j)) res = res|4;
34     if(in(xer[i],yyi[i],j)) res = res|8;
35     return res;
36 }
37
38 void dfs(int st,int u,int &sta){
39     vis[u] = 1;
40     for(int i = 0;i < g[u].size();i++){
41         int v = g[u][i];
42     //    printf("st = %d v = %d\n",st,v);
43         if(vis[v]) continue;
44         sta = sta|baohan(st,v);
45         dfs(st,v,sta);
46     }
47 }
48
49 void solve(){
50     for(int i = 1;i <= n;i++) g[i].clear();
51
52     for(int i = 1;i <= n;i++){
53         for(int j = i+1;j <= n;j++){
54             if(xiangjiao(i,j)) g[i].push_back(j);
55         }
56     }
57
58 /*    for(int i = 1;i <= n;i++){
59         printf("i = %d ",i);
60         for(int j = 0;j < g[i].size();j++) printf("%d ",g[i][j]);
61         printf("\n");
62     }*/
63
64     pii ans;
65     ans.first = 0;ans.second = 0;
66     for(int i = 1;i <= n;i++){
67         for(int j = 1;j <= n;j++) vis[j] = 0;
68         int sta = 0;
69         dfs(i,i,sta);
70         if(sta == 15) continue;
71         int cc = 0;
72         for(int j = 1;j <= n;j++) {
73             cc += vis[j];
74         //    printf("sta = %d vis[%d] = %d\n",sta,j,vis[j]);
75         }
76         if(cc > ans.first){
77             ans.first = cc;
78             ans.second = i;
79         }
80     }
81     printf("%d %d\n",ans.first,ans.second);
82 }
83
84 int main(){
85     scanf("%d %d %d",&w,&h,&n);
86     for(int i = 1;i <= n;i++){
87         scanf("%d %d %d %d",&xyi[i],&yyi[i],&xer[i],&yer[i]);
88     }
89     solve();
90     return 0;
91 }

View Code

3.15

以为毕业之前等不到猎人了TwT

坐等3.19 ><

3.16

搜了一下主席树来看

搜到知乎

有个人 说,“权值线段树如何求第k大这个默认你已经会了”,然后....

发现好像一直是听过,没有去做

poj 2985 The k-th Largest Group

修改是,合并集合

询问是 所有集合中的第 k 大的集合的大小

大概是这样的吧

线段树的范围 是离散化后的值域,这题n小,不用离散化

如果 插入 ,就是 a[x]+1

如果 删除,就是 a[x]-1

求第k大的,就是 sum[1...x] >= k,求出这个x

  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 sum[4*maxn];
  9 int fa[maxn],a[maxn],n,m;
 10 int p;
 11
 12 int find(int x){return x == fa[x]? x :fa[x] = find(fa[x]);}
 13
 14 void Push_up(int o){
 15     sum[o] = sum[o<<1] + sum[o<<1|1];
 16 }
 17
 18 void Build(int o,int l,int r){
 19     if(l == r){
 20         if(l == 1) sum[o] = n;
 21         else sum[o] = 0;
 22         return;
 23     }
 24     int mid = (l+r)/2;
 25     Build(o<<1,l,mid);
 26     Build(o<<1|1,mid+1,r);
 27     Push_up(o);
 28 }
 29
 30 void Update(int o,int l,int r,int w){
 31     if(l == r){
 32         sum[o] += w;
 33         return;
 34     }
 35     int mid = (l+r)/2;
 36     if(p <= mid) Update(o<<1,l,mid,w);
 37     else Update(o<<1|1,mid+1,r,w);
 38     Push_up(o);
 39 }
 40
 41 int Query(int o,int l,int r,int k){
 42     //printf("o = %d l = %d r = %d k = %d--->_<\n",o,l,r,k);
 43     if(l == r){
 44         return l;
 45     }
 46     int mid = (l+r)/2;
 47     if(k <= sum[o<<1|1]) Query(o<<1|1,mid+1,r,k);
 48     else Query(o<<1,l,mid,k-sum[o<<1|1]);
 49 }
 50
 51 void solve(){
 52     Build(1,1,n);
 53     //for(int i = 1;i <= 2*n;i++) printf("sum[%d] = %d\n",i,sum[i]);
 54     int cmd,x,y;
 55     for(int i = 1;i <= m;i++){
 56         scanf("%d",&cmd);
 57         if(cmd == 0){
 58             scanf("%d %d",&x,&y);
 59             int u = find(x);
 60             int v = find(y);
 61             if(u == v) continue;
 62             p = a[u];
 63             Update(1,1,n,-1);
 64
 65             /*printf("--begin ---\n");
 66             printf("v = %d p = %d\n",v,p);
 67             for(int i = 1;i <= 2*n;i++) printf("sum[%d] = %d\n",i,sum[i]);
 68             printf("---end---\n");*/
 69
 70             p = a[v];
 71             Update(1,1,n,-1);
 72
 73         /*    printf("--begin 2---\n");
 74             printf("v = %d p = %d\n",v,p);
 75             for(int i = 1;i <= 2*n;i++) printf("sum[%d] = %d\n",i,sum[i]);
 76             printf("---end 2---\n");*/
 77
 78             p = a[u]+a[v];
 79             Update(1,1,n,1);
 80
 81         /*    printf("--begin 3---\n");
 82             printf("v = %d p = %d\n",v,p);
 83             for(int i = 1;i <= 2*n;i++) printf("sum[%d] = %d\n",i,sum[i]);
 84             printf("---end 3---\n");*/
 85
 86             fa[u] = v;
 87             a[v] = a[u]+a[v];
 88         }
 89         else{
 90             scanf("%d",&x);
 91             printf("%d\n", Query(1,1,n,x));
 92         }
 93     }
 94 }
 95
 96 int main(){
 97     scanf("%d %d",&n,&m);
 98     for(int i = 1;i <= n;i++){
 99         a[i] = 1;
100         fa[i] = i;
101     }
102     solve();
103     return 0;
104 }

View Code

3.17

poj 2104 K-th Number

主席树的第一题

查询 m 个区间的第 k 大

看这篇:http://twistoy.com/zhu-xi-shu-learning/

还有这篇 http://www.cnblogs.com/zyf0163/p/4749042.html(这篇画的图很形象)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 const int maxn = 2e6+5;
 8 int n,m,a[maxn],b[maxn];
 9 int sz,tot;
10 int root[maxn];
11
12 struct node{
13     int sum;
14     int lch,rch;
15 }T[maxn*4];
16
17 int newnode(){
18     T[sz].sum = 0;
19     T[sz].lch = T[sz].rch = 0;
20     return sz++;
21 }
22
23 int Build(int l,int r){
24     int rt = newnode();
25     if(l == r) return rt;
26     int mid = (l+r)/2;
27     T[rt].lch = Build(l,mid);
28     T[rt].rch = Build(mid+1,r);
29     return rt;
30 }
31
32 int Update(int o,int l,int r,int p){
33     int rt = newnode();
34     T[rt].lch = T[o].lch;
35     T[rt].rch = T[o].rch;
36     T[rt].sum = T[o].sum+1;
37     if(l == r) return rt;
38     int mid = (l+r)/2;
39     if(p <= mid) T[rt].lch = Update(T[o].lch,l,mid,p);
40     else T[rt].rch = Update(T[o].rch,mid+1,r,p);
41     return rt;
42 }
43
44 int Query(int s,int t,int l,int r,int k){
45     if(l == r) return l;
46     int cnt = T[T[t].lch].sum - T[T[s].lch].sum;
47 //    printf("s = %d t = %d l = %d r = %d k = %d\n",s,t,l,r,k);
48     int mid = (l+r)/2;
49     if(k <= cnt) return Query(T[s].lch,T[t].lch,l,mid,k);
50     return Query(T[s].rch,T[t].rch,mid+1,r,k-cnt);
51 }
52
53 void solve(){
54     sz = 0;
55     root[0] = Build(1,tot);
56     for(int i = 1;i <= n;i++){
57         int pos = lower_bound(b+1,b+tot+1,a[i])-b;
58         root[i] = Update(root[i-1],1,tot,pos);
59     }
60     for(int i = 0;i <= n;i++) printf("root[%d] = %d\n",i,root[i]);
61
62     int lb,ub,x;
63     for(int i = 1;i <= m;i++){
64         scanf("%d %d %d",&lb,&ub,&x);
65         int pos = Query(root[lb-1],root[ub],1,tot,x);
66     //    printf("----pos = %d\n",pos);
67         printf("%d\n",b[pos]);
68     }
69 }
70
71 int main(){
72     while(scanf("%d %d",&n,&m) != EOF){
73         for(int i = 1;i <= n;i++) scanf("%d",&a[i]),b[i] = a[i];
74         sort(b+1,b+n+1);
75         tot = unique(b+1,b+n+1) -(b+1);
76         solve();
77      }
78     return 0;
79 }

View Code

bzoj 2588 Count on a tree

给出一颗树,查询节点 u 和节点 v  之间的第k 大

第一反应 是像树剖那样去做

可是...

是  节点 u 到 根的个数 + 节点 v 到根的个数 - Lca(u,v) 的个数- Lca(u,v) 的父节点的个数

这里看到有两种处理的办法

一种是直接减去 2*lca ,再判断 lca 的值是不是在值域内 ,这样不会多减

另一种是 - Lca(u,v) 的个数- Lca(u,v) 的父节点的个数

--------------------------------------

感觉现在是不是不该去做这些啊...........可是如果不去学的话又一直都不会了.....

---------昏割线---------------------------------------------------------

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 using namespace std;
  6
  7 const int maxn = 2e5+5;
  8 const int max_log = 32;
  9 int n,m;
 10 int first[maxn],ecnt;
 11 int fa[max_log][maxn],dep[maxn];
 12 int a[maxn],b[maxn],w[maxn];
 13 int sz,tot,root[maxn];
 14 int zhi;
 15
 16 struct node{
 17     int lch,rch,sum;
 18 } T[maxn<<4];
 19
 20 struct Edge{
 21     int v,nxt,w;
 22 }e[maxn<<1];
 23
 24 void init(){
 25     ecnt = 0;
 26     memset(first,-1,sizeof(first));
 27 }
 28
 29 void Add_edge(int u,int v){
 30     e[++ecnt].nxt = first[u];
 31     e[ecnt].v = v;
 32     first[u] = ecnt;
 33 }
 34
 35 int newnode(){
 36     T[++sz].sum = 0;
 37     T[sz].lch = T[sz].rch = 0;
 38     return sz;
 39 }
 40
 41 int Build(int l,int r){
 42     int rt = newnode();
 43     if(l == r) return rt;
 44     int mid = (l+r)/2;
 45     T[rt].lch = Build(l,mid);
 46     T[rt].rch = Build(mid+1,r);
 47     return rt;
 48 }
 49
 50 int Update(int o,int l,int r,int p){
 51     int rt = newnode();
 52     T[rt].lch = T[o].lch;
 53     T[rt].rch = T[o].rch;
 54     T[rt].sum = T[o].sum+1;
 55     if(l == r) return rt;
 56     int mid = (l+r)/2;
 57     if(p <= mid) T[rt].lch = Update(T[o].lch,l,mid,p);
 58     else T[rt].rch = Update(T[o].rch,mid+1,r,p);
 59     return rt;
 60 }
 61
 62 int Query(int x,int y,int z,int w,int l,int r,int k){
 63     if(l == r) return l;
 64     int mid = (l+r)/2;
 65     int cnt = T[T[x].lch].sum + T[T[y].lch].sum -T[T[z].lch].sum-T[T[w].lch].sum;
 66     if(k <= cnt) return Query(T[x].lch,T[y].lch,T[z].lch,T[w].lch,l,mid,k);
 67     else return Query(T[x].rch,T[y].rch,T[z].rch,T[w].rch,mid+1,r,k-cnt);
 68 }
 69
 70 void Dfs(int p,int pre,int d){
 71     fa[0][p] = pre;
 72     dep[p] = d;
 73     root[p] = Update(root[pre],1,tot,a[p]);
 74     for(int i = first[p];~i;i = e[i].nxt){
 75         int v = e[i].v;
 76         if(v == pre) continue;
 77         Dfs(v,p,d+1);
 78     }
 79 }
 80
 81 void Pre(){
 82     Dfs(1,0,0);
 83     for(int k = 0;k+1 < max_log;k++){
 84         for(int v = 1;v <= n;v++){
 85             if(fa[k][v] < 0) fa[k+1][v] = -1;
 86             else fa[k+1][v] = fa[k][fa[k][v]];
 87         }
 88     }
 89 }
 90
 91 int Lca(int u,int v){
 92     if(dep[u] > dep[v]) swap(u,v);
 93     for(int k = max_log-1;k >= 0;--k){
 94         if((dep[v]-dep[u]) & (1<<k))
 95             v = fa[k][v];
 96     }
 97     if(u == v) return u;
 98     for(int k = max_log-1;k >= 0;k--){
 99         if(fa[k][u] != fa[k][v]){
100             u = fa[k][u];
101             v = fa[k][v];
102         }
103     }
104     return fa[0][u];
105 }
106
107
108 void solve(){
109     Pre();
110     sz = 0;
111     //for(int i = 0;i <= n;i++) printf("root[%d] = %d\n",i,root[i]);
112
113     int lb,ub,k;
114     for(int i = 1;i <= m;i++){
115         scanf("%d %d %d",&lb,&ub,&k);
116         int lca = Lca(lb,ub);
117         int lcafa = fa[0][lca];
118         //printf("lb = %d ub = %d lca = %d \n",lb,ub,lca);
119         int pos = Query(root[lb],root[ub],root[lca],root[lcafa],1,tot,k);
120         printf("%d\n",b[pos]);
121     }
122
123 }
124
125 int main(){
126     while(scanf("%d %d",&n,&m) != EOF){
127         for(int i = 1;i <= n;i++) scanf("%d",&w[i]),b[i] = w[i];
128         sort(b+1,b+n+1);
129         tot = unique(b+1,b+n+1)-(b+1);
130         for(int i = 1;i <= n;i++){
131             a[i] = lower_bound(b+1,b+tot+1,w[i])-b;
132         }
133
134         init();
135         int u,v;
136         for(int i = 1;i <= n-1;i++){
137             scanf("%d %d",&u,&v);
138             Add_edge(u,v);
139             Add_edge(v,u);
140         }
141         solve();
142     }
143     return 0;
144 }

View Code

3.18

Super Mario

查询区间[l,r] 之间小于等于 h 的数有多少个

全部离散化之后,求比h小的数的和

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 const int maxn = 1e5+5;
 8 int a[maxn],b[2*maxn],h[maxn];
 9 int n,m;
10 int root[maxn],sz,tot;
11 int ql[maxn],qr[maxn];
12
13 struct node{
14     int lch,rch,sum;
15 }T[maxn<<4];
16
17 int newnode(){
18     T[++sz].sum = 0;
19     T[sz].lch = T[sz].rch = 0;
20     return sz;
21 }
22
23 int Build(int l,int r){
24     int rt = newnode();
25     if(l == r) return rt;
26     int mid = (l+r)/2;
27     T[rt].lch = Build(l,mid);
28     T[rt].rch = Build(mid+1,r);
29     return rt;
30 }
31
32 int Update(int o,int l,int r,int pos){
33     int rt = newnode();
34     T[rt].lch = T[o].lch;
35     T[rt].rch = T[o].rch;
36     T[rt].sum = T[o].sum+1;
37     if(l == r) return rt;
38     int mid = (l+r)/2;
39     if(pos <= mid) T[rt].lch = Update(T[o].lch,l,mid,pos);
40     else T[rt].rch = Update(T[o].rch,mid+1,r,pos);
41     return rt;
42 }
43
44 int Query(int s,int t,int l,int r,int pos){
45     if(pos >= r) return T[t].sum - T[s].sum;
46     if(pos < l) return 0;
47     int mid = (l+r)/2;
48     if(pos <= mid) return Query(T[s].lch,T[t].lch,l,mid,pos);
49     return T[T[t].lch].sum - T[T[s].lch].sum + Query(T[s].rch,T[t].rch,mid+1,r,pos);
50 }
51
52 void solve(){
53     sz = 0;
54     for(int i = 1;i <= n;i++) root[i] = Update(root[i-1],1,tot,a[i]);
55
56 //    for(int i = 1;i <= n;i++) printf("root[%d] = %d\n",i,root[i]);
57
58     for(int i = 1;i <= m;i++){
59         printf("%d\n",Query(root[ql[i]],root[qr[i]],1,tot,h[i]));
60     }
61 }
62
63 int main(){
64     int T;
65     scanf("%d",&T);
66     int kase = 0;
67     while(T--){
68         scanf("%d %d",&n,&m);
69         int cnt = 0;
70         for(int i = 1;i <= n;i++) scanf("%d",&a[i]),b[++cnt] = a[i];
71         for(int i = 1;i <= m;i++) scanf("%d %d %d",&ql[i],&qr[i],&h[i]),b[++cnt] = h[i],qr[i]++;
72         sort(b+1,b+cnt+1);
73         tot = unique(b+1,b+cnt+1)-(b+1);
74         for(int i = 1;i <= n;i++) a[i] = lower_bound(b+1,b+tot+1,a[i])-b;
75         for(int i = 1;i <= m;i++) h[i] = lower_bound(b+1,b+tot+1,h[i])-b;
76         printf("Case %d:\n",++kase);
77         solve();
78
79     }
80     return 0;
81 }

View Code

-------------做不动啊TwT----------------------------------

3.19

发现一件奇怪的事情>3<

subline 的文件名得是英文的

我的会 “build” 不了

wtw的会 编译不了

不知道为什么

hdu 5239 Doom

昨晚听他们讲的题><

一个数的平方30次以后就不会再变了

说是打表可以发现T_T

不懂原理

两个数相乘会爆long long 的话,就用快速乘

因为这里一个数最多被修改30次,所以可以直接去修改

不过,话说这个地方的update 不会写啊

和普通 的单点更新不同

是 ql <= mid 去更新左子树

qr > mid 去更新右子树

到叶子节点,直接修改值

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 typedef  unsigned long long LL;
 8 const int maxn = 1e5+5;
 9 const LL mod = 9223372034707292160*1LL;
10 int n,m;
11 LL a[maxn],cnt[maxn*4],sum[maxn*4];
12 int ql,qr;
13
14 LL add(LL a,LL b){
15     a += b;
16     if(a >= mod) a-= mod;
17     return a;
18 }
19
20 LL mul(LL a,LL b){
21     LL ans = 0;
22     while(b){
23         if(b&1) ans = add(ans,a);
24         a = add(a,a);
25         b >>= 1;
26     }
27     return ans;
28 }
29
30 void Push_up(int o){
31     sum[o] = add(sum[o<<1],sum[o<<1|1]);
32     cnt[o] = min(cnt[o<<1],cnt[o<<1|1]);
33 }
34
35 void Build(int o,int l,int r){
36     if(l == r){
37         sum[o] = a[l];
38         cnt[o] = 0;
39         return;
40     }
41     int mid = (l+r)/2;
42     Build(o<<1,l,mid);
43     Build(o<<1|1,mid+1,r);
44     Push_up(o);
45 }
46
47 void Update(int o,int l,int r){
48     if(cnt[o] >= 30) return;
49     if(l == r){
50         cnt[o]++;
51         sum[o] = mul(sum[o],sum[o]);
52         return;
53     }
54     int mid = (l+r)/2;
55     if(ql <= mid) Update(o<<1,l,mid);
56     if(qr > mid) Update(o<<1|1,mid+1,r);
57     Push_up(o);
58 }
59
60 LL Query(int o,int l,int r){
61     if(ql <= l && r <= qr) return sum[o];
62     int mid = (l+r)/2;
63     LL res = 0;
64     if(ql <= mid) res = add(res,Query(o<<1,l,mid));
65     if(qr > mid) res =  add(res,Query(o<<1|1,mid+1,r)) ;
66     return res;
67 }
68
69 void solve(){
70     Build(1,1,n);
71     LL ans = 0LL;
72     for(int i = 1;i <= m;i++){
73         scanf("%d %d",&ql,&qr);
74         LL tmp = Query(1,1,n);
75         ans = add(ans,tmp);
76         printf("%I64d\n",ans);
77         Update(1,1,n);
78     }
79 }
80
81 int main(){
82     int T;
83     scanf("%d",&T);
84     int kase = 0;
85     while(T--){
86         scanf("%d %d",&n,&m);
87         for(int i = 1;i <= n;i++) scanf("%llu",&a[i]);
88         printf("Case #%d:\n",++kase);
89         solve();
90     }
91     return 0;
92 }

View Code

3.20

cf 653 c 653C - Bear and Up-Down

自己做的时候,想的是找出不符合的位置,然后挨个枚举

可是,想到不符合的位置会有很多,就不知道该怎么做了

----

题解说的是超过4个位置,就不行了

可是,交换两个位置的话不是最多可以引起6个位置变化么,不懂了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<map>
 7 using namespace std;
 8
 9 const int maxn = 2e5+5;
10 int a[maxn],n;
11 vector<int> l;
12
13 int ok(int pos){
14     if(pos%2){
15         if(a[pos] >= a[pos-1] || a[pos] >= a[pos+1]) return 0;
16     }
17     else{
18         if(a[pos] <= a[pos-1] || a[pos] <= a[pos+1]) return 0;
19     }
20     return 1;
21 }
22
23 void solve(){
24     a[0] = maxn;
25     if(n%2) a[n+1] = maxn;
26     else a[n+1] = -maxn;
27     map<pair<int,int>,int> h;
28     for(int i = 1;i <= n;i++){
29         if(!ok(i)) l.push_back(i);
30     }
31
32     if(l.size() > 6){puts("0");return;}
33     int cc = 0;
34     int len = l.size();
35     for(int i = 0;i < l.size();i++){
36         int pos = l[i];
37         //printf("pos = %d\n",pos);
38         for(int j = 1;j <= n;j++){
39             if(j == pos) continue;
40             int tmp = 0;
41             if(h.find(make_pair(pos,j)) != h.end())continue;
42             swap(a[pos],a[j]);
43         /*    printf("---begin--\n");
44             for(int k = 1;k <= n;k++) printf("%d ",a[k]);
45             printf("\n");
46             printf("---end--- ");*/
47
48             for(int k = 0;k < l.size();k++){
49                 if(ok(l[k])) tmp++;
50             }
51             if(ok(j)) tmp++;
52             if(tmp == len+1) {
53                 cc++;
54                 h[make_pair(pos,j)] = 1;
55                 h[make_pair(j,pos)] = 1;
56             }
57         //    printf("tmp = %d pos = %d j = %d\n",tmp,pos,j);
58             swap(a[pos],a[j]);
59         }
60     }
61     printf("%d\n",cc);
62 }
63
64 int main(){
65     while(scanf("%d",&n) != EOF){
66         for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
67         l.clear();
68         solve();
69     }
70     return 0;
71 }

View Code

cf 653d 653D - Delivery Bears

二分加网络流

不会做

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7
  8 const int maxn = 100005;
  9 const int INF = (1 << 30) - 1;
 10
 11 struct Edge{
 12     int v,next,c;
 13 }e[maxn];
 14
 15 int st,ed,lev[maxn],first[maxn],now[maxn],ecnt;
 16 int n,m,zz;
 17 int u[maxn],v[maxn],c[maxn];
 18
 19 void init(int a,int b){
 20     st = a;ed = b;
 21     memset(first,-1,sizeof(first));
 22     ecnt = 0;
 23 }
 24
 25 void addedges(int u,int v,int c){
 26     e[ecnt].next = first[u];
 27     e[ecnt].v = v;
 28     e[ecnt].c = c;
 29     first[u] = ecnt++;
 30
 31     e[ecnt].next = first[v];
 32     e[ecnt].v = u;
 33     e[ecnt].c = 0;
 34     first[v] = ecnt++;
 35 }
 36
 37 bool bfs(){
 38     queue<int> q;
 39     while(!q.empty()) q.pop();
 40     q.push(st);
 41     memset(lev,-1,sizeof(lev));
 42     lev[st] = 0;
 43     while(!q.empty()){
 44         int x = q.front();q.pop();
 45         for(int i = first[x];~i;i = e[i].next){
 46             int v = e[i].v;
 47             if(lev[v] < 0 && e[i].c > 0){
 48                 lev[v] = lev[x] + 1;
 49                 q.push(v);
 50             }
 51         }
 52     }
 53     return lev[ed] != -1;
 54 }
 55
 56 int dfs(int p,int minf){
 57     if(p == ed || minf == 0) return minf;
 58     for(int &i = now[p];~i;i = e[i].next){
 59         int v = e[i].v;
 60         if(lev[v] == lev[p] + 1 && e[i].c > 0){
 61             int d = dfs(v,min(e[i].c,minf));
 62             if(d > 0){
 63                 e[i].c -= d;
 64                 e[i^1].c += d;
 65                 return d;
 66             }
 67         }
 68     }
 69     return 0;
 70 }
 71
 72 int dinic(){
 73     int max_flow = 0,p1;
 74     while(bfs()){
 75         memcpy(now,first,sizeof(first));
 76         while((p1 = dfs(st,INF)) > 0)
 77         max_flow += p1;
 78     }
 79     return max_flow;
 80 }
 81
 82 void build(double cap){
 83     init(0,n+1);
 84     for(int i = 1;i <= m;i++){
 85         int cc;
 86         double tmp = (1.0*c[i])/cap;
 87         cc = min(1.0*zz,tmp);
 88         addedges(u[i],v[i],cc);
 89     }
 90     addedges(0,1,zz);
 91     addedges(n,n+1,zz);
 92 }
 93
 94 int main(){
 95     while(scanf("%d %d %d",&n,&m,&zz) != EOF){
 96         init(0,n+1);
 97         int tot = 0;
 98         for(int i = 1;i <= m;i++){
 99             scanf("%d %d %d",&u[i],&v[i],&c[i]);
100             tot += c[i];
101         }
102         //printf("tot = %d\n",tot);
103         double lb = 0.0,ub = 1.0*tot,mid = 0.0,ans = 0.0;
104         for(int k = 1;k <= 100;k++){
105             mid = (lb+ub)*0.5;
106             build(mid);
107             if(dinic() == zz){
108                 lb = mid;
109             //    printf("----ans = %lf\n",ans);
110                 ans = max(ans,lb);
111             }
112             else ub = mid;
113            // printf("lb = %lf ub = %lf mid = %lf\n",lb,ub,mid);
114         }
115         printf("%.9lf\n",ans*zz);
116     }
117     return 0;
118 }

View Code

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

第三周 3.14 --- 3.20相关推荐

  1. 4月第三周国内域名解析商Top10:万网升至20.32%

    IDC评述网(idcps.com)04月28日报道:据WebHosting.info数据显示,4月第三周(4月15日-4月21日),我国域名解析服务市场基本保持稳定.与上周相比,中国万网份额小升0.0 ...

  2. gsoc 任务_我在GSoC'20中进行编码的第三周

    gsoc 任务 Hello everyone, 大家好, This is the blog post for the third week of my GSoC coding period. In t ...

  3. 提高班第三周周记(中秋第一天)

    这是第三周,也是中秋节.没有月饼的中秋节.但我过得很充实.我很快乐,发自内心的. 中秋第一天早上贾琳师哥讲课.讲他为什么辞职来这里.他的确学成,有着令人羡慕的工资.可是他的问题让我触动. 提到了邓稼先 ...

  4. 软件工程学习进度第三周暨暑期学习进度之第三周汇总

    第三周,本周并未将重心放在java学习上,只是在教数据结构的刘老师留的暑假作业PTA练习题上使用java进行编程,本周的重心主要放在机器学习上,javaweb只是了解了一部分jQuery的内容,优化了 ...

  5. 2017-2018-1 20155228 《信息安全系统设计基础》第三周学习总结

    2017-2018-1 20155228 <信息安全系统设计基础>第三周学习总结 教材学习内容总结 十六进制表示法 一个字节由8位组成.在二进制表示法中,它的值域是0000000-1111 ...

  6. 2.21天21步:三周实现创业起步!

    来源: <创业邦>杂志 文/Tim Berry,Sabrina Parsons 拟定好每天要做的事情,顺利启动你的新公司 你是否正在寻找快速启动创业的捷径?你想确保自己明白了所有的操作要点 ...

  7. 赵栋 201771010137 第三周学习总结

    自主学习任务 1. 复习课程第1-3章学习内容 2. 回顾实验三中实验题1<2018秋季西北师范大学面向对象程序设计(Java)(ch1-ch3)测试题1>,对照测试题参考答案,反思修改本 ...

  8. 第三周 超参数调试、Batch正则化和程序框架(Hyperparameter tuning)

    第三周 超参数调试.Batch正则化和程序框架(Hyperparameter tuning) 文章目录 第三周 超参数调试.Batch正则化和程序框架(Hyperparameter tuning) 3 ...

  9. 20162315马军第三周学习总结

    20162315马军 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容总结 这个星期教材学习内容为第三章,学习了关于赋值和地址的区别,也就是别名的内容,学习了St ...

  10. python笔记_第三周

    python笔记_第三周 第十天 回调函数 回调函数就是一个被作为参数传递的函数把函数a当做一个值 赋值给函数b的形参, 在调用函数b的时候 在函数体内 适当的实际调用函数a, 这个函数a就是回调函数 ...

最新文章

  1. mysql 数据库乱码
  2. LayoutInflater用法小结
  3. Team Composition: Programmers and Mathematicians 贪心(800)
  4. python selenium鼠标点击_Python+Selenium学习--鼠标事件
  5. 绿盟漏洞扫描_主机安全漏洞解决方案
  6. Flask-SQLAlchemy一般方法总结
  7. tuxedo管理命令之tmadmin
  8. cad文本改宋体字型lisp_给CAD初学者的一些建议
  9. js四舍五入保留两位小数(可完全保留两位)
  10. 家庭财务软件的概要分析
  11. Linux安装wget
  12. python-Excel操作(xlrd读,xlwt写)
  13. 路由器:什么是软路由,看完本篇文章你就懂了
  14. 阿里云服务器和虚拟主机之间的区别
  15. App工程结构搭建:几种常见Android代码架构分析
  16. element UI实现el-dialog(弹框)可拖拽功能(网上借鉴)
  17. 安科瑞数据中心EMS 系统解决方案
  18. 一分钟快速搭建Windows防污染DNS服务器——Pcap_DNSProxy
  19. Android在app中打开另一个app
  20. c++中一个冒号“:”的使用

热门文章

  1. 对网站的文件和资源进行优化、前端开发优化
  2. 2017年11月11日
  3. javamelody 使用
  4. sql 将8位字符串转换成日期型
  5. SpringBoot Environment读取配置文件乱码
  6. Distribution download cancelled. Using distribution from 'https://services.gradle.org/distributions/
  7. KVM虚拟化相关知识简介(脑补)
  8. Winform分页控件支持表头全选操作实现之最优方法
  9. Extjs study
  10. 1.UML2 软件建模入门与提高 --- 面向对象和软件建模