CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法
来源:互联网 发布:js touchevent 编辑:程序博客网 时间:2024/05/18 17:58
题意:
给你一个数组A,是否能组成给定的数组B
合成规则:
必须是大数合小数,大数和小数后,大数的值变成大数+小数
合成时数字会自动向前补齐
注意:
合成的时候数字的位置会发生改变
思路:
1.
先从左到右划分一遍数组A,如果不能整分,A数组肯定不能被合成B数组。划分后每个区间对应合成B数组中的一个值
2.
再暴搜每一个小区间,看能不能按规则合成出每个区间要合成的那个数。
同时把搜到的可行的方法保存下来
注意:如果有任何一个区间不能合成直接返回NO
3.
最后输出的时候要注意,由于合成的这个过程,数字的位置发生了变化。
我的方法是假设数字不自动移位,只是在合成的过程中将原来的位置留空。那么我们用树状数组做一下查询就可以知道前面空了几个位置。
原来的位置减去前面的空位置就是当前的位置。
代码:
#include <bits/stdc++.h>using namespace std;typedef struct Node{ int pos; int dir; Node(int po,int di){ pos=po; dir=di; }}Node;const int MAXN=600;int c[MAXN];int lowbit(int x){ return x&(-x);}void modify(int x,int add){ while(x<=MAXN){ c[x]+=add; x+=lowbit(x); }}int get_sum(int x){ int ret=0; while(x!=0){ ret+=c[x]; x-=lowbit(x); } return ret;}int n,a[MAXN],b[MAXN],m;int st,en,v;bool dfsflag;int cuuuut;int sub[MAXN];vector <Node> ans[MAXN];void ini(){ memset(c,0,sizeof(c)); for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i=0;i<m;i++) scanf("%d",&b[i]); for(int i=0;i<m;i++) ans[i].clear(); cuuuut=0; sub[0]=0;}int divi(int cut,int pos){ int sum=0; for(int i=pos;i<n;i++){ sum+=a[i]; if(sum==cut){ return i+1; }else if(sum>cut){ return 0; } } return 0;}void dfs(int sum,int pos,int le,int ri,vector<Node>way){ if(pos<st||pos>en) return ; sum+=a[pos]; if(dfsflag||sum==v){ dfsflag=1; ans[cuuuut++]=way; return; } if(a[le]<sum){ vector<Node>lway=way; lway.push_back(Node(pos,0)); dfs(sum,le,le-1,ri,lway); } if(dfsflag) return ; if(a[ri]<sum){ vector<Node>rway=way; rway.push_back(Node(pos,1)); dfs(sum,ri,le,ri+1,rway); } return ;}bool judge(){ dfsflag=0; for(int i=st;i<=en;i++){ vector<Node>way; way.clear(); dfs(0,i,i-1,i+1,way); if(dfsflag) return 1; } return 0;}bool sovle(){ int pos=0; for(int i=0;i<m;i++){ int res=divi(b[i],pos); if(!res) return 0; else{ v=b[i]; st=pos; en=res-1; sub[cuuuut+1]=en-st; if(judge()) pos=res; else return 0; } } if(pos==n) return 1; return 0;}void output(){ for(int i=0;i<m;i++){ vector<Node>::iterator it; for(it=ans[i].begin();it!=ans[i].end();it++){ if(it->dir){ int pos=it->pos+1; cout<<pos-get_sum(pos)<<' '<<'R'<<endl; modify(pos,1); } else{ int pos=it->pos+1; cout<<pos-get_sum(pos)<<' '<<'L'<<endl; modify(pos,1); } } }}int main(){ while(cin>>n){ ini(); if(!sovle()) cout<<"NO"<<endl; else{ cout<<"YES"<<endl; output(); } }}
0 0
- CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法
- 【Codeforces 733C】 Epidemic in Monstropolis 【贪心】
- 【16.52%】【codeforces 733C】Epidemic in Monstropolis
- Codeforces 733C Epidemic in Monstropolis
- 733C. Epidemic in Monstropolis codeforces(模拟)
- codeforces 733C Epidemic in Monstropolis 贪心
- CodeForces 733C - Epidemic in Monstropolis
- 【Codeforces 733 C. Epidemic in Monstropolis】+ 模拟
- Codeforces 733C Epidemic in Monstropolis
- Codeforces 733C Epidemic in Monstropolis 构造+思维
- Codeforces 733 C. Epidemic in Monstropolis By Assassin
- CodeForces 733 C.Epidemic in Monstropolis(贪心)
- [codeforces] C. Epidemic in Monstropolis 复杂模拟
- codeforce#378C. Epidemic in Monstropolis(模拟+分块+树状数组)
- codeforces #378C(733.C) Epidemic in Monstropolis
- Codeforces Round #378 (Div. 2)-C. Epidemic in Monstropolis
- Codeforces Round #378 (Div. 2)C. Epidemic in Monstropolis
- codeforces 773C Epidemic in Monstropolis(贪心?构造?模拟?乱搞!)
- kafka high-level consumer 多线程访问异常
- ThinkPHP框架入门
- 2009 Multi-University Training Contest 8 - Host by BJNU
- 第十章 选路信息协议rip
- 第十一章 开放式最短路径优先ospf
- CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法
- 第十二章 边界网关协议bgp
- R语言学习笔记(5)
- 重新认识synchronized(上)
- 【水题】hdoj1282回文数猜想
- 第十三章 internet组播
- 树的基本概念
- 第十四章 移动ip
- HTML笔记(第二部分)