ARC 100

链接

https://arc100.contest.atcoder.jp/

Linear Approximation

题解

把ai减去i后排序, 我们要的b就是排完序后的中位数

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4
 5 ll read(){
 6     ll x=0,f=1;char c=getchar();
 7     while(c<‘0‘ || c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
 8     while(c>=‘0‘ && c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
 9     return x*f;
10 }
11
12 int n;
13 int a[200200];
14 map<int,int> m;
15
16 int main(){
17 #ifdef LZT
18     freopen("in","r",stdin);
19 #endif
20     n=read();
21     for(int i=1;i<=n;i++) a[i]=read()-i;
22     ll ans=0;
23     sort(a+1,a+n+1);
24     int mx=a[(n+1)/2];
25     for(int i=1;i<=n;i++) ans+=abs(a[i]-mx);
26     printf("%lld\n",ans);
27     return 0;
28 }

Equal Cut

题解

如果只切一刀,那么很好确定位置

我们预处理出前i个和后i个切一刀的最佳位置

然后枚举中间的一刀的位置 然后前面后面两刀都处理出来了 算一下取最大值就好

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4
 5 ll read(){
 6     ll x=0,f=1;char c=getchar();
 7     while(c<‘0‘ || c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
 8     while(c>=‘0‘ && c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
 9     return x*f;
10 }
11
12 int n;
13 ll a[200200];
14 ll fen1[200200],fen2[200200];
15 pair<ll,ll> s1[200200],s2[200200];
16
17 int main(){
18     #ifdef LZT
19     freopen("in","r",stdin);
20     #endif
21     n=read();
22     for(int i=1;i<=n;i++) a[i]=read();
23     ll pos=1,sum=a[1],sum2=a[1];
24     for(int i=2;i<=n-2;i++){
25         sum2+=a[i];
26         while(pos<i){
27             ll nwsum=sum+a[pos+1];
28             //cout<<sum2<<‘ ‘<<sum<<‘ ‘<<nwsum<<endl;
29             if(abs(sum2-sum-sum)>abs(sum2-nwsum-nwsum)){
30                 pos++;
31                 sum=nwsum;
32             }
33             else break;
34         }
35         //cout<<pos<<endl;
36         if(pos==i) sum-=a[pos],pos--;
37         fen1[i]=pos;
38         s1[i].first=sum;
39         s1[i].second=sum2-sum;
40         //cout<<i<<‘ ‘<<sum<<‘ ‘<<sum2-sum<<endl;
41     }
42     pos=n,sum=a[n],sum2=a[n];
43     for(int i=n-1;i>2;i--){
44         sum2+=a[i];
45         while(pos>i){
46             ll nwsum=sum+a[pos-1];
47             if(abs(sum2-sum-sum)>abs(sum2-nwsum-nwsum)){
48                 pos--;
49                 sum=nwsum;
50             }
51             else break;
52         }
53         if(pos==i) sum-=a[pos],pos++;
54         fen2[i]=pos;
55         s2[i].first=sum;
56         s2[i].second=sum2-sum;
57         //cout<<i<<‘ ‘<<sum<<‘ ‘<<sum2-sum<<endl;
58     }
59     ll ans=1e18;
60     for(int i=2;i<=n-2;i++){
61         ll S1=s1[i].first,S2=s1[i].second,S3=s2[i+1].first,S4=s2[i+1].second;
62         ans=min(ans,max(max(max(S1,S2),S3),S4)-min(min(min(S1,S2),S3),S4));
63     }
64     printf("%lld\n",ans);
65     return 0;
66 }
67
68 /*
69 5
70 3 2 4 1 2
71 */

Or Plus Max

题解

我们要求max Ai+Aj s.t. i or j <=x

可以转化成max Ai+Aj s.t. i or j =x 然后求一个前缀max

转化成max Ai+Aj s.t. i or j ∈ x 然后求一个前缀max

转化成(max Ai s.t. i ∈ x )+ (second_max Ai s.t. i ∈ x)

所以我们需要维护pair<int,int> b[x]表示所有i∈x的最大值和第二大值

所有i∈x => 快速Zeta变换

然后就做完了

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4
 5 ll read(){
 6     ll x=0,f=1;char c=getchar();
 7     while(c<‘0‘ || c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
 8     while(c>=‘0‘ && c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
 9     return x*f;
10 }
11
12 int n;
13 int a[1000100];
14 pair<int,int> b[1000100];
15
16 void upd(int x,int y){
17     int num1=b[x].first,num2=b[x].second,num3=b[y].first,num4=b[y].second;
18     b[x].first=max(num1,num3);
19     if(num1>num3) b[x].second=max(num2,num3);
20     else b[x].second=max(num1,num4);
21 }
22
23 int main(){
24     #ifdef LZT
25     freopen("in","r",stdin);
26     #endif
27     n=read();
28     for(int i=0;i<(1<<n);i++)
29         a[i]=read();
30     for(int i=0;i<(1<<n);i++)
31         b[i].first=a[i],b[i].second=-1e9;
32     for(int k=0;k<n;k++){
33         //cout<<k<<endl;
34         for(int i=0;i<(1<<n);i++){
35             if((i&(1<<k))!=0) continue;
36             upd(i|(1<<k),i);
37             //cout<<(i|(1<<k))<<‘ ‘<<i<<endl;
38         }
39     }/*
40     for(int i=0;i+1<(1<<n);i++){
41         upd(i+1,i);
42     }*/
43     int lastans=0;
44     for(int i=1;i<(1<<n);i++){
45         lastans=max(lastans,b[i].first+b[i].second);
46         printf("%d\n",lastans);
47     }
48     return 0;
49 }
50
51 /*
52 2
53 1 2 3 1
54 */

Colorful Sequences

原文地址:https://www.cnblogs.com/wawawa8/p/9380077.html

时间: 2024-10-10 03:41:13

ARC 100的相关文章

ARC 100 C - Linear Approximation题解---三分法

题目链接: https://arc100.contest.atcoder.jp/tasks/arc100_a 分析: 比赛时做这题想到一个瞎搞的方法就是在平均数上下波动一下取最小值,然后大佬yjw学长说这就是个严格单调单峰函数直接三分法就好了,虽然之前就听过则还是第一次打 三分法 设有最大值函数f(x)定义域为\([l,r]\),我们在定义域内找两个点\(lmid,rmid(lmid<rmid)\) 若\(f(lmid)<f(rmid)\),要么\(lmid\)和\(rmid\)都在单峰左边,

【AtCoder】 ARC 100

link C-Linear Approximation 给出\(N\)个数\(A_1,A_2,...,A_N\) ,求一个数\(d\),最小化\(\sum_{i=1}^N|A_i-(d+i)|\) 把\(A_i-i\)排个序,选取\(d=\)它们的中位数 #include<bits/stdc++.h> #define ll long long #define dbg1(x) cerr<<#x<<"="<<(x)<<"

HTML5 Canvas arc()函数//////////////////////(转)

HTML5 Canvas arc()函数 实例 创建一个圆形: var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(100,75,50,0,2*Math.PI); ctx.stroke(); 浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 arc() 方法.

对canvas arc()中counterclockwise参数的一些误解

一直没有很细心地去研究CanvasRenderingContext2D对象的arc方法,对它的认识比较模糊,导致犯了一些错误,特发此文,以纠正之前的错误理解. arc()方法定义如下: arc() 方法使用一个中心点和半径,为一个画布的当前子路径添加一条弧. 语法: arc(x, y, radius, startAngle, endAngle, counterclockwise) 参数 描述 x, y 描述弧的圆形的圆心的坐标. radius 描述弧的圆形的半径. startAngle, end

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等

超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 <canvas> 元素. 贴士:全部例子都分享在我的 GayHub - https://github.com/bxm0927/canvas-special 尤雨溪个人主页炫彩三角纽带效果,点击还可变换 GitHub源码 . Demo演示 知乎登录注册页动态离子背景效果 GitHub源码 . Demo演

HTML5 arc的例子

demo.html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>arc</title> <script> function init() { var canvas=document.getElementById('canvas'); var ctx=canvas.getContext(&q

HTML5 Canvas arc()函数

实例 创建一个圆形: var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.beginPath(); ctx.arc(100,75,50,0,2*Math.PI); ctx.stroke(); 浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 arc() 方法. 注释:Internet Explorer

HTML5新增Canvas标签及对应属性、API详解(基础一)

知识说明: HTML5新增的canvas标签,通过创建画布,在画布上创建任何想要的形状,下面将canvas的API以及属性做一个整理,并且附上时钟的示例,便于后期复习学习!Fighting! 一.标签原型 <canvas width=”1000” height=”1000” id=”myCanvas”> 您的浏览器版本过低,不支持HTML5新增的canvas标签. </canvas> 使用js获取该画布,并指定对象 <script> Var canvasID = doc

html5 canvas 详细使用教程

导航 前言 基本知识 绘制矩形 清除矩形区域 圆弧 路径 绘制线段 绘制贝塞尔曲线 线性渐变 径向渐变(发散) 图形变形(平移.旋转.缩放) 矩阵变换(图形变形的机制) 图形组合 给图形绘制阴影 绘制图像(图片平铺.裁剪.像素处理[不只图像.包括其他绘制图形]) 绘制文字 保存和恢复状态(context) 保存文件 结合setInterval制作动画 结语.demo下载   前言 <canvas></canvas>是html5出现的新标签,像所有的dom对象一样它有自己本身的属性.