牛客IOI周赛26-提高组(逆序对,对序列,未曾设想的道路) 题解

文章目录

  • 逆序对
  • 对序列
  • 未曾设想的道路

牛客IOI周赛26-提高组

逆序对

这种套路之前已经见过几次了,肯定不是模拟操作数列

  • opt 1

    对于i∈[1,l)⋃(r,n]i∈[1,l)\bigcup(r,n]i[1,l)(r,n] 逆序对是不影响的

    对于i∈(l,r)i∈(l,r)i(l,r)l/rl/rl/r的情况会反转,之前是逆序对以后便不是,反之同理

    逆序对的改变情况为222(偶数)所以奇偶不变

    因此整个序列的逆序对奇偶因为l,rl,rl,r的互换一定发生改变

    ps: l≠rl≠rl=r

  • opt 2

    反转区间[l,r][l,r][l,r]

    对于i∈[1,l)⋃(r,n]i∈[1,l)\bigcup (r,n]i[1,l)(r,n] 同样不影响

    操作区间的总配对个数cnt=len×(len−1)2cnt=\frac{len\times (len-1)}{2}cnt=2len×(len1),假设原区间逆序对个数为xxx,则反转后为cnt−xcnt-xcntx

    发现最后的奇偶取决于cntcntcnt的奇(奇加偶)偶(奇加奇/偶加偶)

  • opt 3/4

    左移右移本质上是一样的,以左移为例

    将整个操作区间重新离散化

    对于区间的开头假设离散化结果为xxx,意味着原来该开头的逆序对贡献为x−1x-1x1

    左移到最后,就会与前面的n−xn-xnx个数产生逆序对

    一次移动改变数为x−1+n−x=−2x+n−1x-1+n-x=-2x+n-1x1+nx=2x+n1

    发现xxx的贡献因为带了−2-22一定是偶数,不改变奇偶,无用直接不管

    所以最后只取决于k×(n−1)k\times (n-1)k×(n1)的奇偶性

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 200005
int n, m;
int a[maxn], tree[maxn], tmp[maxn];int lowbit( int x ) {return x & ( -x );
}void Add( int x ) {for( int i = x;i <= n;i += lowbit( i ) )tree[i] ++;
}int Ask( int x ) {int ans = 0;for( int i = x;i;i -= lowbit( i ) )ans += tree[i];return ans;
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%d", &a[i] );int ans = 0;for( int i = n;i;i -- )ans += Ask( a[i] ), Add( a[i] );ans = ans & 1;while( m -- ) {int opt, l, r, k;scanf( "%d %d %d", &opt, &l, &r );switch( opt ) {case 1 : {if( l != r ) ans ^= 1;break;}case 2 : {int len = ( r - l + 1 ) * ( r - l ) / 2;if( len & 1 ) ans ^= 1;break;}case 3 : {scanf( "%d", &k );int len = r - l + 1;if( ( k * ( len + 1 ) ) & 1 ) ans ^= 1;break;}case 4 : {scanf( "%d", &k );int len = r - l + 1;if( ( k * ( len - 1 ) ) & 1 ) ans ^= 1;break;}}printf( "%d\n", ans );}return 0;
}

对序列

序列合法的必要条件为:对于xxx,第二次出现位置后面所有值都不能比xxx

考虑反过来,剩下nnn个格子,最大能填mmm

img

fn,m=fn,m−1+∑i=1nfn−i,m−1×(n−i+1)f_{n,m}=f_{n,m-1}+\sum_{i=1}^nf_{n-i,m-1}\times (n-i+1)fn,m=fn,m1+i=1nfni,m1×(ni+1)

fn,m−1:f_{n,m-1}:fn,m1: 不填mmm的方案数

fn,m=fn,m−1+∑i=1nfn−i,m−1×(n−i+1)f_{n,m}=f_{n,m-1}+\sum_{i=1}^nf_{n-i,m-1}\times (n-i+1)fn,m=fn,m1+i=1nfni,m1×(ni+1)

⇔fn,m=fn,m−1+∑i=0n−1fi,m−1×(i+1)\Leftrightarrow f_{n,m}=f_{n,m-1}+\sum_{i=0}^{n-1}f_{i,m-1}\times (i+1)fn,m=fn,m1+i=0n1fi,m1×(i+1)

