第三周 3.14 --- 3.20
新的一周><
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相关推荐
- 4月第三周国内域名解析商Top10:万网升至20.32%
IDC评述网(idcps.com)04月28日报道:据WebHosting.info数据显示,4月第三周(4月15日-4月21日),我国域名解析服务市场基本保持稳定.与上周相比,中国万网份额小升0.0 ...
- gsoc 任务_我在GSoC'20中进行编码的第三周
gsoc 任务 Hello everyone, 大家好, This is the blog post for the third week of my GSoC coding period. In t ...
- 提高班第三周周记(中秋第一天)
这是第三周,也是中秋节.没有月饼的中秋节.但我过得很充实.我很快乐,发自内心的. 中秋第一天早上贾琳师哥讲课.讲他为什么辞职来这里.他的确学成,有着令人羡慕的工资.可是他的问题让我触动. 提到了邓稼先 ...
- 软件工程学习进度第三周暨暑期学习进度之第三周汇总
第三周,本周并未将重心放在java学习上,只是在教数据结构的刘老师留的暑假作业PTA练习题上使用java进行编程,本周的重心主要放在机器学习上,javaweb只是了解了一部分jQuery的内容,优化了 ...
- 2017-2018-1 20155228 《信息安全系统设计基础》第三周学习总结
2017-2018-1 20155228 <信息安全系统设计基础>第三周学习总结 教材学习内容总结 十六进制表示法 一个字节由8位组成.在二进制表示法中,它的值域是0000000-1111 ...
- 2.21天21步:三周实现创业起步!
来源: <创业邦>杂志 文/Tim Berry,Sabrina Parsons 拟定好每天要做的事情,顺利启动你的新公司 你是否正在寻找快速启动创业的捷径?你想确保自己明白了所有的操作要点 ...
- 赵栋 201771010137 第三周学习总结
自主学习任务 1. 复习课程第1-3章学习内容 2. 回顾实验三中实验题1<2018秋季西北师范大学面向对象程序设计(Java)(ch1-ch3)测试题1>,对照测试题参考答案,反思修改本 ...
- 第三周 超参数调试、Batch正则化和程序框架(Hyperparameter tuning)
第三周 超参数调试.Batch正则化和程序框架(Hyperparameter tuning) 文章目录 第三周 超参数调试.Batch正则化和程序框架(Hyperparameter tuning) 3 ...
- 20162315马军第三周学习总结
20162315马军 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容总结 这个星期教材学习内容为第三章,学习了关于赋值和地址的区别,也就是别名的内容,学习了St ...
- python笔记_第三周
python笔记_第三周 第十天 回调函数 回调函数就是一个被作为参数传递的函数把函数a当做一个值 赋值给函数b的形参, 在调用函数b的时候 在函数体内 适当的实际调用函数a, 这个函数a就是回调函数 ...
最新文章
- mysql 数据库乱码
- LayoutInflater用法小结
- Team Composition: Programmers and Mathematicians 贪心(800)
- python selenium鼠标点击_Python+Selenium学习--鼠标事件
- 绿盟漏洞扫描_主机安全漏洞解决方案
- Flask-SQLAlchemy一般方法总结
- tuxedo管理命令之tmadmin
- cad文本改宋体字型lisp_给CAD初学者的一些建议
- js四舍五入保留两位小数(可完全保留两位)
- 家庭财务软件的概要分析
- Linux安装wget
- python-Excel操作(xlrd读,xlwt写)
- 路由器:什么是软路由,看完本篇文章你就懂了
- 阿里云服务器和虚拟主机之间的区别
- App工程结构搭建:几种常见Android代码架构分析
- element UI实现el-dialog(弹框)可拖拽功能(网上借鉴)
- 安科瑞数据中心EMS 系统解决方案
- 一分钟快速搭建Windows防污染DNS服务器——Pcap_DNSProxy
- Android在app中打开另一个app
- c++中一个冒号“:”的使用
热门文章
- 对网站的文件和资源进行优化、前端开发优化
- 2017年11月11日
- javamelody 使用
- sql 将8位字符串转换成日期型
- SpringBoot Environment读取配置文件乱码
- Distribution download cancelled. Using distribution from 'https://services.gradle.org/distributions/
- KVM虚拟化相关知识简介(脑补)
- Winform分页控件支持表头全选操作实现之最优方法
- Extjs study
- 1.UML2 软件建模入门与提高 --- 面向对象和软件建模