[2.7]【CF933A】A Twisty Movement【CF926B】Add Points【CF917A】The Monster【CF919E】Congruence Equation

文章目录

  • T1:A Twisty Movement
    • 题目
    • 题解
    • code
  • T2:Add Points
    • 题目
    • 题解
    • code
  • T3:The Monster
    • 题目
    • 题解
    • code
  • T4:Congruence Equation
    • 题目
    • 题解
    • code

在这里插入图片描述

T1:A Twisty Movement

题目

题目

题解

因为aia_iai=1/21/21/2,于是我们可以确定答案一定是:[1,1,1,…][2,2,2…][1,1,1…][2,2,2…][1,1,1,…][2,2,2…][1,1,1…][2,2,2…][1,1,1,][2,2,2][1,1,1][2,2,2]这样的四段子序列(每一段都允许为空)中第二、三段所在区间翻转得到

我们可以从左往右做前缀和pre[i]pre[i]pre[i]表示[1,i][1,i][1,i]出现111的个数,后缀和suf[i]suf[i]suf[i]表示[i,n][i,n][i,n]出现222的个数


然后我们枚举二、三段的分界点k,k∈[1,n+1]k,k∈[1,n+1]k,k[1,n+1],再设一、二段的分界点为p,p∈[1,k]p,p∈[1,k]p,p[1,k],三、四段的分界点为q,q∈[k,n+1]q,q∈[k,n+1]q,q[k,n+1]

那么答案为(pre[p−1])+(suf[p]−suf[k])+(pre[q−1]−pre[k])+(suf[q])(pre[p-1])+(suf[p]-suf[k])+(pre[q-1]-pre[k])+(suf[q])(pre[p1])+(suf[p]suf[k])+(pre[q1]pre[k])+(suf[q])
在这里插入图片描述
将式子中括号括起来的当为一个整体
这个式子可以化为:
(pre[p−1]+suf[p]+pre[q−1]+suf[q])−(suf[k]+pre[k])(pre[p-1]+suf[p]+pre[q-1]+suf[q])-(suf[k]+pre[k])(pre[p1]+suf[p]+pre[q1]+suf[q])(suf[k]+pre[k])
p∈[1,k],q∈[k,n+1]p∈[1,k],q∈[k,n+1]p[1,k],q[k,n+1]

发现对于一个确定的kkk,我们要最大化前面括号的式子
而第一个括号里面的东西可以用线段树维护下pre[i−1]+suf[i]pre[i-1]+suf[i]pre[i1]+suf[i]
那么只用枚举kkk,再两次区间最大值查询,更新答案就好了

code

#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 2005
int n, result;
int a[MAXN], pre[MAXN], suf[MAXN], tree[MAXN << 2];void insert ( int t, int l, int r, int id, int val ) {if ( l == r ) {tree[t] = val;return;}int mid = ( l + r ) >> 1;if ( id <= mid )insert ( t << 1, l, mid, id, val );elseinsert ( t << 1 | 1, mid + 1, r, id, val );tree[t] = max ( tree[t << 1], tree[t << 1 | 1] );
}int query ( int t, int l, int r, int L, int R ) {if ( L <= l && r <= R )return tree[t];int mid = ( l + r ) >> 1;int ans = 0;if ( L <= mid )ans = max ( ans, query ( t << 1, l, mid, L, R ) );if ( mid < R )ans = max ( ans, query ( t << 1 | 1, mid + 1, r, L, R ) );return ans;
}int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &a[i] );for ( int i = 1;i <= n;i ++ )pre[i] = pre[i - 1] + ( a[i] == 1 );for ( int i = n;i >= 1;i -- )suf[i] = suf[i + 1] + ( a[i] == 2 );for ( int i = 1;i <= n + 1;i ++ )insert ( 1, 1, n + 1, i, pre[i - 1] + suf[i] );for ( int i = 1;i <= n + 1;i ++ ) {int tmp1 = query ( 1, 1, n + 1, 1, i ), tmp2 = query ( 1, 1, n + 1, i, n + 1 );result = max ( result, tmp1 + tmp2 - pre[i - 1] - suf[i] ); }printf ( "%d", result );return 0;
}

T2:Add Points

题目

题目

题解

这道题实在不知道怎么讲,我觉得直接扔一句话就懂了
排完序后两两距离的最大公约数

code