gn,m=∑i=0n−1fi,m×(i+1)⇒gn,m=gn−1,m+fn−1,m×ng_{n,m}=\sum_{i=0}^{n-1}f_{i,m}\times(i+1)\Rightarrow g_{n,m}=g_{n-1,m}+f_{n-1,m}\times ngn,m=i=0n1fi,m×(i+1)gn,m=gn1,m+fn1,m×n

前缀和优化

#include <cstdio>
#define mod 998244353
#define int long long
#define maxn 1005
int f[maxn], g[maxn];
int n, m;signed main() {scanf( "%lld %lld", &n, &m );f[0] = 1;for( int i = 1;i <= n;i ++ )g[i] = ( g[i - 1] + f[i - 1] * i % mod ) % mod;for( int j = 1;j <= m;j ++ )for( int i = 1;i <= n;i ++ ) {f[i] = ( f[i] + g[i] ) % mod;g[i] = ( g[i - 1] + f[i - 1] * i % mod ) % mod;}printf( "%lld\n", f[n] );return 0;
}

未曾设想的道路

维护连续的懒标记,前kkk大的懒标记,现在前kkk大,历史前kkk

无脑树套树

代码是正确的,卡卡常就能过了

#pragma GCC optimize(2)
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define inf -1e9
#define maxn 100005
#define maxk 101
#define lson num << 1
#define rson num << 1 | 1
#define Pair pair < int, int >
struct node {int lazy;int tag[maxk], maxx[maxk], now[maxk];node() {for( int i = 1;i < maxk;i ++ )tag[i] = maxx[i] = now[i] = inf;}
}t[maxn << 2];
priority_queue < Pair > q;
int n, m;
int h[maxn], tmp[maxk], ans[maxk];
//tag:[1,k]max lazy till now
//maxx:[1,k]max Height up till now
//now:[1,k]max Height at the present void merge( int *A, int *B ) {static int MS[maxk];int i = 1, j = 1;for( int k = 1;k < maxk;k ++ )if( A[i] > B[j] ) MS[k] = A[i ++];else MS[k] = B[j ++];memcpy( A, MS, sizeof( MS ) );
}void pushup( int num ) {memcpy( t[num].now, t[lson].now, sizeof( t[lson].now ) );merge( t[num].now, t[rson].now );memcpy( t[num].maxx, t[lson].maxx, sizeof( t[lson].maxx ) );merge( t[num].maxx, t[rson].maxx );
}void build( int num, int l, int r ) {if( l == r ) {t[num].maxx[1] = t[num].now[1] = h[l];return;	}int mid = ( l + r ) >> 1;build( lson, l, mid );build( rson, mid + 1, r );pushup( num );
}void unite( int *A, int *B ) {static int MS[maxk];while( ! q.empty() ) q.pop();for( int i = 1;i < maxk;i ++ )q.push( make_pair( A[i] + B[1], i ) ), MS[i] = 1;for( int i = 1;i < maxk;i ++ ) {Pair now = q.top(); q.pop();tmp[i] = max( (int)inf, now.first );q.push( make_pair( A[now.second] + B[++ MS[now.second]], now.second ) );}
}void pushdown( int num ) {if( t[num].tag[1] > -1e8 ) {for( int i = 1;i < maxk;i ++ )tmp[i] = t[lson].lazy + t[num].tag[i];merge( t[lson].tag, tmp );for( int i = 1;i < maxk;i ++ )tmp[i] = t[rson].lazy + t[num].tag[i];merge( t[rson].tag, tmp );t[lson].lazy += t[num].lazy;t[rson].lazy += t[num].lazy;unite( t[num].tag, t[lson].now );merge( t[lson].maxx, tmp );unite( t[num].tag, t[rson].now );merge( t[rson].maxx, tmp );for( int i = 1;i < maxk;i ++ ) {t[lson].now[i] += t[num].lazy;t[rson].now[i] += t[num].lazy;}for( int i = 1;i < maxk;i ++ )t[num].tag[i] = inf;t[num].lazy = 0;}
}void modify( int num, int l, int r, int L, int R, int x ) {if( r < L || R < l ) return;if( L <= l && r <= R ) {t[num].lazy += x;for( int i = 1;i < maxk;i ++ ) tmp[i] = inf; tmp[1] = t[num].lazy;for( int i = 1;i < maxk;i ++ ) t[num].now[i] += x;merge( t[num].tag, tmp );merge( t[num].maxx, t[num].now );return;}pushdown( num );int mid = ( l + r ) >> 1;modify( lson, l, mid, L, R, x );modify( rson, mid + 1, r, L, R, x );pushup( num );
}void query( int num, int l, int r, int L, int R ) {if( R < l || r < L ) return;if( L <= l && r <= R ) {merge( ans, t[num].maxx );return;}int mid = ( l + r ) >> 1;pushdown( num );query( lson, l, mid, L, R );query( rson, mid + 1, r, L, R );
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%d", &h[i] );build( 1, 1, n );int opt, l, r, k;while( m -- ) {scanf( "%d %d %d %d", &opt, &l, &r, &k );if( ! opt ) modify( 1, 1, n, l, r, k );else {for( int i = 1;i < maxk;i ++ ) ans[i] = inf;query( 1, 1, n, l, r );int ret;for( int i = 1;i <= k;i ++ )if( ans[i] > -1e8 ) ret = ans[i];printf( "%d\n", ret );}}return 0;
}

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

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

