From ba9dd8410f0e7f9451241cfd42382c929c53bef5 Mon Sep 17 00:00:00 2001 From: KiritoTRw <3021577574@qq.com> Date: Thu, 11 Aug 2016 11:21:51 +0800 Subject: [PATCH 1/7] Rename 1166.cpp to 1166_cszlg.cpp --- HDOJ/1166_cszlg.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 HDOJ/1166_cszlg.cpp diff --git a/HDOJ/1166_cszlg.cpp b/HDOJ/1166_cszlg.cpp new file mode 100644 index 0000000..c74930c --- /dev/null +++ b/HDOJ/1166_cszlg.cpp @@ -0,0 +1,90 @@ +/*简单说下这个题,题目意思很明显,线段树的单点更新,线段树,听大牛们说,线段树一般变化最大的就是询问,和更新,所以,大家只要把询问和更新给弄明白了,这题也就明白了,还有,线段树对递归要求有点高,递归不是很熟的同学,最好去把递归复习几遍,附上代码*/ +#include +#include +#define maxn 50000 +int ans; +struct node +{ + int left,right,sum; + int mid() + { + return (left+right)>>1; + } +}tree[maxn*4]; +void btree(int left,int right,int rt) +{ + tree[rt].left=left; + tree[rt].right=right; + if(left==right) + { + scanf("%d",&tree[rt].sum); + return ; + } + int mid=tree[rt].mid(); + btree(left,mid,rt<<1); + btree(mid+1,right,rt<<1|1); + tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum; +} +void query(int left,int right,int rt,int L,int R) +{ + if(L<=left&&right<=R) + { + ans+=tree[rt].sum; + return; + } + int mid=tree[rt].mid(); + if(R<=mid) + query(left,mid,rt<<1,L,R); + else if(L>mid) + query(mid+1,right,rt<<1|1,L,R); + else + { + query(left,mid,rt<<1,L,R); + query(mid+1,right,rt<<1|1,L,R); + } +} +void update(int left,int right,int rt,int pos,int add) +{ + if(left==right) + { + tree[rt].sum+=add; + return; + } + int mid=tree[rt].mid(); + if(pos<=mid) + update(left,mid,rt<<1,pos,add); + else + update(mid+1,right,rt<<1|1,pos,add); + tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum; +} +int main() +{ + int t,n,cnt; + int a,b; + char str[10]; + cnt=1; + scanf("%d",&t); + while(t--) + { + scanf("%d",&n); + btree(1,n,1); + printf("Case %d:\n",cnt++); + while(scanf("%s",str)) + { + if(str[0]=='E') + break; + scanf("%d%d",&a,&b); + if(str[0]=='Q') + { + ans=0; + query(1,n,1,a,b); + printf("%d\n",ans); + } + else if(str[0]=='A') + update(1,n,1,a,b); + else + update(1,n,1,a,-b); + } + } + return 0; +} From 4ec3e239c0d2df0ada3e29b3adf8ccc504b7fe77 Mon Sep 17 00:00:00 2001 From: KiritoTRw <3021577574@qq.com> Date: Thu, 11 Aug 2016 11:22:32 +0800 Subject: [PATCH 2/7] Create 2795_ziyi--caolu.cpp http://www.cnblogs.com/ziyi--caolu/archive/2013/01/16/2862806.html --- HDOJ/2795_ziyi--caolu.cpp | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 HDOJ/2795_ziyi--caolu.cpp diff --git a/HDOJ/2795_ziyi--caolu.cpp b/HDOJ/2795_ziyi--caolu.cpp new file mode 100644 index 0000000..d8f775f --- /dev/null +++ b/HDOJ/2795_ziyi--caolu.cpp @@ -0,0 +1,70 @@ +#include +using namespace std; +#define N 200005 +int h,w,n; +struct +{ + int l,r; + int num; +}tree[N*4]; +int maxn(int h,int n) +{ + if(h>n) + return n; + else + return h; +} +int maxx(int a,int b) +{ + if(a>b) + return a; + else + return b; +} +void creat(int i,int l,int r) +{ + int mid=(l+r)/2; + tree[i].l=l; + tree[i].r=r; + tree[i].num=w; + if(l==r) + return; + creat(i*2,l,mid); + creat(i*2+1,mid+1,r); +} +int gethigh(int len,int i) +{ + if(tree[i].l==tree[i].r) + { + tree[i].num-=len; + return tree[i].l; + } + else + { + int sum1=0,sum2=0; + if(len<=tree[i*2].num) //当海报宽度小于树的左边区域宽度时,说明左边是可以贴海报的 + sum1=gethigh(len,i*2); + else + if(len<=tree[i*2+1].num) //同理,右边也是如此...... + sum2=gethigh(len,i*2+1); + tree[i].num=maxx(tree[i*2].num,tree[i*2+1].num); //需要更新回溯 + return sum1+sum2; + } +} +int main() +{ + while(scanf("%d%d%d",&h,&w,&n)>0) + { + int len; + creat(1,1,maxn(h,n)); + for(int i=1;i<=n;i++) + { + scanf("%d",&len); + if(tree[1].num>=len) + printf("%d\n",gethigh(len,1)); + else + printf("-1\n"); + } + } + return 0; +} From a353cfb27521f7df03549079f492e85a4da6463e Mon Sep 17 00:00:00 2001 From: KiritoTRw <3021577574@qq.com> Date: Thu, 11 Aug 2016 11:23:40 +0800 Subject: [PATCH 3/7] Create 1556_acm_davidcn.cpp From http://blog.csdn.net/acm_davidcn/article/details/5834373 --- HDOJ/1556_acm_davidcn.cpp | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 HDOJ/1556_acm_davidcn.cpp diff --git a/HDOJ/1556_acm_davidcn.cpp b/HDOJ/1556_acm_davidcn.cpp new file mode 100644 index 0000000..8a107ef --- /dev/null +++ b/HDOJ/1556_acm_davidcn.cpp @@ -0,0 +1,53 @@ +#include +#include +#define MAXN 100005 +struct ST +{ + int l,r,sum; +}st[MAXN*3]; +int nn; +void build(int ll,int rr,int n) +{ + st[n].l=ll; + st[n].r=rr; + st[n].sum=0; + if (ll==rr) return ; + int mid=(ll+rr)/2; + build(ll,mid,2*n); + build(mid+1,rr,2*n+1); +}; +void color(int ll,int rr,int n) +{ + if (st[n].l==ll&&st[n].r==rr) {st[n].sum++;return ;} + int mid=(st[n].l+st[n].r)/2; + if (rr<=mid) color(ll,rr,2*n); + else + if (ll>=mid+1) color(ll,rr,2*n+1); + else + { + color(ll,mid,2*n); + color(mid+1,rr,2*n+1); + } +} +void out(int n,int sum) +{ + if (st[n].l==st[n].r) {printf("%d",sum+st[n].sum);if (st[n].l!=nn) printf(" ");return;} + out(2*n,sum+st[n].sum); + out(2*n+1,sum+st[n].sum); +} +int main() +{ + int i,p,q; + while (scanf("%d",&nn)&&nn) + { + build(1,nn,1); + for (i=1;i<=nn;++i) + { + scanf("%d%d",&p,&q); + color(p,q,1); + } + out(1,0); + printf("/n"); + } + return 0; +} From edf3748f9255447ddf3cbca128f48651d83c4bf1 Mon Sep 17 00:00:00 2001 From: KiritoTRw <3021577574@qq.com> Date: Thu, 11 Aug 2016 11:24:44 +0800 Subject: [PATCH 4/7] Create 3264_hcbbt.cpp From http://blog.csdn.net/hcbbt/article/details/38581945 --- HDOJ/3264_hcbbt.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 HDOJ/3264_hcbbt.cpp diff --git a/HDOJ/3264_hcbbt.cpp b/HDOJ/3264_hcbbt.cpp new file mode 100644 index 0000000..e3eac8b --- /dev/null +++ b/HDOJ/3264_hcbbt.cpp @@ -0,0 +1,90 @@ +/* +* Author: illuz +* Blog: http://blog.csdn.net/hcbbt +* File: 3264.cpp +* Create Date: 2014-08-12 20:25:57 +* Descripton: Geometry, the insection of two round, binary +*/ + +#include +#include +#include +#include +#include +using namespace std; +#define repf(i,a,b) for(int i=(a);i<=(b);i++) + +typedef long long ll; + +const int N = 21; +const double PI = acos(-1.0); +const double EPS = 1e-8; + +int t, n; + +struct Round { + double x, y; + double r; +} r[N], ori; + +double dis(const Round &a, const Round &b) { + return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); +} + +double insection_of_rounds(Round &a, Round &b) { + double d = dis(a, b); + if (d >= a.r + b.r) + return 0; + if (d <= fabs(a.r - b.r)) { + double r = a.r < b.r ? a.r : b.r; + return PI * r * r; + } + double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2. / a.r / d); + double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2. / b.r / d); + double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1); + return ret; +} + +bool check(Round& ori) { + repf (i, 0, n - 1) { + if (insection_of_rounds(ori, r[i]) * 2 < PI * r[i].r * r[i].r) + return false; + } + return true; +}; + +double bin(double l, double r, Round& ori) { + double mid; + while (fabs(l - r) >= EPS) { + mid = (l + r) / 2; + ori.r = mid; + if (check(ori)) { + r = mid; + } else { + l = mid + EPS; + } + } + return mid; +} + +int main() { + scanf("%d", &t); + while (t--) { + scanf("%d", &n); + repf (i, 0, n - 1) { + scanf("%lf%lf%lf", &r[i].x, &r[i].y, &r[i].r); + } + double ans = 1e10; + repf (i, 0, n - 1) { + ori.x = r[i].x; + ori.y = r[i].y; + double right = 0; + repf (j, 0, n - 1) { + right = max(right, dis(ori, r[j]) + r[j].r); + } + ans = min(ans, bin(0, right, ori)); + } + printf("%.4f\n", ans); + } + return 0; +} From 194aebba3ea1f7f72b6fceb9f335a84c42e99478 Mon Sep 17 00:00:00 2001 From: KiritoTRw <3021577574@qq.com> Date: Thu, 11 Aug 2016 11:25:24 +0800 Subject: [PATCH 5/7] Create 3530_kuangbin.cpp http://www.cnblogs.com/kuangbin/archive/2012/08/30/2663957.html --- HDOJ/3530_kuangbin.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 HDOJ/3530_kuangbin.cpp diff --git a/HDOJ/3530_kuangbin.cpp b/HDOJ/3530_kuangbin.cpp new file mode 100644 index 0000000..f63e74a --- /dev/null +++ b/HDOJ/3530_kuangbin.cpp @@ -0,0 +1,45 @@ +#include +#include +#include +#include +using namespace std; + +const int MAXN=100010; +int q1[MAXN],q2[MAXN]; +int rear1,head1; +int rear2,head2; +int a[MAXN]; +int main() +{ + // freopen("in.txt","r",stdin); + // freopen("out.txt","w",stdout); + int n,m,k; + + while(scanf("%d%d%d",&n,&m,&k)!=EOF) + { + rear1=head1=0; + rear2=head2=0; + int ans=0; + int now=1; + for(int i=1;i<=n;i++) + { + scanf("%d",&a[i]); + while(head1a[i])rear2--; + q1[rear1++]=i; + q2[rear2++]=i; + while(head1k) + { + if(q1[head1]=m) + { + //int t=min(q1[head1],q2[head2]); + if(ans Date: Thu, 11 Aug 2016 11:27:43 +0800 Subject: [PATCH 6/7] Create 1947_infnty.cpp From GitHub : https://github.com/infnty/acm/blob/master/acm.pku.edu.cn/1947.cc --- POJ/1947_infnty.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 POJ/1947_infnty.cpp diff --git a/POJ/1947_infnty.cpp b/POJ/1947_infnty.cpp new file mode 100644 index 0000000..d804e3d --- /dev/null +++ b/POJ/1947_infnty.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#include +#include +using namespace std; +#define REP(i,n) for(int _REP_N=(n),i=0;i<_REP_N;i++) + +int N, parent[200], kid[200], sib[200], memo[200][200], INF=1<<25; +vector adj[200]; + +int g(int x, int k); + +int f(int x, int k) { + int &res = memo[x][k]; + if (res != -1) return res; + + if (x == 0) return res = (k==0 ? 0 : INF); + + assert(2 <= x && x <= N && k >= 0); + + res = 1 + f(sib[x], k); + + for (int u = 1; u <= k; u++) + res = 0); + int deg = adj[x].size() - (x==1 ? 0 : 1); + if (k == 0) return 0; + if (k == 1) return deg; + if (deg == 0) return INF; + return f(kid[x], k-1); +} + +void dfs(int x, int p) { + parent[x] = p; + kid[x] = 0; + + REP(i, adj[x].size()) { + int y = adj[x][i]; + if (y != p) { + sib[y] = kid[x]; + kid[x] = y; + dfs(y, x); + } + } +} + +int main() { + int P; + scanf("%d %d", &N, &P); + REP(i, N-1) { + int x, y; + scanf("%d %d", &x, &y); + adj[x].push_back(y); + adj[y].push_back(x); + } + + kid[0] = sib[0] = parent[0] = 0; + dfs(1, 0); + + memset(memo, 0xff, sizeof(memo)); + + int res = INF; + for (int x = 1; x <= N; x++) + res Date: Thu, 11 Aug 2016 11:29:35 +0800 Subject: [PATCH 7/7] Create 3533_libin56842.cpp From http://blog.csdn.net/libin56842/article/details/41909459 --- HDOJ/3533_libin56842.cpp | 163 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 HDOJ/3533_libin56842.cpp diff --git a/HDOJ/3533_libin56842.cpp b/HDOJ/3533_libin56842.cpp new file mode 100644 index 0000000..59c58e9 --- /dev/null +++ b/HDOJ/3533_libin56842.cpp @@ -0,0 +1,163 @@ +#include +#include +#include +#include +using namespace std; +#define ads(x) (x<0?-x:x) +int n,m,k,life; +int to[5][2] = {0,1,1,0,0,-1,-1,0,0,0};//四个方向与停止不动的走法 +int map[105][105]; +bool vis[105][105][1005]; + +struct period +{ + char c; + int t,v; +} s[105][105]; + +struct node +{ + int x,y,step; +}; + +int check(int x,int y) +{ + if(x<0 || x>n || y<0 || y>m) + return 1; + return 0; +} + +void bfs() +{ + node a,next; + queue Q; + int i,j,flag,dis,tem; + a.x = a.y = a.step = 0; + Q.push(a); + vis[0][0][0] = true; + while(!Q.empty()) + { + a = Q.front(); + Q.pop(); + if(a.step>life) + break; + if(a.x == n && a.y == m) + { + printf("%d\n",a.step); + return ; + } + for(i = 0; i<5; i++) + { + next = a; + next.x+=to[i][0]; + next.y+=to[i][1]; + next.step++; + if(check(next.x,next.y)) continue; + if(!s[next.x][next.y].t && !vis[next.x][next.y][next.step] && next.step<=life)//在符合条件的情况下,枚举四个方向 + { + flag = 1; + for(j = next.x-1; j>=0; j--)//当位于这点,我们往北向寻找是否有朝南方向射击的炮台 + { + if(s[j][next.y].t && s[j][next.y].c == 'S')//找到第一个炮台,且这个炮台是朝南射击的 + { + dis = next.x-j;//看炮台与人的距离 + if(dis%s[j][next.y].v) break;//因为不需要看子弹中途的点,子弹每一秒跑v,距离是dis,dis不能整除v的话,那么子弹是不可能停在这个点的 + tem = next.step-dis/s[j][next.y].v;//人走的时间减去第一个子弹飞行到这个位置所需的时间 + if(tem<0) break;//为负数就是第一个子弹都没有经过这个点,那么人绝对安全 + if(tem%s[j][next.y].t==0)//看间隔,能整除,那么就是后续有子弹刚好到这个点,人死定了 + { + flag = 0; + break; + } + } + if(s[j][next.y].t)//找到炮台但不是朝南射击,那么这个炮台会当下后面所有子弹,所以北方向安全我们不需要再找 + break; + } + if(!flag)//这个方向都死定了,后面也就不需要看了 + continue; + //其他方向也是一样的道理,就不注释了 + for(j = next.x+1; j<=n; j++) + { + if(s[j][next.y].t && s[j][next.y].c == 'N') + { + dis = j-next.x; + if(dis%s[j][next.y].v) break; + tem = next.step-dis/s[j][next.y].v; + if(tem<0) break; + if(tem%s[j][next.y].t==0) + { + flag = 0; + break; + } + } + if(s[j][next.y].t) + break; + } + if(!flag) + continue; + for(j = next.y-1; j>=0; j--) + { + if(s[next.x][j].t && s[next.x][j].c == 'E') + { + dis = next.y-j; + if(dis%s[next.x][j].v) break; + tem = next.step-dis/s[next.x][j].v; + if(tem<0) break; + if(tem%s[next.x][j].t==0) + { + flag = 0; + break; + } + } + if(s[next.x][j].t) + break; + } + if(!flag) + continue; + for(j = next.y+1; j<=m; j++) + { + if(s[next.x][j].t && s[next.x][j].c == 'W') + { + dis = j-next.y; + if(dis%s[next.x][j].v) break; + tem = next.step-dis/s[next.x][j].v; + if(tem<0) break; + if(tem%s[next.x][j].t==0) + { + flag = 0; + break; + } + } + if(s[next.x][j].t) + break; + } + if(!flag) + continue; + vis[next.x][next.y][next.step] = true; + Q.push(next); + } + } + } + printf("Bad luck!\n"); +} + +int main() +{ + int i,j,x,y,t,v; + char str[3]; + while(~scanf("%d%d%d%d",&n,&m,&k,&life)) + { + memset(s,0,sizeof(s)); + memset(vis,false,sizeof(vis)); + for(i = 0; i