Merge pull request #26 from KiritoTRw/master

Problems added.
This commit is contained in:
Kirigaya Kazuto 2016-08-11 11:30:34 +08:00 committed by GitHub
commit d560e9d537
7 changed files with 583 additions and 0 deletions

90
HDOJ/1166_cszlg.cpp Normal file
View File

@ -0,0 +1,90 @@
/*简单说下这个题,题目意思很明显,线段树的单点更新,线段树,听大牛们说,线段树一般变化最大的就是询问,和更新,所以,大家只要把询问和更新给弄明白了,这题也就明白了,还有,线段树对递归要求有点高,递归不是很熟的同学,最好去把递归复习几遍,附上代码*/
#include<stdio.h>
#include<string.h>
#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;
}

53
HDOJ/1556_acm_davidcn.cpp Normal file
View File

@ -0,0 +1,53 @@
#include<stdio.h>
#include<string.h>
#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;
}

70
HDOJ/2795_ziyi--caolu.cpp Normal file
View File

@ -0,0 +1,70 @@
#include<iostream>
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;
}

90
HDOJ/3264_hcbbt.cpp Normal file
View File

@ -0,0 +1,90 @@
/*
* Author: illuz <iilluzen[at]gmail.com>
* 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 <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
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;
}

45
HDOJ/3530_kuangbin.cpp Normal file
View File

@ -0,0 +1,45 @@
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
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(head1<rear1&&a[q1[rear1-1]]<a[i])rear1--;//这里的等号取和不取都可以的
while(head2<rear2&&a[q2[rear2-1]]>a[i])rear2--;
q1[rear1++]=i;
q2[rear2++]=i;
while(head1<rear1&&head2<rear2&&a[q1[head1]]-a[q2[head2]]>k)
{
if(q1[head1]<q2[head2])now=q1[head1++]+1;
else now=q2[head2++]+1;
}
if(head1<rear1&&head2<rear2&&a[q1[head1]]-a[q2[head2]]>=m)
{
//int t=min(q1[head1],q2[head2]);
if(ans<i-now+1)ans=i-now+1;
}
}
printf("%d\n",ans);
}
return 0;
}

163
HDOJ/3533_libin56842.cpp Normal file
View File

@ -0,0 +1,163 @@
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
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<node> 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距离是disdis不能整除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<k; i++)
{
scanf("%s%d%d%d%d",str,&t,&v,&x,&y);
s[x][y].v = v;
s[x][y].t = t;
s[x][y].c = str[0];
}
bfs();
}
return 0;
}

72
POJ/1947_infnty.cpp Normal file
View File

@ -0,0 +1,72 @@
#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <sstream>
#include <vector>
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<int> 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 <?= g(x, u) + f(sib[x], k-u);
return res;
}
int g(int x, int k) {
assert(1 <= x && x <= N && k >= 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 <?= g(x,P) + (x==1 ? 0 : 1);
printf("%d\n", res);
}