相关文章

Frogs HDU - 5514

Frogs HDU - 5514 题意&#xff1a; 有n个青蛙&#xff0c;第 i 个青蛙每次只能够跳 ai​步&#xff0c;现在有m个石头围成一圈&#xff0c;编号为0到m−1&#xff0c;现在青蛙可以围着这个石头组成的圆跳无限次&#xff0c;每跳一次就会占领这个石头&#xff0c;可以无限占领…

Docker最全教程之树莓派和Docker(十六)

前言树莓派&#xff08;Raspberry Pi&#xff09;是一台卡片电脑&#xff08;只有信用卡大小&#xff09;&#xff0c;我们可以使用树莓派做很多事情&#xff0c;比如智能家居的中控、航空器、BT下载器、挖矿机、智能机器人、小型服务器&#xff08;花生壳网站&#xff09;等等…

【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

介绍系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在微服务的应用中&#xff0c;统一的认证授权是必不可少的组件&#xff0c;本文将介绍微服务中网关和子服务如何使用统一的权限认证主要介绍内容为&#xff1a;1、子服务如何实现和网关相同的鉴权方式2、接口…

WebApiClient与Asp.net core DI的结合

1 WebApiClient一款基于HttpClient封装&#xff0c;只需要定义c#接口并修饰相关特性&#xff0c;即可异步调用远程http接口的客户端库WebApiClientWebApiClient.ExtensionsWebApiClient.Tools2 Http接口的注册与提供2.1 声明远程端http接口public interface IBaiduApi : IHttpA…

梁迪:源于热爱乐于分享,MVP代表圆桌会议

梁迪《MVP代表圆桌会议》MVP代表圆桌会议&#xff0c;源于热爱乐于分享。来自全国的MVP&#xff08;周岳、苏震巍、蒋金楠、胡浩、卿毅、项斌、刘浩杨、施兆熊、方洁影、方骥、刘鑫、童广林&#xff09;作经验交流。梁 迪微软最有价值专家&#xff08;MVP&#xff09;项目大…

基于xlua和mvvm的unity框架

1、框架简介这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI&#xff0c;于是下载下来学习了一下。XUUI基于xlua&#xff0c;又借鉴了mvvm的设计概念。xlua是目前很火的unity热更方案&#xff0c;不仅支持纯lua脚本热更&#xff0c;也可以做 C# 代码的bug hot…

如何在ASP.NET Core中使用JSON Patch

原文&#xff1a; JSON Patch With ASP.NET Core作者&#xff1a;.NET Core Tutorials译文&#xff1a;如何在ASP.NET Core中使用JSON Patch地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10433615.html译者&#xff1a;Lamond LuJSON Patch是一种使用API显式更新文档的方…

.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接

