[AtCoder Regular Contest 123] 题解

文章目录

  • A - Arithmetic Sequence
  • B - Increasing Triples
  • C - 1, 2, 3 - Decomposition
  • D - Inc, Dec - Decomposition
  • E - Training
  • F - Insert Addition

ARC123

A - Arithmetic Sequence

大讨论

只能+1+1+1,先固定中间的数,看两边加谁,如果都是加负数说明是中间的数需要加

#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
int x, y, z;int Fabs( int x ) {return x < 0 ? -x : x;
}signed main() {scanf( "%lld %lld %lld", &x, &y, &z );if( x > z ) swap( x, z );int d1 = y - x, d2 = z - y;int x1 = y - d2, z1 = y + d1;if( x1 >= x ) printf( "%lld\n", x1 - x );else if( z1 >= z ) printf( "%lld\n", z1 - z );else if( ( z - x ) & 1 ) printf( "%lld\n", x + ( z - x ) / 2 - y + 2 );else printf( "%lld\n", x + ( z - x ) / 2 - y );return 0;
}

B - Increasing Triples

排序一边,贪心的有尽可能让小小小,大大大配对出现,双指针扫即可

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100005
int A[maxn], B[maxn], C[maxn];
int n;int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &A[i] );for( int i = 1;i <= n;i ++ )scanf( "%d", &B[i] );for( int i = 1;i <= n;i ++ )scanf( "%d", &C[i] );sort( A + 1, A + n + 1 );sort( B + 1, B + n + 1 );sort( C + 1, C + n + 1 );int ipB = 1, ipC = 1, ans = 0;for( int i = 1;i <= n;i ++ ) {while( ipB <= n && B[ipB] <= A[i] ) ipB ++;while( ipC <= n && C[ipC] <= B[ipB] ) ipC ++;if( ipB > n || ipC > n ) break;else ans ++, ipB ++, ipC ++;}printf( "%d\n", ans );return 0;
}

C - 1, 2, 3 - Decomposition

结论:任何一个数最多不会由超过五个的123类数组成

暴力算每各位check1/2/3/4/5依次是否可以

#include <map>
#include <cstdio>
using namespace std;
#define int long long
map < int, int > mp;
int T, n;int solve( int n ) {if( ! n ) return 0;if( mp[n] ) return mp[n];int s = n / 10, r = n % 10;if( 1 <= r && r <= 3 && solve( s ) <= 1 ) return mp[n] = 1;if( 2 <= r && r <= 6 && solve( s ) <= 2 ) return mp[n] = 2;if( 3 <= r && r <= 9 && solve( s ) <= 3 ) return mp[n] = 3;if( 4 <= r && r <= 9 && solve( s ) <= 4 ) return mp[n] = 4;if( 0 <= r && r <= 2 && solve( s - 1 ) <= 4 ) return mp[n] = 4;return mp[n] = 5;
}signed main() {scanf( "%lld", &T );while( T -- ) {scanf( "%lld", &n );printf( "%lld\n", solve( n ) );	}return 0;
}

D - Inc, Dec - Decomposition

显然的定理:对于操作iiiBi=Bi−1/Ci=Ci−1B_i=B_{i-1}/C_i=C_{i-1}Bi=Bi1/Ci=Ci1二者中至少有一个是不变的

所以,一旦确定了B1B_1B1,两个序列都被确定下来,答案也就确定了

反转CCC,重新定义为Ai=Bi−CiA_i=B_i-C_iAi=BiCi,那么B,CB,CB,C序列的要求都变成了单调不下降

最后的答案反正是带绝对值的,这样的反转并不影响最后答案的统计,还是∑i=1n∣Bi∣+∣Ci∣\sum_{i=1}^n|B_i|+|C_i|i=1nBi+Ci

Ai+1>AiA_{i+1}>A_iAi+1>Ai,原问题的解决方案肯定是增加BBB,若Ai+1<AiA_{i+1}<A_iAi+1<Ai,原问题的解决方案肯定是减少CCC

