[2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

文章目录

  • CF1251C Minimize The Integer
  • acwing164:可达性统计
  • Facebook Hacker Cup 2016 Round 1 Boomerang Tournament
  • [Zjoi2012]小蓝的好友(mrx)

CF1251C Minimize The Integer

…………………

给你一个大整数aaa,它由nnn位数字,也可能有前导零。

现在给你一种操作规则:如果相邻的两个数字的奇偶性不同,那么你就可以交换它们。

现在可以做任意次操作(可能一次都不做),求出通过这些操作可以获得的最小整数是多少。

答案可以包含前导零


observation : 相邻位才能交换,且要奇偶不同,所以同奇偶间的顺序一定不会改变(不满足交换条件)

奇偶不同之间的数就可以相互交换

这其实是一个归并排序的过程,两个队列模拟即可


#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define maxn 300005
queue < int > odd, even, ans;
char s[maxn];
int n;int main() {scanf( "%s", s + 1 );n = strlen( s + 1 );for( int i = 1;i <= n;i ++ ) {int x = s[i] - '0';if( x & 1 ) odd.push( x );else even.push( x );}while( ! odd.empty() and ! even.empty() ) {if( odd.front() < even.front() ) ans.push( odd.front() ), odd.pop();else ans.push( even.front() ), even.pop();}while( ! odd.empty() ) ans.push( odd.front() ), odd.pop();while( ! even.empty() ) ans.push( even.front() ), even.pop(); while( ! ans.empty() ) printf( "%d", ans.front() ), ans.pop();return 0;
}

acwing164:可达性统计

给定一张nnn个点mmm条边的有向无环图,你需要分别统计从每个点出发能够到达的点的数量


observation : 保证是有向无环图,明显可以用拓扑解决有向图问题

但是很有可能多个点到的点有重复,那么单纯的用dpidp_idpi(iii所能到达的点)进行累加便不可取,会算重

数据范围n≤30000n\le 30000n30000,发现n2/32n^2/32n2/32其实是可以接受的

那么就可以用bitset优化,直接记录能到达的点集,那么转移就是取并

最后统计1的个数就行,这就直接知道到哪些点,便不会算重了


#include <iostream>
#include <bitset>
#include <vector>
#include <cstdio>
#include <queue>
#include <map>
using namespace std;
#define maxn 30005
map < pair < int, int >, int > mp;
bitset < maxn > dp[maxn];
vector < int > G[maxn];
queue < int > q;
int n, m;
int ans[maxn], d[maxn];int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );if( mp[make_pair( u, v )] ) continue;else mp[make_pair( u, v )] = 1;G[v].push_back( u );d[u] ++;}for( int i = 1;i <= n;i ++ ) if( ! d[i] ) q.push( i );while( ! q.empty() ) {int u = q.front(); q.pop();dp[u][u] = 1;for( auto v : G[u] ) {d[v] --;dp[v] |= dp[u];if( ! d[v] ) q.push( v );}}for( int i = 1;i <= n;i ++ )printf( "%d\n", dp[i].count() );return 0;
}

Facebook Hacker Cup 2016 Round 1 Boomerang Tournament

这个周末,期待已久的BIT(回旋镖邀请赛)将举行!NNN个回旋镖选手将随机配对,进行单淘汰赛。

可以按以下方式解释这种锦标赛规则:

  1. NNN个选手以某种顺序排列在队列中(有序列表)
  2. 如果队列当前仅包含111个选手,则比赛结束,该选手作为冠军
  3. 否则,取出排在队列最前面的222名选手,让他们比赛
  4. 比赛的获胜者重新插入到队列的最后面
  5. 从步骤222重复