#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 100005
int n;
int x[MAXN];int gcd ( int x, int y ) {if ( ! y )return x;elsereturn gcd ( y, x % y );
}int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &x[i] );sort ( x + 1, x + n + 1 );int d = x[2] - x[1];for ( int i = 2;i < n;i ++ ) {int dis = x[i + 1] - x[i];d = gcd ( d, dis );}int result = 0;for ( int i = 1;i < n;i ++ )result += ( x[i + 1] - x[i] ) / d - 1;printf ( "%d", result );return 0;
}

T3:The Monster

题目

题目

题解

其实还是有点意思,我认为比T2T2T2要难一点
首先直接纯暴力250002^{5000}25000可以直接当场去世了


考虑枚举起点,用tottottot记录,(((+1+1+1)))−1-11
tot==0tot == 0tot==0,说明匹配成功result++result++result++


对于???就麻烦一点了
tot>0tot>0tot>0,表示需要右括号匹配,使???为右括号,
因为右括号一定可以改为左括号(期待后面能够匹配成功),
因此change++change++change++changechangechange为可以修改为左括号的???个数)

tot<0tot<0tot<0???只能为左括号,并且不能计入num
在这里插入图片描述


如果某一个时刻,tot<0,num>0tot<0,num>0tot<0,num>0,说明可以将之前的右括号改为左括号,则tot+=2,num−−tot += 2,num--tot+=2,num

剪枝部分:若tot<0,num=0tot<0,num=0tot<0,num=0,说明此序列当前及以后都不会合法,直接breakbreakbreak

code

