分成K个块,每个块内部dfs解决,然后用树状数组统计第i个元素前面有多少怪物已经消失,来计算当前的下标

 #include<bits/stdc++.h>

 #define inf 0x3f3f3f3f

 const int maxn=;

 using namespace std;

 typedef pair<int,char> P;

 vector<P> G[maxn+];

 int n;

 int k;

 int a[maxn+];

 int b[maxn+];

 int c[maxn+];

 int d[maxn+];

 int si[maxn+];

 int lowbit(int x){
return x&(-x);
} void add(int x,int val){
while(x<=n){
d[x]+=val;
x+=lowbit(x);
}
} int sum(int x){
int res=;
while(x){
res+=d[x];
x-=lowbit(x);
}
return res;
} int flag; int solve(int x,int y,int s){
// printf("%d\n",s);
if(s==b[x]){
return ;
}
//printf("%d %d\n",y,s);
for(int i=y+;i<=c[x];i++){
if(a[i]==inf) continue;
if(a[i]!=a[y]){
//printf("%d %d\n",i,y);
if(a[y]>a[i]){
// printf("%d %d\n",y,i);
int temp=a[i];
int temp1=a[y];
a[i]+=a[y];
a[y]=inf;
add(y,);
//printf("%d %d %d\n",y,y-sum(y)+1,sum(y));
G[x].push_back(P(y-sum(y)+,'R'));
//printf("%d %d %d %d\n",x,i,y,s+temp);
if(solve(x,i,s+temp)){
// printf("dsasd\n");
return ;
} else {
a[i]=temp;
a[y]=temp1;
add(y,-);
G[x].erase(G[x].end()-);
return ;
}
}
else {
// printf("%d %d\n",i,y);
int temp=a[i];
int temp1=a[y];
a[y]+=a[i];
a[i]=inf;
add(i,);
G[x].push_back(P(i-sum(i)+,'L'));
// printf("%d %d\n",y,s+temp);
if(solve(x,y,s+temp)){
return ;
} else {
a[i]=temp;
a[y]=temp1;
add(i,-);
G[x].erase(G[x].end()-);
return ;
}
} } else break;
}
for(int i=y-;i>c[x-];i--){
if(a[i]==inf) continue;
// printf("%d %d\n",i,y);
if(a[i]!=a[y]){
if(a[y]>a[i]){
int temp=a[i];
int temp1=a[y];
a[i]+=a[y];
a[y]=inf;
add(y,);
G[x].push_back(P(y-sum(y)+,'L'));
if(solve(x,i,s+temp)){
return ;
} else {
a[i]=temp;
a[y]=temp1;
add(y,-);
G[x].erase(G[x].end()-);
return ;
}
}
else {
int temp=a[i];
int temp1=a[y];
a[y]+=a[i];
a[i]=inf;
add(i,);
G[x].push_back(P(i-sum(i)+,'R'));
if(solve(x,y,s+temp)){
return ;
} else {
a[i]=temp;
a[y]=temp1;
add(i,-);
G[x].erase(G[x].end()-);
return ;
}
} } else break;
}
for(int i=c[x-]+;i<=c[x];i++){
if(a[i]!=inf&&i!=y&&a[i]!=a[y]){
//printf("%d %d\n",i,s);
if(solve(x,i,a[i])) return ;
}
}
return ;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&k);
for(int i=;i<=k;i++){
scanf("%d",&b[i]);
}
int cnt=;
int temp=;
for(int i=;i<=n;i++){
if(temp<b[cnt]){
temp+=a[i];
si[cnt]++;
}
if(temp==b[cnt]){
c[cnt]=i;
cnt++;
temp=;
} else if(temp>b[cnt]) {
flag=;
break;
}
}
if(flag||cnt!=k+){
printf("NO\n");
} else {
for(int i=;i<=k;i++){
if(si[i]==) continue;
int f=;
for(int j=c[i-]+;j<c[i];j++){
if(a[j]!=a[j+]){
if(solve(i,j,a[j])){
f=;
break;
} else {
f=;
break;
}
}
}
if(!f){
if(solve(i,c[i],a[c[i]])){
f=;
}
}
if(!f){
printf("NO\n");
return ;
}
}
printf("YES\n");
for(int i=;i<=k;i++){
for(int j=;j<G[i].size();j++){
printf("%d %c\n",G[i][j].first,G[i][j].second);
}
}
}
return ;
}

codeforcesRound378C-dfs+树状数组的更多相关文章

  1. Weak Pair (dfs+树状数组)

    Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...

  2. codeforces 1076E Vasya and a Tree 【dfs+树状数组】

    题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...

  3. hdu 5877 (dfs+树状数组) Weak Pair

    题目:这里 题意: 给出一个n个结点的树和一个数k,每个结点都有一个权值,问有多少对点(u,v)满足u是v的祖先结点且二者的权值之积小于等于k. 从根结点开始dfs,假设搜的的点的权值是v,我们需要的 ...

  4. 2016 大连网赛---Weak Pair(dfs+树状数组)

    题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 Problem Description You are given a rooted ...

  5. POJ 3321 Apple Tree (DFS + 树状数组)

    题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...

  6. hdu_5877_Weak Pair(离散+DFS+树状数组)

    题目链接:hdu_5877_Weak Pair 题意: 给你一棵树,让你找有多少对满足那两个条件的weak pair 题解: 有人用Treap,我不会,然后我用树状数组+离散来替代Treap,用DFS ...

  7. HDU - 5877 Weak Pair (dfs+树状数组)

    题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...

  8. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  9. CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  10. HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化

    http://acm.hdu.edu.cn/listproblem.php?vol=49 给定一颗树,然后对于每一个节点,找到它的任何一个祖先u,如果num[u] * num[v] <= k.则 ...

随机推荐

  1. BZOJ 1650 [Usaco2006 Dec]River Hopscotch 跳石子:二分

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1650 题意: 数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次条都从一个石 ...

  2. 基于node.js及express实现中间件,实现post、get

    首先,当然是有必要的环境,安装node,这个我就不多说了. 依赖模块: "express": "^4.13.4", "request": & ...

  3. struts2的通配符与动态方法调用

    1.Action标签中的method属性 我们知道action默认的执行的方法是execute方法,但是一个action只执行一个方法我们觉得有点浪费,我们希望在一个action中实现同一模块的不同功 ...

  4. leetcode 169. Majority Element 多数投票算法(Boyer-Moore Majority Vote algorithm)

    题目: Given an array of size n, find the majority element. The majority element is the element that ap ...

  5. less语言特性

    作为CSS的一种扩展,LESSCSS不仅向下兼容CSS的语法,而且连新增的特性也是使用CSS的语法.这样的设计使得学习LESS很轻松,而且你可以在任何时候回退到CSS. 变量 很容易理解: @nice ...

  6. dmidecode 命令

    dmidecode                                                 #  查看全面硬件信息dmidecode | grep "Product ...

  7. BZOJ-3626:LCA(离线+树链剖分)

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

  8. ACM学习历程——POJ3321 Apple Tree(搜索,线段树)

          Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will ...

  9. configured to save RDB snapshots, but is currently not able to persist o...

    Redis问题 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on d ...

  10. Codeplus2017 12月赛——可做题1

    题目:https://www.luogu.org/problemnew/show/P4030 可以发现一个矩阵是巧妙矩阵当且仅当其所有二阶子矩阵都是巧妙矩阵: 将不巧妙的二阶矩阵计为1,维护二维前缀和 ...