test6 3-21 2021省选模拟赛six

文章目录

  • 考试复盘
  • rng
  • lg
  • pm

考试复盘

第一题,乍一看期望,又不会做了,乍二看,暴力好像可以202020跑路,屁颠屁颠敲完死活过不了这个简单的样例;开始(⊙⊙?)乍三看,实数??完了直接哦豁,麻溜拍拍屁股走人

第二题我一看一坨数学公式,人直接傻掉@_@,这种直接问公式答案的少不了使劲推式子的过程,而且非常了解自己的数学水平,肯定不行;想法肯定会有就是拆gcdgcdgcd的质因子分开算贡献;推了一会儿,发现确实不行,快速暴力下一个(╥╯^╰╥)

第三题有点感觉,自己手玩了几组,找了下规律,感觉跟逆序对个数和区间长度关系挂钩,而且好像都是最多只能减少111,因为相比起来做出第三题的概率更大,两个小时多都在淦这一道,想到了可持久化线段树,差分算区间逆序对个数,下标和值域是同样区间,但是卡在了最后这么找这一段的时间上,只会暴力跳ヽ(○)ノ♪

谁曾想,xez的算法,左扫一遍,又扫一遍,最后变几个能ACACAC,这种做法之高叼!

数学题——就是要敢猜,先猜后证ball哥教的

rng

在这里插入图片描述

考虑对于每个i<ji<ji<j,计算a[i]>a[j]a[i]>a[j]a[i]>a[j]的概率并求和

假设(li,ri)=(l1,r1),(lj,rj)=(l2,r2)(l_i,r_i)=(l_1,r_1),(l_j,r_j)=(l_2,r_2)(li,ri)=(l1,r1),(lj,rj)=(l2,r2)

先从l1=l2=0l_1=l_2=0l1=l2=0入手

r1≤r2r_1\le r_2r1r2,则概率为r12r2=r122r1r2\frac{r_1}{2r_2}=\frac{r_1^2}{2r_1r_2}2r2r1=2r1r2r12

这个实数的概率很像JJ晚上给我做的物理高必刷必修二里面的一道积分滑动摩擦力做功,长度和为nnnmmm个小物块从光滑面滑入粗糙面,利用积分求解的

r1>r2r_1>r_2r1>r2,则概率为1−r22r1=2r1r2−r222r1r21-\frac{r_2}{2r_1}=\frac{2r_1r_2-r_2^2}{2r_1r_2}12r1r2=2r1r22r1r2r22

r22r1\frac{r_2}{2r_1}2r1r2就是假如j<ij<ij<i的逆序对概率,用111减去则为i<ji<ji<j时的逆序对概率

用三个树状数组维护1,x,x21,x,x^21,x,x2

接下来考虑(l1,r1),(l2,r2)(l_1,r_1),(l_2,r_2)(l1,r1),(l2,r2)

容斥答案为f(r1,r2)−f(l1,r2)−f(r1,l2)+f(l1,l2)2(r1−l1)(r2−l2)\frac{f(r_1,r_2)-f(l_1,r_2)-f(r_1,l_2)+f(l_1,l_2)}{2(r_1-l_1)(r_2-l_2)}2(r1l1)(r2l2)f(r1,r2)f(l1,r2)f(r1,l2)+f(l1,l2)

非常常见的二维平面容斥方法

注意不应该直接减概率,fff相当于是合法面积

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100005
#define int long long
#define mod 998244353
pair < int, int > p[maxn][2];
int n, cnt;
int l[maxn], r[maxn], x[maxn << 1], num[2];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}struct node {int val;int t[maxn << 1];int lowbit( int x ) {return x & ( -x );}void add( int x, int y ) {val = ( val + y ) % mod;for( int i = x;i <= cnt;i += lowbit( i ) )t[i] = ( t[i] + y ) % mod;}int query( int x ) {if( x == cnt ) return val;int ans = 0;for( int i = x;i;i -= lowbit( i ) )ans = ( ans + t[i] ) % mod;return ans;}int query( int l, int r ) {return ( query( r ) - query( l - 1 ) ) % mod;}
}A, B, C;#define opt first
#define val secondsigned main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%lld %lld", &l[i], &r[i] );p[i][0] = make_pair( -1, l[i] );p[i][1] = make_pair( 1, r[i] );x[++ cnt] = l[i], x[++ cnt] = r[i];}sort( x + 1, x + cnt + 1 );int ans = 0;for( int i = 1;i <= n;i ++ ) {int inv = qkpow( r[i] - l[i], mod - 2 );pair < int, int > now;for( int j = 0;j <= 1;j ++ ) {now = p[i][j];num[j] = lower_bound( x + 1, x + cnt + 1, now.val ) - x;ans = ( ans + now.opt * C.query( 1, num[j] ) * inv % mod ) % mod;ans = ( ans + now.opt * ( B.query( num[j] + 1, cnt ) * 2 * now.val % mod- A.query( num[j] + 1, cnt ) * now.val % mod * now.val % mod) * inv % mod) % mod; }for( int j = 0;j <= 1;j ++ ) {now = p[i][j];A.add( num[j], now.opt * inv % mod );B.add( num[j], now.opt * now.val * inv % mod );C.add( num[j], now.opt * now.val * now.val % mod * inv % mod );}}ans = ans * qkpow( 2, mod - 2 ) % mod;printf( "%lld\n", ( ans + mod ) % mod );return 0;
}

