1002 Rikka with Cake (思维)
http://acm.hdu.edu.cn/showproblem.php?pid=6681
题意
给你一个蛋糕 问你切k刀后分成多少块
思路
块数 = 交点数+1
树状数组维护横线有多少条 竖线去统计
队友代码
#include
#define ll long long
using namespace std;
struct code
{
ll sum,l,r;
} tree[500005];
struct node
{
ll id,up,down;
} xline[100005],yline[100005];
ll numx,numy;
ll tx[100005],ty[100005];
ll n,m,t;
void buid(ll t,ll l,ll r)
{
tree[t].l=l;
tree[t].r=r;
if(l==r)
{
tree[t].sum=0;
return ;
}
ll mid=(l+r)/2;
buid(2*t,l,mid);
buid(2*t+1,mid+1,r);
tree[t].sum=tree[t*2].sum+tree[2*t+1].sum;
}
void update(ll t,ll p,ll d)
{
if(tree[t].l==tree[t].r)
{
tree[t].sum+=d;
return ;
}
ll mid=(tree[t].l+tree[t].r)/2;
if(p<=mid)
update(2*t,p,d);
else
update(2*t+1,p,d);
tree[t].sum=tree[t*2].sum+tree[2*t+1].sum;
}
ll queuy(ll t,ll l,ll r)
{
if(tree[t].l==l&&tree[t].r==r)
return tree[t].sum;
ll mid=(tree[t].l+tree[t].r)/2;
if(r<=mid)
return queuy(2*t,l,r);
else if(l>mid)
return queuy(2*t+1,l,r);
else
return queuy(2*t,l,mid)+queuy(2*t+1,mid+1,r);
}
bool cmp(node a,node b)
{
if(a.id!=b.id)
return a.id>t;
while(t--)
{
init();
cin>>n>>m>>k;
for(ll i=0; i>x>>y>>ch;
tx[i]=x,ty[i]=y;
if(ch=='U')
{
yline[numy].id=x;
yline[numy].up=m;
yline[numy++].down=y;
}
else if(ch=='D')
{
yline[numy].id=x;
yline[numy].up=y;
yline[numy++].down=0;
}
else if(ch=='L')
{
xline[numx].id=y;
xline[numx].up=x;
xline[numx++].down=0;
}
else
{
xline[numx].id=y;
xline[numx].up=n;
xline[numx++].down=x;
}
}
tx[k]=0,tx[k+1]=n;
ty[k]=0,ty[k+1]=m;
sort(tx,tx+k+2);
sort(ty,ty+k+2);
sort(xline,xline+numx,cmp);
sort(yline,yline+numy,cmp);
buid(1,1,k+2);
int topx=0,topy=0;
for(int i=1; ip[100005];
for(int i=0; i<=topy; i++)
{
int txp=lower_bound(tx,tx+k+2,yline[i].id)-tx+1;
int upy=upper_bound(ty,ty+k+2,yline[i].up)-ty+1;
int downy=lower_bound(ty,ty+k+2,yline[i].down)-ty+1;
p[downy].push_back(node{txp,1,0});
p[upy].push_back(node{txp,-1,0});
}
int top=0;
for(int i=1; i<=k+2; i++)
{
int len=p[i].size();
for(int j=0; jtopx)
break;
}
cout<
1005 Rikka with Game (博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=6684
题意
一个字符串 两个人进行操作 每个人都能选择让某个字母变大一下 或 结束游戏
先手要使字典序尽可能小 后手使字典序尽可能大 输出字符串是什么
代码
#include
using namespace std;
string s;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
cin>>s;
for(int i = 0;i < s.length();i++)
{
if(s[i] != 'y')
{
if(s[i] < 'y') break;
else if(s[i] == 'z')
{
s[i] = 'b';
break;
}
}
}
cout<
1006 Rikka with Coin (枚举)
http://acm.hdu.edu.cn/showproblem.php?pid=6685
题意
有价值为10 20 50 100的货币 至少需要多少张可以凑够n个数任意一个
思路
暴力枚举10 20 50的个数 去验证最小需要100的张数
代码
#include
using namespace std;
const int maxn = 110;
typedef long long ll;
int a[maxn];
int dp[maxn][5];
int n;
int ok(int x,int y,int z)
{
int MAX = 0;
for(int id = 1;id <= n;id++)
{
int MIN = 0x3f3f3f3f;
for(int i = 0;i <= x;i++)
for(int j = 0;j <= y;j++)
for(int k = 0;k <= z;k++)
{
int x = a[id] - i * 10 - j * 20 - k * 50;
if(x >= 0&&x % 100 == 0)
{
MIN = min(MIN,x / 100);
}
}
MAX = max(MAX,MIN);
}
return MAX + x + y + z;
}
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
cin>>n;
int f = 0;
for(int i = 1;i <= n;i++)
{
cin>>a[i];
if(a[i] % 10)
{
f = 1;
}
}
if(f)
{
cout<<"-1"<
1007 Rikka with Travels (换根DP)
http://acm.hdu.edu.cn/showproblem.php?pid=6686
题意
在树上选两条链 不能相交 问有多少种不同的二元组
思路
1 换根dp
代码
#include
using namespace std;
const int maxn = 1e5+100;
typedef long long ll;
int n;
vector G[maxn];
int f[maxn][3],g[maxn][3];
int p;
struct node
{
int l,r;
}qw[maxn*10];
bool cmp(node a,node b)
{
if(a.l == b.l) return a.r < b.r;
else return a.l < b.l;
}
void dfs(int u,int fa)
{
f[u][0] = f[u][1] = f[u][2] = 1;
g[u][0] = g[u][1] = 0;
int len = G[u].size();
for(int i = 0;i < len;i++)
{
int v = G[u][i];
if(v == fa) continue;
dfs(v,u);
f[u][2] = max(f[u][2],f[v][0]+1);
if(f[u][2]>f[u][1]) swap(f[u][2],f[u][1]);
if(f[u][1]>f[u][0]) swap(f[u][1],f[u][0]);
g[u][1] = max(g[u][1],max(g[v][0],f[v][0]+f[v][1]-1));
if(g[u][1]>g[u][0]) swap(g[u][1],g[u][0]);
}
}
void dfs2(int u,int fa)
{
int len = G[u].size();
for(int i = 0;i < len;i++)
{
int v = G[u][i];
if(v == fa) continue;
int l,r,len;
l = max(f[v][0]+f[v][1]-1,g[v][0]);
if(f[u][0] == f[v][0] + 1)
{
r = f[u][1] + f[u][2] - 1;
len = f[u][1] + 1;
}
else
{
if(f[u][1] == f[v][0] + 1) r = f[u][0] + f[u][2] - 1;
else r = f[u][0] + f[u][1] - 1;
len = f[u][0] + 1;
}
if(g[u][0] == max(f[v][0]+f[v][1]- 1,g[v][0])) r = max(r,g[u][1]);
else r = max(r,g[u][0]);
qw[++p].l = -l,qw[p].r = r;
qw[++p].l = -r,qw[p].r = l;
g[v][1] = max(g[v][1],r);
if(g[v][1] > g[v][0]) swap(g[v][1],g[v][0]);
f[v][2] = max(f[v][2],len);
if(f[v][2]>f[v][1]) swap(f[v][2],f[v][1]);
if(f[v][1]>f[v][0]) swap(f[v][1],f[v][0]);
dfs2(v,u);
}
}
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
cin>>n;
for(int i = 1;i <= n;i++) G[i].clear();
for(int i = 1;i < n;i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
p = 0;
dfs2(1,0);
sort(qw+1,qw+1+p,cmp);
ll ans = 0;
ll r = qw[1].r;
ans = abs(qw[1].l * qw[1].r);
for(int i = 2;i <= p;i++)
{
if(qw[i].r <= r) continue;
ans += (qw[i].r-r)*abs(qw[i].l);
r = qw[i].r;
}
cout<