原则上是没有变化的,但是改变CCC后,全都变成了增加B/CB/CB/C,操作可以表示为

  • Bi+1=Bi+max⁡(Ai+1−Ai,0)B_{i+1}=B_{i}+\max(A_{i+1}-A_i,0)Bi+1=Bi+max(Ai+1Ai,0)
  • Ci+1=Ci+max⁡(Ai−Ai+1,0)C_{i+1}=C_i+\max(A_i-A_{i+1},0)Ci+1=Ci+max(AiAi+1,0)

对于确定了B1B_1B1后的序列,每个Bi,CiB_i,C_iBi,Ci都是∣B1−k∣|B_1-k|B1k的形式,一共有2n2n2nkkk,答案显然是BiB_iBikkk的中位数时最小

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200005
vector < int > ans;
int n;
int A[maxn];int Fabs( int x ) {return x < 0 ? -x : x;
}signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &A[i] );int B = A[1], C = 0;ans.push_back( B ), ans.push_back( C );for( int i = 1;i < n;i ++ ) {int x = A[i + 1] - A[i];if( x >= 0 ) B += x;else C -= x;ans.push_back( B );ans.push_back( C );}sort( ans.begin(), ans.end() );int ret = 0;for( int i = 0;i < ans.size();i ++ )ret += Fabs( ans[i] - ans[n] );printf( "%lld\n", ret );return 0;
}

E - Training

题目转录翻译一下就是求∑i=1n[AX+⌊iBX⌋=AY+⌊iBY⌋]\sum_{i=1}^n\bigg[A_X+\lfloor\frac{i}{B_X}\rfloor=A_Y+\lfloor\frac{i}{B_Y}\rfloor\bigg]i=1n[AX+BXi=AY+BYi]

定义f(x)=AX+xBX,g(x)=AY+xBY,F(x)=⌊f(x)⌋,G(x)=⌊g(x)⌋f(x)=A_X+\frac{x}{B_X},g(x)=A_Y+\frac{x}{B_Y},F(x)=\lfloor f(x)\rfloor,G(x)=\lfloor g(x)\rfloorf(x)=AX+BXx,g(x)=AY+BYx,F(x)=f(x),G(x)=g(x)

问题转化为求∑i=1n[F(i)=G(i)]\sum_{i=1}^n\bigg[F(i)=G(i)\bigg]i=1n[F(i)=G(i)]

  • f(x)<g(x)−1⇒F(x)<G(x)f(x)<g(x)-1\Rightarrow F(x)<G(x)f(x)<g(x)1F(x)<G(x)

  • g(x)−1≤f(x)≤g(x)⇒F(x)={G(x)−1,G(x)}g(x)-1\le f(x)\le g(x)\Rightarrow F(x)=\bigg\{G(x)-1,G(x)\bigg\}g(x)1f(x)g(x)F(x)={G(x)1,G(x)}

    • g(x)−1≤f(x)g(x)-1\le f(x)g(x)1f(x)

      AY+xBY−1≤AX+xBX⇔AYBYBX+xBX−BXBY≤AXBYBX+xBYA_Y+\frac{x}{B_Y}-1\le A_X+\frac{x}{B_X}\Leftrightarrow A_YB_YB_X+xB_X-B_XB_Y\le A_XB_YB_X+xB_YAY+BYx1AX+BXxAYBYBX+xBXBXBYAXBYBX+xBY

      ⇔(AY−AX−1)BXBY≤x(BY−BX)⇔(AY−AX−1)BXBYBY−BX≤x\Leftrightarrow (A_Y-A_X-1)B_XB_Y\le x(B_Y-B_X)\Leftrightarrow \frac{(A_Y-A_X-1)B_XB_Y}{B_Y-B_X}\le x(AYAX1)BXBYx(BYBX)BYBX(AYAX1)BXBYx

    • f(x)≤g(x)f(x)\le g(x)f(x)g(x)

      (AY−AX)BXBYBY−BX≥x\frac{(A_Y-A_X)B_XB_Y}{B_Y-B_X}\ge xBYBX(AYAX)BXBYx

  • g(x)<f(x)≤g(x)+1⇒F(x)={G(x),G(x)+1}g(x)<f(x)\le g(x)+1\Rightarrow F(x)=\bigg\{G(x),G(x)+1\bigg\}g(x)<f(x)g(x)+1F(x)={G(x),G(x)+1}

    • g(x)<f(x)g(x)<f(x)g(x)<f(x)

      (AY−AX)BXBYBY−BX<x\frac{(A_Y-A_X)B_XB_Y}{B_Y-B_X}< xBYBX(AYAX)BXBY<x

    • f(x)<g(x)+1f(x)<g(x)+1f(x)<g(x)+1

      (AY−AX+1)BXBYBY−BX>x\frac{(A_Y-A_X+1)B_XB_Y}{B_Y-B_X}> xBYBX(AYAX+1)BXBY>x

  • g(x)+1<f(x)⇒F(x)>G(x)g(x)+1<f(x)\Rightarrow F(x)>G(x)g(x)+1<f(x)F(x)>G(x)

