博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforcesRound378C-dfs+树状数组
阅读量:5014 次
发布时间:2019-06-12

本文共 4685 字,大约阅读时间需要 15 分钟。

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

1 #include
2 3 #define inf 0x3f3f3f3f 4 5 const int maxn=1000; 6 7 using namespace std; 8 9 typedef pair
P; 10 11 vector

G[maxn+10]; 12 13 int n; 14 15 int k; 16 17 int a[maxn+10]; 18 19 int b[maxn+10]; 20 21 int c[maxn+10]; 22 23 int d[maxn+10]; 24 25 int si[maxn+10]; 26 27 int lowbit(int x){ 28 return x&(-x); 29 } 30 31 void add(int x,int val){ 32 while(x<=n){ 33 d[x]+=val; 34 x+=lowbit(x); 35 } 36 } 37 38 int sum(int x){ 39 int res=0; 40 while(x){ 41 res+=d[x]; 42 x-=lowbit(x); 43 } 44 return res; 45 } 46 47 int flag; 48 49 int solve(int x,int y,int s){ 50 // printf("%d\n",s); 51 if(s==b[x]){ 52 return 1; 53 } 54 //printf("%d %d\n",y,s); 55 for(int i=y+1;i<=c[x];i++){ 56 if(a[i]==inf) continue; 57 if(a[i]!=a[y]){ 58 //printf("%d %d\n",i,y); 59 if(a[y]>a[i]){ 60 // printf("%d %d\n",y,i); 61 int temp=a[i]; 62 int temp1=a[y]; 63 a[i]+=a[y]; 64 a[y]=inf; 65 add(y,1); 66 //printf("%d %d %d\n",y,y-sum(y)+1,sum(y)); 67 G[x].push_back(P(y-sum(y)+1,'R')); 68 //printf("%d %d %d %d\n",x,i,y,s+temp); 69 if(solve(x,i,s+temp)){ 70 // printf("dsasd\n"); 71 return 1; 72 } else { 73 a[i]=temp; 74 a[y]=temp1; 75 add(y,-1); 76 G[x].erase(G[x].end()-1); 77 return 0; 78 } 79 } 80 else { 81 // printf("%d %d\n",i,y); 82 int temp=a[i]; 83 int temp1=a[y]; 84 a[y]+=a[i]; 85 a[i]=inf; 86 add(i,1); 87 G[x].push_back(P(i-sum(i)+1,'L')); 88 // printf("%d %d\n",y,s+temp); 89 if(solve(x,y,s+temp)){ 90 return 1; 91 } else { 92 a[i]=temp; 93 a[y]=temp1; 94 add(i,-1); 95 G[x].erase(G[x].end()-1); 96 return 0; 97 } 98 } 99 100 } else break;101 }102 for(int i=y-1;i>c[x-1];i--){103 if(a[i]==inf) continue;104 // printf("%d %d\n",i,y);105 if(a[i]!=a[y]){106 if(a[y]>a[i]){107 int temp=a[i];108 int temp1=a[y];109 a[i]+=a[y];110 a[y]=inf;111 add(y,1);112 G[x].push_back(P(y-sum(y)+1,'L'));113 if(solve(x,i,s+temp)){114 return 1;115 } else {116 a[i]=temp;117 a[y]=temp1;118 add(y,-1);119 G[x].erase(G[x].end()-1);120 return 0;121 }122 }123 else {124 int temp=a[i];125 int temp1=a[y];126 a[y]+=a[i];127 a[i]=inf;128 add(i,1);129 G[x].push_back(P(i-sum(i)+1,'R'));130 if(solve(x,y,s+temp)){131 return 1;132 } else {133 a[i]=temp;134 a[y]=temp1;135 add(i,-1);136 G[x].erase(G[x].end()-1);137 return 0;138 }139 }140 141 } else break;142 }143 for(int i=c[x-1]+1;i<=c[x];i++){144 if(a[i]!=inf&&i!=y&&a[i]!=a[y]){145 //printf("%d %d\n",i,s);146 if(solve(x,i,a[i])) return 1;147 }148 }149 return 0;150 }151 152 int main()153 {154 scanf("%d",&n);155 for(int i=1;i<=n;i++){156 scanf("%d",&a[i]);157 }158 scanf("%d",&k);159 for(int i=1;i<=k;i++){160 scanf("%d",&b[i]);161 }162 int cnt=1;163 int temp=0;164 for(int i=1;i<=n;i++){165 if(temp

b[cnt]) {174 flag=1;175 break;176 }177 }178 if(flag||cnt!=k+1){179 printf("NO\n");180 } else {181 for(int i=1;i<=k;i++){182 if(si[i]==1) continue;183 int f=0;184 for(int j=c[i-1]+1;j

View Code

 

转载于:https://www.cnblogs.com/GeniusYang/p/6018168.html

你可能感兴趣的文章
Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)
查看>>
红黑树-想说爱你不容易
查看>>
【题目】英文字符进行频率的统计,直方图输出
查看>>
LeetCode-Binary Tree Level Order Traversal
查看>>
COM组件开发实践
查看>>
yii2 源码分析1从入口开始
查看>>
浅谈网站推广
查看>>
Away3D基础之摄像机
查看>>
Leetcode 128. Longest Consecutive Sequence
查看>>
程序员必须知道的几个Git代码托管平台
查看>>
导电塑料入梦来
查看>>
C# 线程手册 第五章 扩展多线程应用程序 - 什么是线程池
查看>>
考研路茫茫--单词情结 - HDU 2243(AC自动机+矩阵乘法)
查看>>
HTTP运行期与页面执行模型
查看>>
tableView优化方案
查看>>
近期思考(2019.07.20)
查看>>
Apache2.4使用require指令进行访问控制
查看>>
冗余关系_并查集
查看>>
做最好的自己(Be Your Personal Best)
查看>>
如何搭建github+hexo博客-转
查看>>