#include <cstdio>
#include <cstring>
#define MAXN 5005
char s[MAXN];
int result, tot, change;int main() {scanf ( "%s", s );int len = strlen ( s );for ( int i = 0;i < len;i ++ ) {tot = 0, change = 0;for ( int j = i;j < len;j ++ ) {if ( s[j] == '(' )tot ++;else if ( s[j] == ')' ) tot --;else {if ( tot > 0 )tot --, change ++;elsetot ++;}if ( tot < 0 && change > 0 )tot += 2, change --;//°Ñ֮ǰµ±³É')'ÌṩµÄ-1¼Ó»ØÀ´ÔÙ¼ÓÉÏ'('µÄ¹±Ï× if ( tot < 0 && ! change )break;if ( ! tot )result ++;}}printf ( "%d", result ); return 0;
}

T4:Congruence Equation

题目

题目

题解

对于这种数论题只想说一句:不康题解:这神马玩意儿;康完题解:太水了
在这里插入图片描述


n∗an≡b(modp)n*a^n≡b(mod\ p)nanb(mod p),加上费马那一堆人的鬼定理
我们知道第一个乘数nnn的循环节是ppp
而指数nnn的循环节是φ(p)φ(p)φ(p),又因为ppp为质数,所以φ(p)=p−1φ(p)=p-1φ(p)=p1
综上n⋅ann⋅a^nnan有循环节p∗(p−1)p*(p−1)p(p1)


然后就可以设n=j∗(p−1)+in=j*(p-1)+in=j(p1)+i,接着开始搞事
n∗an≡b(modp)n*a^n≡b(mod\ p)nanb(mod p)
(j∗(p−1)+i)∗aj∗(p−1)+i≡b(modp)(j*(p-1)+i)*a^{j*(p-1)+i}≡b(mod\ p)(j(p1)+i)aj(p1)+ib(mod p)
(j∗p−j+i)∗ai≡b(modp)(j*p-j+i)*a^i≡b(mod\ p)(jpj+i)aib(mod p)
(i−j)∗ai≡b(modp)(i-j)*a^i≡b(mod\ p)(ij)aib(mod p)
j≡i−bai(modp)j≡i-\frac{b}{a^i}(mod\ p)jiaib(mod p)
然后就可以枚举iii解出j,nj,nj,n搞到一个最小解,根据循环节算有几个
x−minnp⋅(p−1)\frac{x−minn}{p⋅(p−1)}p(p1)xminn

code

#include <cstdio>
#define int long long
int a, b, p, x, result;int qkpow ( int x, int y ) {int ans = 1;while ( y ) {if ( y & 1 )ans = ans * x % p;x = x * x % p;y >>= 1;}return ans;
}signed main() {scanf ( "%lld %lld %lld %lld", &a, &b, &p, &x );for ( int i = 1;i < p;i ++ ) {int j = ( i - b * qkpow ( qkpow ( a, i ), p - 2 ) % p + p ) % p;int minx = j * ( p - 1 ) + i;if ( minx <= x )result += ( x - minx ) / ( p * ( p - 1 ) ) + 1;}printf ( "%lld", result );return 0;
} 

在这里插入图片描述

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

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

相关文章

LIS最长上升子序列

LIS算是比较经典的问题&#xff0c;常用的是O(n^2)的方法 for(int i1;i<n;i){dp[i]1;for(int j1;j<i;j){if(a[j]<a[i])dp[i]max(dp[i],dp[j]1);}mxmax(mx,dp[i]);}我们这里优化成O(nlogn) 我们模拟一个栈stack&#xff0c;每读入一个数&#xff0c;如果这个数大于栈顶…

AT5160-[AGC037C]Numbers on a Circle【贪心,堆】

正题 题目链接:https://www.luogu.com.cn/problem/AT5160 题目大意 给出两个长度为nnn的环序列aaa和bbb&#xff0c;每次你可以让aaa中的一个数变为它和相邻两个的和。 求最少的步数将aaa变为bbb。 1≤n≤105,1≤ai,bi≤1091\leq n\leq 10^5,1\leq a_i,b_i\leq 10^91≤n≤10…

YBTOJ洛谷P3209:平面图判定(2-SAT)

文章目录解析代码传送门解析 关键性质是一个定理&#xff1a;若m>3*n-6&#xff0c;必然不存在合法的平面图 这谁知道啊 不过这题应该往也许图过于稠密时必然无解这方面想 所以我们只需要考虑m、n同阶的情况就行了 这个时候我们直接暴力判断跑2-SAT就行了 代码 #include&…

线性代数 - 矩阵对角化

矩阵对角化 今天听 \(\texttt{m}\color{red}\texttt{yee}\) 嘴的&#xff0c;赶紧来补个学习笔记。 我们有点时候需要计算一个较小矩阵的 \(n\) 次幂&#xff0c;但直接求幂非常不方便&#xff0c;这是会考虑矩阵对角化&#xff0c;将 \(M\) 改写为 \(\mathcal{PDP^{-1}}\)&…

EF Core 数据库 Provider 一览

当 EF Core 1.x 系列和 2.0 版本之间经过重大的重写时&#xff0c;所有 EF Core 数据库 Provider 都受到重创。从那时起&#xff0c;各种私人和商业开发团队一直在努力填补这个空白。正文当 EF Core 1.x 系列和 2.0 版本之间经过重大的重写时&#xff0c;所有 EF Core 数据库 P…

[3.3训练赛]One-Dimensional(矩阵快速幂),Freda的迷宫(无向图强连通分量+并查集),一道防AK好题

文章目录T1:One-DimensionaltitlesolutioncodeT2:【NOIP模拟赛】Freda的迷宫titlesolutioncodeT3:【NOIP模拟赛】一道防AK好题titlesolutioncode确实没想到自己写文章能隔这么久&#xff0c;鸽王预警 T1:One-Dimensional title 考虑一个含有 N 个细胞的一维细胞自动机。细胞…

牛客网专题 概率dp

文章目录概念&#xff1a;例题引入&#xff1a;解答&#xff1a;Happy Running NC15532题意&#xff1a;题解&#xff1a;代码&#xff1a;poj2096 NC106693 Collecting Bugs题意&#xff1a;题解&#xff1a;代码&#xff1a;NC210477 带富翁题意&#xff1a;题解&#xff1a;…

模板:线性基

文章目录解析实现删除所谓线性基&#xff0c;就是线性的基 &#xff08;逃&#xff09; 解析 何为线性基&#xff1f; 定义几何BBB为集合SSS的线性基,当且仅当: .S任意子集异或和可以得到的结果&#xff0c;用B的子集都也可以得到&#xff0c;且B时所有这样的集合中元素最少的…

CF1242C-Sum Balance【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1242C 题目大意 给出kkk个集合&#xff0c;现在从每个集合中取出一个数再把这些数放进每个集合里各一个&#xff0c;求能否使得所有集合的和相等&#xff0c;求方案。 保证所有集合中的出现过的数字都互不相同。 1≤k≤15…

连续段计数问题小记

给定一个长度为 \(n\) 的一个排列&#xff0c;如果区间 \([l,r]\) 之间的数是连续的&#xff0c;那么我们称这个区间时一个连续段。 比如 \([1,3,2,5,4]\) 中的连续段有&#xff1a;\([1,1],[1,3],[1,5],[2,2],[2,3],[2,5],[3,3],[4,4],[4,5],[5,5]\)。 这些连续段有一个共同的…

.NET Core 3.0 特性初探:C# 8、WPF、Windows Forms、EF Core

.NET Core 的下一个主要版本最近进入了预览阶段&#xff0c;.NET Core 3.0 将支持使用 Windows Presentation Foundation &#xff08;WPF&#xff09;、Windows Forms&#xff08;WinForms&#xff09;、Entity Framework &#xff08;EF&#xff09;、Blazor、 C# 8 和.NET S…

任意长度循环卷积单位根反演 学习笔记

今天听 \(\texttt{m}\color{red}{\texttt{yee}}\) 嘴的&#xff0c;赶紧来补个学习笔记。 PS&#xff1a;FFT 本质是长度为 \(2^k\) 的循环卷积。 单位根反演 反演本质&#xff1a; \[\frac1n\sum_{i0}^{n-1}\omega_{n}^{ai}[n|a] \]证明&#xff1a; 如果 \(n|i\)&#xff0c;…

YBTOJ洛谷P4074:糖果公园(树上莫队)

文章目录解析update:代码所谓树上莫队&#xff0c;就是在树上的莫队 &#xff08;逃&#xff09; 传送门 解析 似乎就是树上的这道题 考虑如何转化为序列问题呢? 考虑dfs序 但是又一个问题。。。 似乎这条链的dfs序不连续啊 树剖一下就好啦 考虑更阳间的方法 求出这棵树的欧…

ARC115D-Odd Degree【dp,欧拉回路】

正题 题目链接:https://atcoder.jp/contests/arc115/tasks/arc115_d 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;对于每个k∈[1,n]k\in[1,n]k∈[1,n] 求恰好有kkk个奇数入度点的生成子图数量。 1≤n,m≤50001\leq n,m\leq 50001≤n,m≤5000 解题思路 考虑有kkk个奇…

【用梨泰院class中的财阀世家带你洞悉替罪羊树】Scapegoat Tree原理,模板,例题

我想写在前面&#xff0c;本文财阀世家全是虚构&#xff0c;没有诋毁之意&#xff0c;如有雷同&#xff0c;纯属巧合 红色预警&#xff01;&#xff01;&#xff01;红色预警 文章目录Scapegoat Tree概念模板变量声明Bad函数判断是否需要重构理解模板rebuild重构理解模板inser…

领域驱动设计,让程序员心中有码(五)

1 从搬砖谈领域对象有一个古老的故事&#xff0c;大概是这样的。作者问三个建筑工地上的工人他们在干什么&#xff1f;有一个没精打采的说&#xff0c;我在挖洞&#xff01;而另一一个人却说&#xff0c;我在盖一座房子。还有一个人说&#xff0c;我在建立一座巨大的城市。…

spoj Favorite Dice(概率dp+期望)

题意&#xff1a; 摇一个n面的骰子&#xff0c;问每一面都被摇到的次数期望是多少。 题解&#xff1a; 概率dp往往都是倒着推 我们设dp[x]表示已经摇到了x个面&#xff0c;还要摇的概率次数 那么dp[n] 0(即一次还没摇) dp[0]就是答案 对于dp[i],我们考虑当前已经摇到i个面&…

AT3968-[AGC025E] Walking on a Tree【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT3968 题目大意 给出nnn个点的一棵树&#xff0c;然后给出mmm条路径。每条边的权值是它是否又被正向经过是否又被反向经过&#xff0c;给每条路径定向使得所有边的权值和最大。输出方案。 1≤n,m≤20001\leq n,m\leq 20001≤…

CF512D Fox And Travelling(DP 计数)

CF512D Fox And Travelling 给定一张 \(n\) 个点 \(m\) 条边的无向图&#xff0c;每次选择一个叶子结点并将它和连接它的边删除。 对于每个 \(k\in[0,n]\)&#xff0c;问有序选择 \(k\) 个点的方案数。 \(n\le 100\)。 显然如果有环&#xff0c;那么所有环上的点都无法被选择&a…

.NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理...

通过 ASP.NET Core&#xff0c;开发者可轻松配置和管理其应用的安全性。 ASP.NET Core 中包含管理身份验证、授权、数据保护、SSL 强制、应用机密、请求防伪保护及 CORS 管理等等安全方面的处理。 通过这些安全功能&#xff0c;可以生成安全可靠的 ASP.NET Core 应用。而我们这…