百度之星Astar Round2A

All X

等比数列求和一下 A/B MOD C = A MOD (B*C) / B  或者分治一下

Sitting in Line

状压+拓扑dp

dp(i, j)表示当前二进制状态为j,当前状态的最后一个数字是a[i],然后按照拓扑序dp进行更新,并用一个bool数组记录是否在队列中。

网上还有其他优美的姿势,按某种枚举方式可以达到拓扑序。

 1 #include <bits/stdc++.h>
 2 typedef long long ll;
 3 using namespace std;
 4 int a[20], p[20], n; //输入的第i个数是否固定
 5 int vis[20], now[20];//输出的第i个数是否确定
 6 ll dp[16][1<<16];
 7 bool isin[16][1<<16];
 8 struct P{
 9     int x, y;
10     P(){}
11     P(int x, int y):x(x), y(y){}
12 };
13
14 int main(){
15     int T, ca = 1;
16     cin>>T;
17     while(T--){
18         memset(vis, 0, sizeof(vis));
19         cin>>n;
20         for(int i = 0; i < n; i++){
21             cin>>a[i]>>p[i];
22             if(p[i] != -1){
23                 vis[ p[i] ] = true;
24                 now[ p[i] ] = i;
25             }
26         }
27
28         memset(dp, 0x80, sizeof(dp));
29         memset(isin, 0, sizeof(isin));
30         queue<P> Q;
31         if(vis[0]){
32             dp[ now[0] ][ 1<<now[0] ] = 0;
33             isin[ now[0] ][ 1<<now[0] ] = true;
34             Q.push( P(now[0], 1<<now[0]) );
35         }
36         else{
37             for(int i = 0; i < n; i++)
38                 if(p[i] == -1){
39                     dp[i][1<<i] = 0;
40                     isin[i][1<<i] = true;
41                     Q.push( P(i, 1<<i) );
42                 }
43         }
44
45         for(int i = 1; i < n; i++){//pos
46             int size = Q.size();
47             for(int j = 0; j < size; j++){
48                 P pp = Q.front();
49                 Q.pop();
50                 if(vis[i]){
51                     dp[ now[i] ][ pp.y|(1<<now[i]) ] = max(dp[ now[i] ][ pp.y|(1<<now[i]) ] , dp[pp.x][pp.y]+a[pp.x]*a[ now[i] ]);
52                     if(isin[ now[i] ][ pp.y|(1<<now[i]) ] == false)
53                         Q.push( P(now[i], pp.y|(1<<now[i])) ), isin[ now[i] ][ pp.y|(1<<now[i]) ] = true;
54                 }
55                 else{
56                     for(int k = 0; k < n; k++){
57                         if( (pp.y&(1<<k)) == 0&&p[k] == -1){
58                             dp[k][pp.y|(1<<k)] = max(dp[k][pp.y|(1<<k)] , dp[pp.x][pp.y]+a[pp.x]*a[k]);
59                             if(isin[ k ][ pp.y|(1<<k) ] == false)
60                                 Q.push( P(k, pp.y|(1<<k)) ), isin[ k ][ pp.y|(1<<k) ] = true;
61                         }
62                     }
63                 }
64             }
65         }
66
67         ll ans = -1e17;
68         for(int i = 0; i < n; i++)
69             ans = max(ans, dp[i][ (1<<n)-1 ]);
70         printf("Case #%d:\n", ca++);
71         cout<<ans<<endl;
72     }
73     return 0;
74 }

BD String

从某个点断开后,后面的部分折到前面来,刚好和前面部分的后半段拼成一个整体。

 1 #include <bits/stdc++.h>
 2 typedef long long ll;
 3 using namespace std;
 4
 5 ll getsum(ll x){
 6     if(x <= 2)
 7         return x;
 8
 9     ll fir = 1;
10     while( fir*2 <= x)
11         fir <<= 1;
12
13     return 1LL+x-fir + getsum( fir-(x-fir)-1 );
14 }
15 int main(){
16     int t, ca = 1;
17     ll l, r;
18     cin>>t;
19     while(t--){
20         cin>>l>>r;
21         ll ans = getsum(r)-getsum(l-1);
22         cout<<ans<<endl;
23     }
24     return 0;
25 }

Gym Class

SB拓扑排序即可。

时间: 2024-10-06 16:03:21

百度之星Astar Round2A的相关文章

2016&quot;百度之星&quot; - 初赛(Astar Round2A)解题报告

此文章可以使用目录功能哟↑(点击上方[+]) 有点智商捉急,第一题卡了好久,看来不服老,不服笨是不行的了...以下是本人目前的题解,有什么疑问欢迎提出 链接→2016"百度之星" - 初赛(Astar Round2A)  Problem 1001 All X Accept: 0    Submit: 0 Time Limit: 2000/1000 mSec(Java/Others)    Memory Limit : 65536 KB  Problem Description F(x,

2016&quot;百度之星&quot; - 资格赛(Astar Round1) Problem D 简单题

Problem D Accepts: 1527 Submissions: 4307 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如,如果一个人名字

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含

hdu 5685 Problem A(2016&quot;百度之星&quot; - 资格赛(Astar Round1)——线段树)

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5685 Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 564    Accepted Submission(s): 236 Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长

HDU 5698 瞬间移动 (2016&quot;百度之星&quot; - 初赛(Astar Round2B) 1003)

传送门 瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 66 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案

2016百度之星 补题记

2016"百度之星" - 复赛(Astar Round3) 拍照 思路:先把所有的线段投影到x轴,然后将所有线段的起末坐标存进数组,排序后从坐标最小开始枚举.如果遇到起点标志,就加一:结束点标志减一.如此即可求出同一时刻,遇到当前线段结束点时,有多少线段包含在内 /************************************************************** Problem:hdu 5417 User: youmi Language: C++ Result

2016百度之星总结帖

2016百度之星总结帖 测试赛 选的2015资格赛的部分题目,第二题字符串处理,第三题map计数 1001 大搬家 f f (x) = x 两次置换后回到原位 dp a->b && b->a,考虑n个数 如果它独自成对,那么就有s[n-1]: 如果它与前面某个成对,首先可以有n-1个可取,然后每个都有s[n-2]: 故s[n] = s[n-1] + (n-1)s[n-2]; 1004 放盘子 今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子

2016-5-21 letwetell Round3 (百度之星初赛,dfs序)

halfapri(- o -)Y { 1.2016百度之星Round2A 题目链接 题解链接 1001 All X 循环节 1002 Sitting in Line 状压dp 1003 Snacks 1004 D Game 1005 BD String 找规律 1006 Gym Class 贪心+topo 2.2012多校第7场 hdu4366 Successor 线段树 + dfs序 }

【百度之星2014~复赛)解题报告】The Query on the Tree

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~复赛)解题报告]The Query on the Tree>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=673 前言