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.则 ...
随机推荐
- BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579 题意: 给你一个无向图,n个点,m条边,每条边有边权w[i]. 你可以将其中的k(k ...
- BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1673 题意: 有n个砝码(n <= 1000),重量为w[i]. 你要从中选择一些砝 ...
- http://www.cnblogs.com/henw/archive/2012/01/06/2314870.html
C#多线程学习 之 线程池[ThreadPool] 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 ...
- python-多线程2-线程同步
线程同步: 一个场景: 一个列表里所有元素都是0,线程A从后向前把所有元素改成1,而线程B负责从前往后读取列表并打印. 那么,可能线程A开始改的时候,线程B便来打印列表了,输出就变成一半0一半1,这就 ...
- ACM学习历程—NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推)
Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m. ...
- dataguard 下主备 online redo 与 standby redo log resize 重建
环境说明: 本实验环境是一个节点的rac + 单节点 asm dg database 与 grid 版本是 11.2.0.4 .提别提醒 如果是多节点集群,操作时需要特别注意 thread . ...
- BZOJ1758:[WC2010]重建计划
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem. ...
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- Spring 3.1新特性之三:Spring对声明式缓存的支持
一.概述: Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如EHCache 或者 OSCache),而是一个对缓 ...
- java 最佳实践
一: 不要直接new一个thread,应当使用线程池.使用线程池的时候应当对线程数量大小合理设置,一般最大不超过50个,当然还需要考虑你的IO和CPU,怎么分析网上搜搜吧. 二:容器类变量,如果变化比 ...