lg

在这里插入图片描述∏lcmgcd=∏lcm∑d∣xφ(d)\prod lcm^{gcd}=\prod lcm^{\sum_{d|x}φ(d)}lcmgcd=lcmdxφ(d)
指数相加拆出来即为相乘
=∏d∏d∣x∗ilcmφ(d)=∏d(∏x∗i≤⌊md⌋(lcm∗d))φ(d)=\prod_{d}\prod_{d|x*i}lcm^{φ(d)}=\prod_{d}\bigg(\prod_{x*i\le \lfloor\frac{m}{d}\rfloor}(lcm*d)\bigg)^{φ(d)}=ddxilcmφ(d)=d(xidm(lcmd))φ(d)
ddd拆出来
=∏d(∏x∗i≤⌊md⌋lcm)φ(d)∗dφ(d)∗(⌊md⌋)n=\prod_{d}\bigg(\prod_{x*i\le \lfloor\frac{m}{d}\rfloor}lcm\bigg)^{φ(d)}*d^{φ(d)*(\lfloor\frac{m}{d}\rfloor)^n}=d(xidmlcm)φ(d)dφ(d)(dm)n
计算lcmlcmlcm,就单独考虑每个质因子的贡献,用容斥计算,类似于xxx的倍数的个数−-x2x^2x2的倍数的个数…
Damo的题解

