E-Both Sides Merger

给你一个序列,支持两种操作,直到序列中只有一个数时停下来,使得剩下数最大,并输出选数方案。

操作1:扔掉一个最前端或最后端的元素。操作2:选取一个不在边界上的元素,取其相邻两个数的和替换它,并删去它相邻的两个数。

n<=1000,|ai|<=1e9。

结论1:最后留下的数是原序列若干个数的和,并且这些数的下标同奇偶。

证明:一次两边往中间合并的过程等价于右边那个加在左边那个上,并删去中间的和右边的。由此发现整个数列下标的奇偶性都不变。

因为最后选择的两个数下标同奇偶,而这两个是由与它们下标同奇偶的另一些数构成的,因此所有选择的数同奇偶。

结论2:任意一种合法的取数方法,都可以构造成功。

证明:每两个待选数中间有奇数个数,可以一直用操作2使得每两个数相隔一位。再选择中间的元素合并即可。

取奇数/偶数的正数和较大的进行构造。选数方案从后往前选可以使得前面的下标不变,比较好处理。

对整个序列都是负数的特判一下。注意Max要设为负数。

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,Max,pos,tot,ans[N],a[N];
vector<int> vec;
typedef long long ll;
ll sum1,sum2;
int main()
{
scanf("%d",&n);Max=-1e9-;//注意max要赋值成负的!
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);if (a[i]>Max) Max=a[i],pos=i;
if (i&) sum1+=(a[i]>)?a[i]:;
else sum2+=(a[i]>)?a[i]:;
}
if (Max<)
{
printf("%d\n%d\n",Max,n-);
for (int i=n;i>pos;i--) printf("%d\n",i);
for (int i=;i<pos;i++) puts("");
return ;
}
for (int i=(sum1>sum2?:);i<=n;i+=) if (a[i]>) vec.push_back(i);
printf("%lld\n",max(sum1,sum2));
for (int i=n;i>vec[vec.size()-];i--) ans[++tot]=i;
for (int i=vec.size()-;i>=;i--)
{
int t=(vec[i]-vec[i-])/-;
while (t--) ans[++tot]=vec[i-]+;
ans[++tot]=vec[i-]+;
}
for (int i=;i<vec[];i++) ans[++tot]=;
printf("%d\n",tot);
for (int i=;i<=tot;i++) printf("%d\n",ans[i]);
return ;
}

F-Two Faces Edges

对于每一条边问反转方向后图中连通块的个数会否改变?n<=1000.

对于一条边u->v来说,考虑两个判定条件:1.v->u是否成立。2.u->v不经过(u,v)是否成立。

当这两个判定有且仅有一个成立时连通块个数会改变。第一个dfs一下。第二个按照邻接表正反dfs一下,并记录到达某个点的前驱,若从u开始的两次dfs中v的前驱有一个不为u,那么判定2成立。

O(n^2)。

 #include<bits/stdc++.h>
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
const int N=;
const int M=;
vector<int> vec[N];
int now,x[M],y[M],n,m,vis1[N][N],vis2[N][N];
void dfs1(int x,int fa)
{
for (int i=;i<vec[x].size();i++)
if (vec[x][i]!=fa)
if (!vis1[now][vec[x][i]]) vis1[now][vec[x][i]]=x,dfs1(vec[x][i],x);
}
void dfs2(int x,int fa)
{
for (int i=vec[x].size()-;i>=;i--)
if (vec[x][i]!=fa)
if (!vis2[now][vec[x][i]]) vis2[now][vec[x][i]]=x,dfs2(vec[x][i],x);
}
int main()
{
n=read();m=read();
for (int i=;i<=m;i++) x[i]=read(),y[i]=read(),vec[x[i]].push_back(y[i]);
for (int i=;i<=n;i++)
{
now=i;vis1[now][now]=vis2[now][now]=;//注意把起点的vis标记!
dfs1(i,-);
dfs2(i,-);
}
for (int i=;i<=m;i++)
puts(((vis1[y[i]][x[i]]!=)^(vis1[x[i]][y[i]]!=x[i]||vis2[x[i]][y[i]]!=x[i]))?"diff":"same");
return ;
}

Atcoder arc092的更多相关文章

  1. atcoder ARC092 D - Two Sequences 二分 & 二进制

    今天生日捏,嘻嘻~ 题意:给定A B数组长度为n 求所有 (1<=i,j <=n ) a[i]+b[j] 的异或和. n <=200000  ai bi <=228 这题比赛没 ...

  2. 【atcoder】Two Sequences [arc092 D](思维题)

    题目传送门:https://arc092.contest.atcoder.jp/tasks/arc092_b 这场arc好难啊...这场感觉不像正常的arc...其实这道题还可以更早写出来的,但是蒟蒻 ...

  3. 【AtCoder】ARC092 D - Two Sequences

    [题目]AtCoder Regular Contest 092 D - Two Sequences [题意]给定n个数的数组A和数组B,求所有A[i]+B[j]的异或和(1<=i,j<=n ...

  4. 【AtCoder】ARC092

    C - 2D Plane 2N Points 把能连边的点找到然后跑二分图匹配即可 #include <bits/stdc++.h> #define fi first #define se ...

  5. AtCoder整理(持续更新中……)

    做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...

  6. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  7. AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识

    链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...

  8. AtCoder Regular Contest 082

    我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...

  9. AtCoder Regular Contest 069 D

    D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

随机推荐

  1. C#多线程的应用

    1.进程 就像我们任务管理器里面运行的进程 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括 ...

  2. MySQL中可能遇到的问题及解决方法

    一.在创建存储函数时,出现错误: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQLDA ...

  3. zabbix之自动注册,编写触发器:一定时间内超过某个负载值的时间

    zabbix中添加主机很多时可以考虑自动注册来自动添加,下面按照图片顺序来看,zabbix版本:3.0.28 超过负载30%的持续时间 创建触发器:

  4. Java开发常见基础题大全

    1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. &&:短路与,如果第一个表达式为false时,第二 ...

  5. leetcode-160周赛-5240-串联字符串的最大长度

    题目描述: 自己的提交:O(2**n∗n∗m),m 为字符串长度 class Solution: def maxLength(self, arr: List[str]) -> int: from ...

  6. selenium基本元素定位-findElement(By.*)

    selenium基本元素的定位和操作 一. 查找元素 1.1 findElement(By.id) // by——>定位器——>以某种方式去找元素 driver.findElement(b ...

  7. mongodb4.0数据库权限配置

    今天给大家分享一个关于mongodb数据库权限配置的小知识点,这里呢,我用的是mongodb4.0版本,下载地址:https://www.mongodb.com/download-center/com ...

  8. Python 修改在使用ddt时测试报告默认显示用例名称与预期不符

    正常在不使用ddt时,在方法下添加注释,即可作为用例描述("""用例描述""") @BeautifulReport.add_test_img ...

  9. 【Flutter学习】基本组件之基本按钮组件

    一,概述 由于Flutter是跨平台的,所以有适用于Android和iOS的两种风格的组件.一套是Google极力推崇的Material,一套是iOS的Cupertino风格的组件.无论哪种风格,都是 ...

  10. Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用

    一.使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法    2> 提取本机的IP地址.根分区使用率    3> 格式化输出/et ...