[atAGC043B]123 Triangle
不妨先操作一轮,使得$0\le a_{i}\le 2$
结论:若序列中存在1,则答案为0或1
考虑归纳,注意到若序列中存在1,除非所有元素均为1,否则操作一轮后必然仍存在1,那么根据归纳假设即成立,而当所有元素均为1时,显然答案一定为0或1(序列长度已经为1),同样成立
由此,实际上只需要通过奇偶性即可确定答案,而注意到$|x-y|\equiv x+y(mod\ 2)$,因此不妨将转移的式子变为$a'_{i}=a_{i}+a_{i+1}$(模2意义下)
简单计数,不难发现$a_{i}$对答案的贡献即${n-1\choose i-1}a_{i}$,求出其模2的值并相加即可
另外,如果序列中不存在1,分类讨论:
1.若序列中不存在2,显然答案即为0
2.若序列中存在2,不妨将所有$a_{i}$除以2后求出答案,再将答案乘上2即可
时间复杂度为$o(n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 int n,a[N];
5 char s[N];
6 int C(int n,int m){
7 return (n&m)==m;
8 }
9 int calc(){
10 int ans=0;
11 for(int i=1;i<=n;i++)
12 if (a[i]&1)ans^=C(n-1,i-1);
13 return ans;
14 }
15 int main(){
16 scanf("%d%s",&n,s+1);
17 n--;
18 for(int i=1;i<=n;i++)a[i]=abs((int)s[i]-(int)s[i+1]);
19 bool flag=0;
20 for(int i=1;i<=n;i++)
21 if (a[i]==1)flag=1;
22 if (flag)printf("%d\n",calc());
23 else{
24 flag=0;
25 for(int i=1;i<=n;i++)
26 if (a[i]==2)flag=1;
27 if (!flag)printf("0\n");
28 else{
29 for(int i=1;i<=n;i++)a[i]>>=1;
30 printf("%d\n",(calc()<<1));
31 }
32 }
33 return 0;
34 }
[atAGC043B]123 Triangle的更多相关文章
- 二分--1043 - Triangle Partitioning
1043 - Triangle Partitioning PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: ...
- 1043 - Triangle Partitioning(数学)
1043 - Triangle Partitioning PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit ...
- Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志
12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...
- [LeetCode] Triangle 三角形
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- [LeetCode] Pascal's Triangle II 杨辉三角之二
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- [LeetCode] Pascal's Triangle 杨辉三角
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
- 【leetcode】Pascal's Triangle II
题目简述: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Retur ...
- 【leetcode】Pascal's Triangle
题目简述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...
- POJ 1163 The Triangle(简单动态规划)
http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
随机推荐
- VirtualBox设置双网卡实现主宿互访及虚拟机访问互联网总结
1,配置网络 注:VirtualBox要在全局工具-主机网络管理器里新建一个虚拟网卡. 然后虚拟机的网卡1设置为host-only,界面名称为新建的虚拟网卡(我这里为了不跟主机ip冲突,设置成了不同网 ...
- == 和 equals区别
== equals是两种字符串的方式 区别 == 是比较两个对象的引用地址值 equals是比较两个对象的具体内容 示例 package com.oop.demo06; public class De ...
- docker-compose 搭建mongo集群
创建目录 在每台机器上操作此步骤 一.在编写容器文件之前的注意事项: 1.yaml文件的指令前端不能使用tab键只能使用空格 2.storage: 指令的对接只能使用 : 不能使用 = 冒号的后面要跟 ...
- display:none、visibility:hidden,opacity:0三者区别
1. display:none 设置display:none,让这个元素消失 消失不占据原本任何位置 连带子元素一起消失 元素显示:display:block 2. visibility:hidden ...
- Java中JDK、JRE和JVM三者之间有什么区别和联系?Java基础!
任何语言或软件都需要一个运行环境.正如人想生活在空气中,鱼想生活在水中一样,喜荫植物不能暴露在阳光下,任何物体个体的存在都离不开其所需的环境,编程语言也是一样的. 接下来就详细描述一下Java中JDK ...
- 搭建Mac+Java+appium+IOS真机自动化环境
一.安装前环境准备 1.确保电脑已经有homebrew(包管理器) 下载链接[https://brew.sh/] 2.通过 brew 安装node.js brew install node 安装 ...
- 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题
该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...
- selenium3 利用cookie实现免登陆
1.首先访问要操作的页面 2.登陆一次,使用Fiddle等工具抓取出cookie 3.按照如下代码,即可成功登陆 from selenium import webdriver url = " ...
- [调试笔记] 10.8模拟赛11 T4 甜圈
这题正解线段树维护哈希,同机房神犇已经讲的很明白了.这里只说sbwzx在调试的时候犯的sb错误. 1.关于pushdown和update 众所周知,sbwzx一写带lazy的线段树,就必在pushdo ...
- STM32单片机的学习方法(方法大体适用所有开发版入门)
1,一款实用的开发板. 这个是实验的基础,有时候软件仿真通过了,在板上并不一定能跑起来,而且有个开发板在手,什么东西都可以直观的看到,效果不是仿真能比的.但开发板不宜多,多了的话连自己都不知道该学哪个 ...