众所周知在.NET下的RSA类所生成的密钥为Xml格式&#xff0c;而其他语言比如java一般使用pkcs8格式的密钥&#xff0c;JavaScript一般使用pkcs1格式。我们在开发过程中很可能遇到需要与其他语言开发的api进行对接&#xff0c;如果遇到RSA加密解密&#xff0c;我们肯定需要保证ke…

ABP VNext 微服务演示,项目状态和路线图

在ABP vNext上的第一个公告之后,我们对代码库进行了很多改进(GitHub存储库上的1100多次提交).我们已经创建了功能,示例,文档等等.在这篇文章中,我想告诉你一些新闻和项目的状态.ABP微服务演示解决方案ABP框架的主要目标之一是提供创建微服务解决方案的便利基础设施.我们一直在努…

[aspnetcore.apidoc]一款很不错的api文档生成工具

简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger最初我们也有在试用swagger&#xff0c;但总是有些感觉&#xff0c;感觉有点不满意&#xff0c;就但从api文档角度来说&#xff0c;从前后端文档沟通角度来讲apidoc的表现形式&#xff0c;要比swagger简单的多&…

Acwing1069. 凸多边形的划分

Acwing1069. 凸多边形的划分 题意&#xff1a; 一个N个顶点的凸多边形&#xff0c;划分成N-2个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&#xff0c;试求所有三角形的顶点权值乘积之和至少为多少。 题解&#xff1…

徐磊(Devops):一名写了十几年代码但还没写够的程序员

徐磊&#xff08;Devops 社区领袖&#xff09;【个人介绍】徐磊&#xff0c;微软MVP&#xff08;微软最有价值专家&#xff0c;大中华区域社区技术总监&#xff0c;Devops 社区领袖&#xff09;&#xff0c;从事过网管、技术支持、网络、软件开发等工作&#xff0c;一名写了十几…

AcWing 320. 能量项链

AcWing 320. 能量项链 题意&#xff1a; 题解&#xff1a; 和环形石头合并基本一样 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf("%s %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s0,w1;char c…

ERP不规范,同事两行泪

最近的很多次对外交流&#xff0c;都聊到了ERP建设的话题&#xff0c;并且无一例外的不那么让人省心&#xff0c;回想我这么多年走过的ERP坑坑路&#xff0c;在这里也写下经验和总结&#xff0c;希望能给正在或者即将走上ERP建设路的企业一些思考和帮助。导读1、几个瞎眼而普遍…

长沙.NET社区之光

奈何万事开头难迎着改革开放四十年带来的春风&#xff0c;长沙的互联网生态环境以唐胡子俱乐部为首的一众互联网社群将长沙互联网的环境推上了一个新的台阶。年底&#xff0c;我与有幸一起共事的溪源兄&#xff0c;下班后一起闲聊&#xff0c;觉着长沙的.NET的生态环境亟待改善…

高级进阶:Azure DevOps搞定.NET Core编译版本号自增

点击上方蓝字关注“汪宇杰博客”熟悉.NET Framework的人知道&#xff0c;我们可以通过指定AssemblyVersion为10.0.*来让编译器自增版本号。但是.NET Core和.NET Standard不行。即使有MSBump这样的开源项目&#xff0c;也有一定的缺陷。一般这样的需求会出现在CI/CD服务器上。我…

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说&#xff0c;一般通过打日志来进行埋点&#xff0c;然后再通过elk或splunk进行定位及分析问题&#xff0c;更有甚者直接远程服务器&#xff0c;直接操作查看日志&#xff0c;那么&#xff0c;随着业务越来越复杂&#xff0c;企业应用也进入了分布式服务…

Tree UVALive - 8212

Tree UVALive - 8212 题意&#xff1a; 有n个点&#xff0c;k个颜色&#xff0c;每个点都要被染色&#xff0c;相同颜色之间的边算是被该颜色覆盖&#xff0c;问有多少边被所有颜色覆盖 题解&#xff1a; 题目给的是无根树&#xff0c;我们可以将1默认为根然后求所有点的子…

dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

在上一篇文章&#xff08;.NET Core开源行动&#xff1a;一键创建Excel Add-in&#xff09; 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库&#xff0c;你可以通过 dotnet new excel & dotnet run 命令即可完成一个新的Add-in的创建和运行。关于如何加载这…