只有两种情况才可能出现F(x)=G(x)F(x)=G(x)F(x)=G(x),并且可以数学化的解出f(x)f(x)f(x)的范围

在已知范围[l,r][l,r][l,r]内,可以巧妙转化,∑i=lr[F(i)=G(i)]⇔(r−l+1)−∣∑x=lrAX+⌊xBX⌋−∑x=lrAY+⌊xBY⌋∣\sum_{i=l}^r\bigg[F(i)=G(i)\bigg]\Leftrightarrow (r-l+1)-\bigg|\sum_{x=l}^rA_X+\lfloor\frac{x}{B_X}\rfloor-\sum_{x=l}^{r}A_Y+\lfloor\frac{x}{B_Y}\rfloor\bigg|i=lr[F(i)=G(i)](rl+1)x=lrAX+BXxx=lrAY+BYx

差分地计算∑x=lrAX+⌊xBX⌋\sum_{x=l}^rA_X+\lfloor\frac{x}{B_X}\rfloorx=lrAX+BXx

∑x=1na+⌊xb⌋=b∗(a+a+⌊nb⌋−1)∗⌊xb⌋2+(n−⌊nb⌋∗b+1)∗(a+⌊xb⌋)\sum_{x=1}^na+\lfloor\frac{x}{b}\rfloor=b*\frac{(a+a+\lfloor\frac{n}{b}\rfloor-1)*\lfloor\frac{x}{b}\rfloor}{2}+(n-\lfloor\frac{n}{b}\rfloor*b+1)*(a+\lfloor\frac{x}{b}\rfloor)x=1na+bx=b2(a+a+bn1)bx+(nbnb+1)(a+bx)

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define eps 1e-8int calc( int a, int b, int n ) {int t = ( n + 1 ) / b;return ( a * 2 + ( t - 1 ) ) * t * b / 2 + ( a + t ) * ( n - t * b + 1 );
}signed main() {int T, n, AX, AY, BX, BY;scanf( "%lld", &T );long double L, R; int l, r, ans, cnt;while( T -- ) {scanf( "%lld %lld %lld %lld %lld", &n, &AX, &BX, &AY, &BY );if( BX == BY ) {if( AX == AY ) printf( "%lld\n", n );else printf( "0\n" );continue;}if( BX > BY ) swap( AX, AY ), swap( BX, BY );ans = 0;//g(x)-1<=f(x)<=g(x)L = 1.0 * ( AY - AX - 1 ) * BX * BY / ( BY - BX ) + eps;R = ( AY - AX ) * 1.0 * BX * BY / ( BY - BX );if( L < 1 ) l = 1;else l = ceil( L );if( R > n ) r = n;else r = floor( R );r = max( r, l - 1 );cnt = calc( AY, BY, r ) - calc( AY, BY, l - 1 ) - calc( AX, BX, r ) + calc( AX, BX, l - 1 );ans += r - l + 1 - cnt;//g(x)<f(x)<g(x)+1L = R + eps;R = ( AY - AX + 1 ) * 1.0 * BX * BY / ( BY - BX ) - eps;if( L < 1 ) l = 1;else l = ceil( L );if( R > n ) r = n;else r = floor( R );r = max( r, l - 1 );cnt = calc( AX, BX, r ) - calc( AX, BX, l - 1 ) - calc( AY, BY, r ) + calc( AY, BY, l - 1 );ans += r - l + 1 - cnt;printf( "%lld\n", ans );} return 0;
} 

F - Insert Addition

数列的生成类比斯坦纳树

因为a,ba,ba,b的范围,迭代次数永远小于生成数的大小,因此考虑充分迭代多次后保留≤n\le nn的数

如果(x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)(x1,y1),(x2,y2)在系数数列中相邻,则有x1y2−x2y1=1x_1y_2-x_2y_1=1x1y2x2y1=1

并且只要坐标都>0>0>0,那么总有一个时刻在系数数列中有且仅出现一次

这是个欧几里得形式的式子,当且仅当(a,b)=1(a,b)=1(a,b)=1才有解

把数列当成斯坦纳树跑成线段树,(i,j)←(i−1,j−1)+(i−1,j+1)(i,j)\leftarrow (i-1,j-1)+(i-1,j+1)(i,j)(i1,j1)+(i1,j+1)

gcd(a,b)=1⇒i∗a+b∗j≤ngcd(a,b)=1\Rightarrow i*a+b*j\le ngcd(a,b)=1ia+bjn,就是莫比乌斯反演了,暴力枚举iii暴力算

#include <cstdio>
#define int long long
#define maxn 300005
int mu[maxn], prime[maxn];
bool vis[maxn];
int a, b, n, l, r;void init() {int cnt = 0;mu[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, mu[i] = -1;for( int j = 1;j <= cnt && i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) break;else mu[i * prime[j]] = -mu[i];}}
}void print( int x ) {if( l > r || x > n ) return;else if( l == 1 ) printf( "%lld ", x ), r --;else l --, r --;
}int calc( int x, int y ) {int cnt = 0;for( int i = 1;x + y <= n / i;i ++ ) {if( ! mu[i] ) continue;for( int j = 1;x * j + y <= n / i;j ++ )cnt += mu[i] * ( n / i - x * j ) / y;}return cnt;
}void print_all( int x, int y ) {if( x + y > n ) return;print_all( x, x + y );print( x + y );print_all( x + y, y );
}void dfs( int x, int y ) {int cnt = calc( x, y );if( l > r || ! cnt ) return;if( l > cnt ) {l -= cnt, r -= cnt;return;}if( l == 1 && cnt <= r ) {print_all( x, y );return;}dfs( x, x + y );print( x + y );dfs( x + y, y );
}signed main() {scanf( "%lld %lld %lld %lld %lld", &a, &b, &n, &l, &r );init();print( a ), dfs( a, b ), print( b );return 0;
}

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

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