当第iii个和第jjj个选手比赛时

  • 如果Wi,j=1W_{i,j} = 1Wi,j=1时则第iii个选手将获胜
  • 否则,第j个选手将获胜。
  • 请注意,对于所有(1≤i,j≤N),Wi,j=0/1(1≤i,j≤N),W_{i,j}= 0/11ijNWi,j=0/1,并且Wi,i=0W_{i,i}= 0Wi,i=0(无论如何也不会与自己对战),并且Wi,j≠Wj,iW~i,j~≠W~j,i~W ij =W ji (如果i≠ji ≠ji=j

注意: A击败B,B击败C,C击败A是有可能的

比赛结束后,每个选手都会获得排名(即使他们在比赛中没能幸存下来)

某个选手T的排名是一个整数,这个整数比排在他前面的且离他最近的某个选手S排名大1,

S赢得比赛的场数严格大于T赢得比赛的场数.

因为初始对局的顺序未知,所以对于每个选手,想知道他们最终可能会获得的最好(最小)和最差(最大)排名.

T,n≤16T,n\le 16T,n16,保证nnn2的幂


最坏名次很好求,只要有人能打败他,他就可以在第一轮被淘汰

最好名次用状压

dps,i:dp_{s,i}:dps,i: 在对抗人数集合为sss状态时,iii成为最后胜者的可行性0/1 不可以/可以

  • 显然对抗人数一定是222的幂,这可以剪枝掉很多不必要的状态

写法尝试了很多种

  • 写法一

    枚举状态sss,枚举iii,再枚举状态ttt,并保证s,ts,ts,t111个数一样(是同一层的角逐),还要枚举jjj表示ttt的优胜者

    就算加了很多剪枝,判断优胜者是否属于集合,是否可行

    但仍有很多不必要的枚举

  • 优化写法一后的写法二

    bitkbit_kbitk111的个数为kkk的所有集合sss

    numsnum_snumssss状态中为111的位置,相当于预处理出所有参赛人员,最后的优胜者一定对应位置为111

    nnn达到161616的时候s,ts,ts,t的枚举还是会超时

  • 优化写法二的最终写法

    枚举状态nownownow,以及该层比赛的上一次比赛(半决赛)sss,通过⨁\bigoplus可以求得另一半决赛的状态ttt

    然后枚举两场半决赛的各自的优胜者

    根据优胜者之间ggg的关系,决出最后的胜者成为nownownow状态的优胜者

    再配合上一下集合完全包含的剪枝即可通过了

n=16n=16n=16状态数为655366553665536剪枝后又无法承受平方的枚举

但是如果枚举一次后,里面枚举的只有一半,状态数就会锐减为282^828

最后对于每一个iii找出自己是优胜者的所有比赛中参赛人员最多的(111最多的状态)

就是最好成绩


#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
vector < int > bit[20], num[1 << 20];
int dp[1 << 16][20], g[20][20];
int T, n;
bool ok[20];int lowbit( int x ) { return x & -x; }int main() {ok[1] = ok[2] = ok[4] = ok[8] = ok[16] = 1;scanf( "%d", &T );for( int Case = 1;Case <= T;Case ++ ) {scanf( "%d", &n );for( int i = 0;i < n;i ++ )for( int j = 0;j < n;j ++ )scanf( "%d", &g[i][j] );memset( dp, 0, sizeof( dp ) );for( int i = 0;i < n;i ++ ) dp[1 << i][i] = 1;for( int i = 1;i <= n;i ++ ) bit[i].clear();for( int s = 1;s < ( 1 << n );s ++ ) if( ! ok[__builtin_popcount( s )] ) continue;else {bit[__builtin_popcount( s )].push_back( s );if( num[s].size() ) continue;elsefor( int i = 0;i < n;i ++ )if( s >> i & 1 ) num[s].push_back( i );}for( int k = 2;k <= n;k <<= 1 )for( int now : bit[k] )for( int s : bit[k >> 1] ) {if( ( now & s ) != s ) continue;int t = now ^ s;if( s > t ) continue;for( int i : num[s] ) {if( ! dp[s][i] ) continue;for( int j : num[t] ) {if( ! dp[t][j] ) continue;if( g[i][j] ) dp[now][i] = 1;else dp[now][j] = 1;}}}printf( "Case #%d:\n", Case );for( int i = 0;i < n;i ++ ) {bool flag = 1;for( int j = 0;j < n;j ++ )if( i == j ) continue;else flag &= g[i][j];int best, worst, cnt = 0;if( flag ) worst = 1;else worst = ( n >> 1 ) + 1;for( int s = 1;s < ( 1 << n );s ++ )if( dp[s][i] ) cnt = max( cnt, __builtin_popcount( s ) );if( cnt == n ) best = 1;else if( cnt == ( n >> 1 ) ) best = 2;else if( cnt == ( n >> 2 ) ) best = 3;else if( cnt == ( n >> 3 ) ) best = 5;else best = 9;printf( "%d %d\n", best, worst );}}return 0;
}

[Zjoi2012]小蓝的好友(mrx)

终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物——小蓝的好友。

在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得的暑假。与小蓝不同,小蓝的好友并不想将时间花在旅游上,而是盯上了最近发行的即时战略游戏——SangoCraft。但在前往通关之路的道路上,一个小游戏挡住了小蓝的好友的步伐。

“国家的战争其本质是抢夺资源的战争”是整款游戏的核心理念,这个小游戏也不例外。简单来说,用户需要在给定的长方形土地上选出一块子矩形,而系统随机生成了N个资源点,位于用户所选的长方形土地上的资源点越多,给予用户的奖励也越多。悲剧的是,小蓝的好友虽然拥有着极其优秀的能力,但同时也有着极差的RP,小蓝的好友所选的区域总是没有一个资源点。

终于有一天,小蓝的好友决定投诉这款游戏的制造厂商,为了搜集证据,小蓝的好友想算出至少包含一个资源点的区域的数量。作为小蓝的好友,这自然是你分内之事。

Input

第一行包含两个由空格隔开的正整数R,C,N,表示游戏在一块[1,R]x[1,C]的地图上生成了N个资源点

接下来有N行,每行包含两个整数 x,y,表示这个资源点的坐标(1<=x<=R,1<=Y<=c)

Output

输出文件应仅包含一个整数,表示至少包含一个资源点的区域的数量

具体的说,设N个资源点的坐标为(i=1…n),你需要计算有多少个四元组(LB,DB,RB,UB)满足1<=LB<=RB<=R,1<=DB<=UB<=C,且存在一个i使得LB<=Xi<=RB,DB<=Yi<=UB均成立

Sample Input

5 5 4
1 2
2 3
3 5
4 1

Sample Output

139

Hint

【数据范围】

对于100%的数据,R,C<=40000,N<=100000,资源点的位置两两不同,且位置为随机生成


首先转换成,总矩阵数量减去一条鱼都不包含的矩阵数量

然后枚举每一行iii,当做矩阵的底

这就有点像求最大全111矩阵了

对于每一列处理出在iii行以上最近的鱼的距离,当成这一列的高

那这就是刚做的笛卡尔树了

在这里插入图片描述

根据笛卡尔树的根,把左右儿子分开独立计算

贡献为(h[x]−h[fa[x]])∗siz[x]∗(siz[x]+1)/2(h[x]-h[fa[x]])*siz[x]*(siz[x]+1)/2(h[x]h[fa[x]])siz[x](siz[x]+1)/2

在这里插入图片描述

当枚举行往下移的时候,相当于整体+1,如果某列在当前枚举行有鱼,高度设为000就可以了

相当于对笛卡尔树进行两种操作,全局+1和单点修改为000

这可以用fhq-treap暴力不动树

但是笛卡尔树作为一种二叉树,又满足小根堆性质,发现用带旋treap维护树不会改变本质


#include <cstdio>
#include <vector>
using namespace std;
#define maxn 100005
#define int long long
#define lson t[x].son[0]
#define rson t[x].son[1]
vector < int > g[maxn];
struct node { int l, r, h, f, tag, siz, son[2]; }t[maxn];
int dp[maxn];
int n, m, N;int calc( int x ) { return x * ( x + 1 ) >> 1; }void pushup( int x ) {t[x].siz = t[lson].siz + t[rson].siz + 1;dp[x] = dp[lson] + dp[rson] + ( t[x].h - t[t[x].f].h ) * calc( t[x].siz );
}void rotate( int x ) {int fa = t[x].f;int Gfa = t[fa].f;int k = t[fa].son[1] == x;if( Gfa ) t[Gfa].son[t[Gfa].son[1] == fa] = x;t[x].f = Gfa;t[fa].son[k] = t[x].son[k ^ 1];t[t[x].son[k ^ 1]].f = fa;t[x].son[k ^ 1] = fa;t[fa].f = x;if( t[fa].son[k] ) pushup( t[fa].son[k] );pushup( fa );pushup( x );
}void add( int x, int val ) {t[x].h += val;t[x].tag += val;pushup( x );
}void pushdown( int x ) {if( t[x].f ) pushdown( t[x].f );if( lson ) add( lson, t[x].tag );if( rson ) add( rson, t[x].tag );t[x].tag = 0; 
}int build( int l, int r ) {if( l > r ) return 0;int x = ( l + r ) >> 1;lson = build( l, x - 1 );rson = build( x + 1, r );if( lson ) t[lson].f = x;if( rson ) t[rson].f = x;pushup( x );return x;
}signed main() {scanf( "%lld %lld %lld", &n, &m, &N );int rt = build( 1, m );for( int i = 1, x, y;i <= N;i ++ ) {scanf( "%lld %lld", &x, &y );g[x].push_back( y );}int ans = 0;for( int i = 1;i <= n;i ++ ) {add( rt, 1 );for( int x : g[i] ) {pushdown( x );while( t[x].f ) rotate( x );t[x].h = 0;if( lson ) pushup( lson );if( rson ) pushup( rson );pushup( x );rt = x;}ans += dp[rt];}printf( "%lld\n", calc( n ) * calc( m ) - ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Entity Framework 的一些性能建议

点击上方蓝字关注“汪宇杰博客”这是一篇我在2012年写的老文章&#xff0c;至今适用&#xff08;没错&#xff0c;我说的就是适用于EF Core&#xff09;。因此使用微信重新推送&#xff0c;希望能帮到大家。自从我用了EF&#xff0c;每次都很关心是否有潜在的性能问题。所以每次…

AND 0, Sum Big CodeForces - 1514B

AND 0, Sum Big CodeForces - 1514B 题意&#xff1a; 构造一个含n个k位二进制数的序列&#xff0c;使得序列中所有数按位与的结果为0&#xff0c;且序列和最大&#xff0c;求构造方案数。 题解&#xff1a; 对于n个数的每一位&#xff0c;都至少有个0&#xff0c;这样可以…

CF438E:The Child and Binary Tree(生成函数)

解析&#xff1a; 设计 fif_ifi​ 表示权值为 iii 的方案数&#xff0c;f01f_01f0​1。 枚举根节点权值&#xff0c;可以写出转移&#xff1a; fn∑gk∑ififn−k−i∑ijknfifjgkf_n\sum g_k\sum_{i}f_if_{n-k-i}\sum_{ijkn}f_if_jg_kfn​∑gk​i∑​fi​fn−k−i​ijkn∑​fi​…

[2021-09-04 AtCoder Beginner Contest 217] 题解

文章目录A - Lexicographic OrderB - AtCoder QuizC - Inverse of PermutationD - Cutting WoodsE - Sorting QueriesF - Make PairG - Groups网址链接A - Lexicographic Order 签到题 #include <cstdio> #include <iostream> using namespace std; int main() {…

微软内部全面拥抱开源流程Inner Source

微软过去几年一直是 GitHub 平台上开源贡献者最多的公司。不仅如此&#xff0c;微软还将继续拥抱开源&#xff0c;内部有一项名为 Inner Source 的计划&#xff0c;将开源开发流程引入到公司内部。事实上&#xff0c;Inner Source 已经存在于微软内部多年&#xff0c;包括更多代…

洛谷P5110:块速递推(特征根方程、光速幂)

解析 去你的搬砖生成函数&#xff0c;特征根太香了。 一开始我是用生成函数解的&#xff0c;和特征根相比有亿点点搬砖… 但是这个东西原理似乎使用一些神奇的等比差分&#xff0c;有些玄学&#xff0c;生成函数较易理解。 背下来背下来&#xff01; 就以本题为情境讲一下特征…

Product 1 Modulo N CodeForces - 1514C

Product 1 Modulo N CodeForces - 1514C 题意&#xff1a; 在[1,n-1]中选x个数&#xff0c;使得乘积mod n 1&#xff0c;求x的最大值&#xff0c;并输出所选的数 题解&#xff1a; 我们设S为所选x个数的乘积 S%n 1说明gcd(S,n)1,即所选的x个数均与n互质&#xff0c;如果不…

k8s使用helm打包chart并上传到腾讯云TencentHub

本文只涉及Helm的Chart操作&#xff0c;不会对其他知识进行过多描述。至于安装这块&#xff0c;麻烦自行百度吧&#xff0c;一大堆呢。在容器化的时代&#xff0c;我们很多应用都可以部署在docker&#xff0c;很方便&#xff0c;而再进一步&#xff0c;我们还有工具可以对docke…

数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

文章目录[ZJOI2008]骑士[IOI2008] Island[NOIP2018 提高组] 旅行 加强版CF1454E Number of Simple PathsTraffic Network in NumazuCard Game基环树的常见解法若干个基环树互相独立断环为链&#xff08;随便断一条&#xff09;环外树和环外树之间的树形DP环变链后整体可以用数据…

1090. 绿色通道

1090. 绿色通道 题意&#xff1a; n个题&#xff0c;每个题所花时间为ai&#xff0c;最多只用不超过t分钟做这个&#xff0c;肯定会有题目做不完&#xff0c;下标连续的一些空题称为一个空题段&#xff0c;问在t分钟内最长的空题段至少有多长&#xff1f; 题解&#xff1a; …

模板:BSGS(数论)

所谓 BSGS&#xff0c;就是北上广深。 &#xff08;逃&#xff09; BSGS 给出 a,b,pa,b,pa,b,p&#xff0c;请处出满足 ax≡b(modp)a^x\equiv b\pmod pax≡b(modp) 的最小非负正数解或者报告无解。 a,b,p≤109,gcd⁡(a,p)1a,b,p\le 10^9,\gcd(a,p)1a,b,p≤109,gcd(a,p)1 由于 …

如何在ASP.NET Core中自定义Azure Storage File Provider

主题&#xff1a;如何在ASP.NET Core中自定义Azure Storage File Provider作者&#xff1a; Lamond Lu地址: https://www.cnblogs.com/lwqlun/p/10406566.html项目源代码&#xff1a; https://github.com/lamondlu/AzureFileProvider背景ASP.NET Core是一个扩展性非常高的框架…

splay/fhq-treap 问卷调查反馈—— [JSOI2008]火星人prefix(splay),Strange Queries(fhq-treap)

文章目录[JSOI2008]火星人prefixStrange Queries[JSOI2008]火星人prefix BZOJ1014 思路很好想&#xff0c;哈希字符串即可 只是平衡树的码量大 注意因为splay加入哨兵的原因&#xff0c;每个点在平衡树内的排名比真实排名大111&#xff08;有极小值的占位&#xff09; 考虑…

AcWing 1091. 理想的正方形

AcWing 1091. 理想的正方形 题意&#xff1a; 有一个 ab 的整数组成的矩阵&#xff0c;现请你从中找出一个 nn 的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 题解&#xff1a; 前置知识&#xff1a;已经学会了一维的单调队列优化dp 在本题中要求…

美好生活从撸好代码开始

楔子 昨天晚上做了个梦&#xff0c;梦到老板对我说了一番道理&#xff0c;他说对家庭要用爱心&#xff0c;做人对社会要有包容心&#xff0c;对工作要有责任心&#xff0c;对老板要有同理心。 我深以为然。现在的老板确实太不容易了&#xff0c;尤其是作为一家承载梦想&#xf…

模板:莫比乌斯反演(数论)

文章目录前言整除分块代码积性函数线性筛狄利克雷卷积莫比乌斯反演trick所谓莫比乌斯反演&#xff0c;就是莫比乌斯进行的反演 &#xff08;逃&#xff09; 前言 在一些需要整除的式子和 gcd⁡,lcm⁡\gcd,\operatorname{lcm}gcd,lcm 等问题中发挥作用。 整除分块 整除分块是…

[TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)

2021-09-07 test[TJOI2013]拯救小矮人「ICPC World Finals 2019」Hobson 的火车[TJOI2013]拯救小矮人 luogu4823 考试题目的数据加强为2e5&#xff0c;所以此题做法应为O(nlog⁡n)O(n\log n)O(nlogn)的反悔贪心 这种有多元属性&#xff0c;选择最优的问题 如果发现简单的贪心…

Dotnet全平台下APM-Trace探索

随着支撑的内部业务系统越来越多&#xff0c;向着服务化架构进化&#xff0c;在整个迭代过程中&#xff0c;会逐渐暴露出以下问题。传统依赖于应用服务器日志等手段的排除故障原因的复杂度越来越高&#xff0c;传统的监控服务已经无法满足需求。终端--> Nginx --> IIS --…

生成函数全家桶

文章目录有用的式子1.&#xff08;牛顿二项式定理&#xff09;2.普通生成函数&#xff08;OGF&#xff09;常见封闭形式&#xff1a;1.2.3.4.指数生成函数&#xff08;EGF&#xff09;排列与圆排列有用的式子 1.&#xff08;牛顿二项式定理&#xff09; 我们把组合数的定义推…

2020年牛客多校第五场C题-easy(纯组合计数不要生成函数的做法)

文章目录descriptionsolutioncodedescription 有TTT组测试数据 对于两个长度为KKK的数列{a}\{a\}{a}和{b}\{b\}{b}&#xff0c;满足∑i1KaiN,∑i1KbiM\sum_{i1}^Ka_iN,\sum_{i1}^Kb_iM∑i1K​ai​N,∑i1K​bi​M 对于这两个数列&#xff0c;定义权值为P∏i1Kmin⁡(ai,bi)P\p…