codeforcesRound378C-dfs+树状数组
分成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+树状数组的更多相关文章
- Weak Pair (dfs+树状数组)
Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值.另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) ...
- codeforces 1076E Vasya and a Tree 【dfs+树状数组】
题目:戳这里 题意:给定有n个点的一棵树,顶点1为根.m次操作,每次都把以v为根,深度dep以内的子树中所有的顶点(包括v本身)加x.求出最后每个点的值为多少. 解题思路:考虑到每次都只对点及其子树操 ...
- hdu 5877 (dfs+树状数组) Weak Pair
题目:这里 题意: 给出一个n个结点的树和一个数k,每个结点都有一个权值,问有多少对点(u,v)满足u是v的祖先结点且二者的权值之积小于等于k. 从根结点开始dfs,假设搜的的点的权值是v,我们需要的 ...
- 2016 大连网赛---Weak Pair(dfs+树状数组)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=5877 Problem Description You are given a rooted ...
- POJ 3321 Apple Tree (DFS + 树状数组)
题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...
- hdu_5877_Weak Pair(离散+DFS+树状数组)
题目链接:hdu_5877_Weak Pair 题意: 给你一棵树,让你找有多少对满足那两个条件的weak pair 题解: 有人用Treap,我不会,然后我用树状数组+离散来替代Treap,用DFS ...
- HDU - 5877 Weak Pair (dfs+树状数组)
题目链接:Weak Pair 题意: 给出一颗有根树,如果有一对u,v,如果满足u是v的父节点且vec[u]×vec[v]<=k,则称这对结点是虚弱的,问这棵树中有几对虚弱的结点. 题解: 刚开 ...
- HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...
- 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,求所有操作完毕后,所有节点的值 ...
- HDU 5877 Weak Pair DFS + 树状数组 + 其实不用离散化
http://acm.hdu.edu.cn/listproblem.php?vol=49 给定一颗树,然后对于每一个节点,找到它的任何一个祖先u,如果num[u] * num[v] <= k.则 ...
随机推荐
- 苹果手机app试玩赚钱平台汇总
注意: 微信扫码下载,绑定手机号和微信.才能提现 每天3点更新任务,4点最多! | 平台 | 提现额 | 任务量| 推荐强度 | 扫码 | 1.小鱼,10元,大量,强推! →点开扫码 2.天天飞燕,5 ...
- Spring笔记02(3种加载配置文件的方式)
1.不使用Spring的实例: 01.Animal接口对应的代码: package cn.pb.dao; /** * 动物接口 */ public interface Animal { //吃饭 St ...
- MySQL文本处理函数2_20160921
需求:从目前的 test_a03order 表里面提取出来产品规格,押金的数据 一.首先添加表字段我们在表里面添加这两个字段 命名为product_size,deposit 后期进行更新这两个字段内 ...
- Codeforces 756C Nikita and stack
Codeforces 756C Nikita and stack 题目大意: 给定一个对栈进行操作的操作序列,初始时序列上没有任何操作,每一次将一个本来没有操作的位置变为某一操作(push(x),po ...
- SpringMVC之七:SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- JS---计算两个日期之间相差多少天
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- leetcode Word Break-单词划分
题目描述: 给定一个字符串s和一组单词,确定这个字符串是否能够进行这样一种划分,划分后所有的子字符串均来自给定的单词组.例如s = “leetcode” ,dict = {“leet”,“code”} ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- 【245】◀▶IEW-Unit10
Unit 10 Censorship 1. Model1题目及范文分析 Some parents believe that there is no harm in allowing their chi ...
- day1 java基础回顾-Junit单元测试
Junit单元测试框架的基本使用 一.搭建环境: 导入junit.jar包(junit4) 二.写测试类: 0,一般一个类对应一个测试类. 1,测试类与被测试类最好是放到同一个包中(可以是不同的源文件 ...