相关文章

2.5:模拟总结

文章目录前言考场题目解析T1T2T3总结代码T1T2T3前言 50pts 30020 rnk19 … 把1000ms看成10s我也真是个人才。 T3自然溢出50带模数T成20有点离谱。 但倒没有因为WA失分。 就是菜罢了 考场 这次时间管理还是比较合理的。 乍看三题觉得T1似乎是个伞兵题 这离线下来可持久化数组…

Meeting HDU - 5521

Meeting HDU - 5521 题意&#xff1a; 一共有n个点&#xff0c;有m个块&#xff0c;每个块内有Si个点&#xff0c;块内点彼此到达费用为wi&#xff0c;两个人分别位于1和n号块&#xff0c;两者同时出发问最短时间遇到是多少&#xff1f;在哪些地方可以遇到&#xff1f; ΣSi&…

2.6模拟总结

前言 45pts 4500 rnk 34 写了200分&#xff0c;挂了155分 好哇&#xff01; 考场 这次状态还真是挺不错的。 开考&#xff0c;先看题。 T1期望&#xff0c;乍一看看不出来啥&#xff0c;似乎挺难的。 T2乍一看特别可做。 T3脑子里只有模拟退火 先去看T2。 被这种类似的题惯…

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

文章目录逆序对对序列未曾设想的道路牛客IOI周赛26-提高组逆序对 这种套路之前已经见过几次了&#xff0c;肯定不是模拟操作数列 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的情况会反转&…

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;等等…