#include <cstdio>
#define mod 998244353
#define int long long
#define maxn 200005
int n, m, cnt;
int prime[maxn], phi[maxn];
bool vis[maxn];int qkpow( int x, int y, int Mod ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % Mod;x = x * x % Mod;y >>= 1;}return ans;
}void sieve() {phi[1] = 1;for( int i = 2;i < maxn;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, phi[i] = i - 1;for( int j = 1;j <= cnt && i * prime[j] < maxn;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[j]] = phi[i] * ( prime[j] - 1 );}}
}int calc( int m ) {int ans = 1;for( int i = 1;prime[i] <= m && i <= cnt;i ++ ) {int res = 0;for( int k = 1, p = prime[i];p <= m;k ++, p *= prime[i] )//k容斥系数 注意是在算指数上的质因子的贡献 取模是mod-1res = ( res + k * ( qkpow( m - m / ( p * prime[i] ), n, mod - 1 ) % mod - qkpow( m - m / p, n, mod - 1 ) ) ) % ( mod - 1 );if( res < 0 ) res += ( mod - 1 );ans = ans * qkpow( prime[i], res, mod ) % mod;//每个质因子的贡献相乘 取模是mod}return ans;
}signed main() {sieve();scanf( "%lld %lld", &n, &m );int ans = 1, last = 0, lcm = 0;for( int d = 1;d <= m;d ++ ) {if( ! last || m / d != last ) {//分块last = m / d;lcm = calc( m / d );}ans = ans * qkpow( lcm, phi[d], mod ) % mod * qkpow( d, phi[d] * qkpow( m / d, n, mod - 1 ) % ( mod - 1 ), mod ) % mod;//															指数上的快速幂取模是phi(mod)=mod-1}printf( "%lld\n", ans );return 0;
}

pm

在这里插入图片描述

考虑一个长度最小为lenlenlen的段,一定操作了len−1len-1len1次(否则该段一定可以分成两个更小的段各自独立操作

不然就直接lenlenlen次一一单独变化即可

而且len−1len-1len1次操作后,下标和值就应该一一对应了

问题转换成,在原序列中找出若干不相交的段,每个段的长度等于这个段中的逆序对个数+1+1+1,并且每个段占用的下标和包含的元素集合相同,每个这样的段都能省一次操作

考虑对于每个段右端点(如果有
找到最短的占用下标和包含元素集合相同的段
只有这样的段是候选段

如果选取了更长的段,显然可以用这个段将它分开
并且分开的两段中也恰有一段满足逆序对个数比长度少一

接下来需要对于每个段的右端点rrr,找到最短的段[l,r][l,r][l,r]满足{al,al+1...ar}=[l,r]\{a_l,a_{l+1}...a_{r}\}=[l,r]{al,al+1...ar}=[l,r]

max{al,...,ar}=rmax\{a_l,...,a_r\}=rmax{al,...,ar}=r可以用ststst表预处理

sumi=lrai−i=0sum_{i=l}^ra_i-i=0sumi=lraii=0扫一遍就可以做了,一段区间和为000,说明前lll和前rrr和一样

nxd[l,r]=r−lnxd[l,r]=r-lnxd[l,r]=rl转化为差分

#include <map>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 200005
map < int, int > last;
int n, cnt;
int a[maxn], id[maxn], nxd[maxn], L[maxn], ans[maxn];
int tree[maxn], f[maxn], g[maxn], pre[maxn];
int rt[maxn], t[maxn * 30], lson[maxn * 30], rson[maxn * 30];
int st[maxn][20];int lowbit( int x ) {return x & ( -x );
}void add( int x ) {x = n - x + 1;for( int i = x;i <= n;i += lowbit( i ) )tree[i] ++;
}int query( int x ) {x = n - x + 1;int tot = 0;for( int i = x;i;i -= lowbit( i ) )tot += tree[i];return tot;
}void insert( int pre, int &now, int l, int r, int pos ) {if( ! now ) now = ++ cnt;t[now] = t[pre] + 1;if( l == r ) return;int mid = ( l + r ) >> 1;if( pos <= mid ) rson[now] = rson[pre], insert( lson[pre], lson[now], l, mid, pos );else lson[now] = lson[pre], insert( rson[pre], rson[now], mid + 1, r, pos );
}int query( int now, int l, int r, int L, int R ) {if( L > R ) return 0;if( L <= l && r <= R ) return t[now];int mid = ( l + r ) >> 1;if( R <= mid ) return query( lson[now], l, mid, L, R );else if( mid < L ) return query( rson[now], mid + 1, r, L, R );else return query( lson[now], l, mid, L, R ) + query( rson[now], mid + 1, r, L, R );
}void init() {for( int i = 1;i <= n;i ++ ) st[i][0] = a[i];for( int j = 1;j < 20;j ++ )for( int i = 1;i <= n;i ++ )if( i + ( 1 << j - 1 ) > n ) break;else st[i][j] = max( st[i][j - 1], st[i + ( 1 << j - 1 )][j - 1] );
}int ask( int l, int r ) {int i = log( r - l + 1 ) / log( 2 );return max( st[l][i], st[r - ( 1 << i ) + 1][i] );
}signed main() {scanf( "%lld", &n );int sum = 0;last[0] = 1;for( int i = 1;i <= n;i ++ ) {scanf( "%lld", &a[i] );insert( rt[i - 1], rt[i], 1, n, a[i] );nxd[i] = nxd[i - 1] + query( a[i] + 1 );add( a[i] );sum += a[i] - i;L[i] = last[sum];//上一次sum的位置与现在sum的位置中间的和即为0last[sum] = i + 1;id[a[i]] = i;}init();for( int i = 1;i <= n;i ++ ) {if( L[i] ) {//如果成段int l = L[i], r = i;int tot = nxd[r] - nxd[l - 1] - query( rt[l - 1], 1, n, r + 1, n ) * ( r - l + 1 );//[1,l-1]对于[l,r]区间的逆序对数量就是[1,l-1]中大于r的个数*(r-l+1),[l,r]值出现的位置一定是在区间[l,r]if( tot == r - l && ask( l, r ) == r ) {f[i] = f[pre[l - 1]] + 1;//段数+1g[i] = pre[l - 1];//上一个段的结束位置}}pre[i] = pre[i - 1];//递推传递上一个段的结束位置if( f[pre[i - 1]] < f[i] ) pre[i] = i;//新段的右端点}cnt = 0;int r = pre[n];while( r ) {int l = L[r];for( int i = r;i >= l;i -- )for( int j = id[i];j < i;j ++ ) {swap( id[a[j]], id[a[j + 1]] );swap( a[j], a[j + 1] );ans[++ cnt] = j;}r = g[r];}printf( "%d\n", cnt );for( int i = 1;i <= cnt;i ++ )printf( "%d ", ans[i] );return 0;
}

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

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

相关文章

如何为 .NET Core CLI 启用 TAB 自动补全功能

Intro在 Linux 下经常可以发现有些目录/文件名&#xff0c;以及有些工具可以命令输入几个字母之后按 TAB 自动补全&#xff0c;最近发现其实 dotnet cli 也可以&#xff0c;从.NET Core 2.0 SDK 开始&#xff0c;NET Core CLI 支持 tab 自动补全。你如果已经装了 dotnet Core S…

P8215-[THUPC2022 初赛]分组作业【网络流】

正题 题目链接:https://www.luogu.com.cn/problem/P8215 题目大意 有2n2\times n2n个人&#xff0c;第2i−12\times i-12i−1和第2i2\times i2i个人一组&#xff0c;然后每个人可以选择愿不愿意合作&#xff0c;愿意需要付出cic_ici​代价&#xff0c;不愿意是did_idi​代价&…

.NET IdentityServer4实战-开篇介绍与规划

一.开篇寄语由于假期的无聊&#xff0c;我决定了一个非常有挑战性的活动&#xff0c;也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架&#xff0c;它就是 IdentityServer4 &#xff0c;如果没有意外的话&#xff0c;一定可以顺利的写完的&#xff0c;如果两天写一篇的话…

CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)

解析 很妙的一道题 看这两个南辕北辙的标签就知道这题不简单 看见dp思路还是得打开 一开始其实想到按边权排序了 但卡在了重构树上 遇到dp一定要敢想 勇于和图论等结合 考虑正解 按照边权升序排序 依次加边到图中 并查集维护连通性和集合内的边数 发现&#xff0c;一个联通块…

test5 3-20 2021省选模拟赛five

考试复盘 第一题&#xff1f;&#xff1f;是个什么互动哦&#xff0c;直接乱来的(&#xffe3;&#xffe3;)σ…(&#xff3f;&#xff3f;)ノ&#xff5c;壁 第二题是前几天考过的&#xff0c;所以知道是polyapolyapolya&#xff0c;但是式子推到最后的二项式定理没推对&am…

Cell Phone Network

Cell Phone Network 题意: 每个牧场的电塔可以覆盖与该牧场相邻的电塔&#xff0c;为了让所有牛都可以打电话&#xff0c;求建的电塔的最小数量 题解&#xff1a; 树的最小支配集 dp[x][0]&#xff1a;选点i&#xff0c;并且以点i为根的子树都被覆盖 dp[x][1]&#xff1a;不…

P8207-[THUPC2022 初赛]最小公倍树【Kruskal】

正题 题目链接:https://www.luogu.com.cn/problem/P8207 题目大意 有编号为[L,R][L,R][L,R]区间的点&#xff0c;连接两个点x,yx,yx,y边权的为LCM(x,y)LCM(x,y)LCM(x,y)&#xff0c;求这张图的最小生成树。 1≤L≤R≤106,R−L≤1051\leq L\leq R\leq 10^6,R-L\leq 10^51≤L≤…

微信小程序开发必看,《使用 .NET Core + DevOps 开发微信跨平台应用》,苏州.NET俱乐部课程分享...

【课程名称】《使用 .NET Core DevOps 开发微信跨平台应用》【老师介绍】苏震巍&#xff0c;苏州盛派网络CEO&#xff0c;微软最有价值专家&#xff08;MVP&#xff09;、微软 Ignite 技术大会讲师&#xff0c;Senparc.Weixin作者&#xff0c;《微信开发深度解析》等书作者。苏…

11.14 模拟:总结

update 等出分挂大分再回来打脸 一语成谶了属于是 给自己测了一下 《很棒》 真就挂了大分 实际得分&#xff1a; 00020 T1和T3都挂没了 qwq T1是因为两个背包的定义是不一样的&#xff01; 我应该做两个背包分别跑就好了 T3全部MLE… 我最后十分钟想贪一个T3的第五个点 然后…

P8208-[THUPC2022 初赛]骰子旅行【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8208 题目大意 给出nnn个点若干条边的一张图中&#xff0c;一个人在111开始随机游走ttt步。 如果他到达一个点他曾经到达过的点&#xff0c;那么就会产生它上次在这个点走向的点的编号的贡献。 求期望贡献。 1≤n≤100,1≤…

Axial symmetry FZU - 2035

Axial symmetry FZU - 2035 题意&#xff1a; 给一个多边形&#xff0c;边平行于x轴或者y&#xff0c;问是否存在对称轴 题解&#xff1a; 将每个点的坐标&#xff0c;以及每个边的中点的坐标&#xff0c;按照顺时针顺序存入&#xff0c;多边形的对称轴一定穿过对应两个点&…

test 7 3-22 2021省选模拟赛seven

文章目录考试复盘人生赢家黑红兔考试复盘 T1T1T1 subtask1:n≤5subtask1:n\le 5subtask1:n≤5&#xff0c;暴搜点的颜色状态以及边的存在状态 对于一条连接相同颜色点的边&#xff0c;可要可不要&#xff0c;不会提供形态变化的贡献&#xff0c;2edge2^{edge}2edge dpdpdp&…

Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】

最近在做公司的项目的时候&#xff0c;开始把部分程序迁移到EF Core&#xff0c;然后有了一些感触&#xff0c;趁着还没忘却&#xff0c;还是先记录下来。EF Core还在成长中&#xff0c;我写这个的时候&#xff0c;版本是2.2。如果对着已有的EF 5/6来说&#xff0c;还有很多功能…

CF1413C Perform Easily(two pointers)

解析 巧夺天工 可以说是把two pointers玩明白了 把所有的可能减出来的结果升序排列一下 然后一个选取区间合法当且仅当这个区间含有1-n所有数的至少一个可能的差 然后就可以two pointers了 #include<bits/stdc.h> const int N2e5100; const int mod1e97; #define ll lon…

CF1039E-Summer Oenothera Exhibition【LCT,根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/CF1039E 题目大意 给出nnn个数的序列&#xff0c;mmm次询问至少将这个序列分成多少段才能满足每一段的和不超过w−qiw-q_iw−qi​。 1≤n,m≤105,1≤w,ai≤1091\leq n,m\leq 10^5,1\leq w,a_i\leq 10^91≤n,m≤105,1≤w,ai​…

E - Another Postman Problem FZU - 2038

E - Another Postman Problem FZU - 2038 题意&#xff1a; n个点通过n-1个边两两相连&#xff0c;每个边有权值&#xff0c;求对于每个点到其他点的距离和的总和 题解&#xff1a; 我们以下图中的1-2这条边为例子&#xff0c;1-2这条边一共计算了几次&#xff1f; 我们现在…

CF1034E Little C Loves 3 III(神仙构造+FWT_OR卷积)

title 题目 solution 先说很神仙的结论构造&#xff1a;对于aia_iai​&#xff0c;aivi∗4pop_count(i)a_iv_i*4^{pop\_count(i)}ai​vi​∗4pop_count(i)&#xff0c;bbb同理 ci∑j∣kiai∗bjc_i\sum_{j|ki}a_i*b_jci​∑j∣ki​ai​∗bj​&#xff0c;则ansi≡ci4pop_coun…

ASP.NET Core 3.0 项目开始“瘦身”

新的 ASP.NET Core 项目使用名为Microsoft.AspNetCore.App的综合包。该包也可以称为“ASP.NET Core 共享框架”&#xff0c;其背后的基本思想是&#xff0c;包括一个典型的应用程序所需要的所有东西。但是&#xff0c;如果看看该包的依赖项&#xff0c;对“需要”的定义看起来相…

CF1415D:XOR-gun(异或)

这就是CF 解析 这题真的是… …很妙 qwq 考虑到&#xff0c;如果相邻的连续三个二进制最高位相同&#xff0c;那么把后两个异或一下就可以打成目标 而如果不存在连续打三个二进制最高位相同的数&#xff0c;由于ai≤109a_i\leq10^9ai​≤109&#xff0c;所以n必然不超过60 前…

CF1369F-BareLee【博弈论,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1369F 题目大意 TTT次游戏&#xff0c;每次给出一个sss和ttt&#xff0c;两个人轮流操作&#xff0c;可以让ss1ss1ss1或者ss2ss\times 2ss2&#xff0c;如果s>ts>ts>t的话那个人就输了。 每次输的人将作为下一次的…