mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
commit
d560e9d537
90
HDOJ/1166_cszlg.cpp
Normal file
90
HDOJ/1166_cszlg.cpp
Normal 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
53
HDOJ/1556_acm_davidcn.cpp
Normal 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
70
HDOJ/2795_ziyi--caolu.cpp
Normal 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
90
HDOJ/3264_hcbbt.cpp
Normal 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
45
HDOJ/3530_kuangbin.cpp
Normal 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
163
HDOJ/3533_libin56842.cpp
Normal 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,距离是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<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
72
POJ/1947_infnty.cpp
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user