Codeforces Round #724 (Div. 2) 题解

文章目录A. Omkar and Bad StoryB. Prinzessin der VerurteilungC. Diluc and KaeyaD. Omkar and MediansE. Omkar and ForestF. Omkar and Akmar#724-Div.2A. Omkar and Bad Story 直接set暴力加值&#xff0c;加满300300300个为止 #include <cstdio> #include <se…

2015沈阳区域赛

2015沈阳vj链接 题号题目知识点难度APattern StringBBazinga贪心签到题CMinimum Cut-CutDPagodas裴蜀定理签到题EEfficient TreeFFrogs欧拉函数银牌题GGame of Flying CircusHChessboardITriple二维线段树稳银快金JJohn’s FencesKKykneion asmaLNumber LinkMMeeting最短路&am…

模板:Prufer序列

所谓 Prufer 序列&#xff0c;就是 Prufer 发明的序列。 &#xff08;逃&#xff09; 前言 优雅的神奇魔术。 看名字很高大难&#xff0c;但实际上是高大清&#xff08;小清新&#xff09;。 很简单的建立起树与序列之间的双射&#xff0c;且这个序列的性质非常良好&#xff…

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

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

Codeforces Round #725 (Div. 3) 题解

文章目录A. Stone GameB. Friends and CandiesC. Number of PairsD. Another Problem About Dividing NumbersE. Funny SubstringsF. Interesting FunctionG. Gift Set#725-Div.3A. Stone Game 先找到最大值最小值的位置&#xff0c;然后有三种选取&#xff08;两边中走一边/两…

I - Triple HDU - 5517

I - Triple HDU - 5517 题意&#xff1a; 由多重集A和多重集B&#xff0c;<a,b>∈A&#xff0c;<c,d,e>∈B&#xff0c;集合CA * B{<a,c,d>|<a,b>∈A&#xff0c;<c,d,e>∈B and be}。 现在需要你求出有多少个<a,c,d>满足&#xff1a;不…

模板:广义二项式反演/广义容斥(组合数学)

文章目录前言经典容斥原理广义二项式反演/广义容斥min-max 容斥所谓二项式反演&#xff0c;就是对两个项的式子进行反演。 &#xff08;逃&#xff09; 前言 期望和容斥是我的感性二兄弟&#xff01; 之前的容斥我基本也都是靠感性理解做的… 感性理解就会导致&#xff1a;考…

WebApiClient与Asp.net core DI的结合

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

Codeforces Round #717 (Div. 2)

Codeforces Round #717 (Div. 2) CodeForces 1516 题号题目知识点ATit for Tat贪心BAGAGA XOOORRR思维题CBaby Ehab Partitions AgainDCutEBaby Ehab Plays with Permutations

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

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

2.7模拟总结

文章目录前言考场题目解析T1T2T3代码T1 forestT2 eulerT3 graph前言 130pts 2010010 终于没有挂分&#xff01; 开心&#xff01; 然而今天的题确实过于阴间…三道题几乎都没法写暴力&#xff0c;爆零场了属于是。 我这个分数都能到rnk4勒。 &#xff08;rnk39->rnk4&#…

基于xlua和mvvm的unity框架

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

A - Tit for Tat CodeForces - 1516A

A - Tit for Tat CodeForces - 1516A 题意&#xff1a; 一个长度为 n 的数组&#xff0c;现在希望你对这个数组进行至多k次操作&#xff1a;在数组中选择 2 个不同的元素&#xff0c;将第一个元素加 1 &#xff0c;然后从第二个元素减 1 。不过他有一个要求&#xff0c;进行操…

Codeforces Round #703 (Div. 2) 题解

文章目录A. Shifting StacksB. Eastern ExhibitionC. Guessing the GreatestD. Max MedianE. Paired PaymentF. Pairs of Paths#703 (Div. 2)A. Shifting Stacks 从左往右构造递增0,1,2...&#xff0c;如果这样都不能递增就肯定无解 雷区&#xff1a;不能用等差数列算个数&am…