Atcoder Regular 098 区间Pre=Xor Q询问区间连续K去最小值最小极差
C
用scanf("%s")就会WA..不知道为什么
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = 3e5 + ;
int preE[N];
int preW[N];
string f;
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n;
cin >> n;
cin >> f;
preE[] = preW[] = ;
for (int i = ; i <= n; i++)
{
if (f[i - ] == 'W')
{
preW[i] = preW[i - ] + ;
preE[i] = preE[i - ];
}
else
{
preE[i] = preE[i - ] + ;
preW[i] = preW[i - ];
}
}
ll anser = INT_MAX;
ll now;
for (int i = ; i <= n; i++)
{
now = preW[i - ] - preW[];
now += preE[n] - preE[i];
anser = min(anser, now);
}
cout << anser << endl;
return ;
}
D
题意:
给你N个非负数(1e5) 要求你求出有多少个区间内 区间和等于区间亦或和 给的数小于220
解:
因为XOR操作中 0^0=0 1^1=0 0^1=1 如果两个数相加有进位操作的话 肯定会损失值
所以我们把0特殊化 直接暴力 如果有位数重复的就不成立 所以每次查询的区间长度不会超过20
复杂度为1e6左右
/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + ;
const int gakki = + + + + 1e9;
const int N = 2e5 + ;
ll num[N];
int last = ;
int Left[N];
ll yihuo;
ll pre;
int main()
{
ios_base::sync_with_stdio();
cin.tie();
int n;
cin >> n;
ll anser = ;
for (int i = ; i <= n; i++)
{
cin >> num[i];
Left[i] = last;
if (num[i])
{
last = i;
}
}
ll now;
ll i, j;
for (i = ; i <= n; i++)
{
yihuo = pre = num[i];
for (j = Left[i]; j >= ;j = Left[j])
{
yihuo = yihuo ^ num[j];
pre += num[j];
if (yihuo != pre)
{
break;
}
}
anser+=i-j;
}
cout << anser << endl;
return ;
}
改进版:我们发现如果L-R区间是满足的 那么 L - R 内任意一个子区间也是满足的 即 L+1 - R 也行
所以每次取完极大满足条件的区间后 当R右移一格时 满足条件的L一定不会在前一个的左边
#include<bits/stdc++.h>
using namespace std;
int n;
long long s[];
long long a[];
long long ans;
int main(){;
scanf("%d",&n);
for (int i=;i<=n;i++){
int x;
scanf("%d",&x);
s[i]=s[i-]+x;
a[i]=a[i-]^x;
}
int l=;
for (int r=;r<=n;r++){
for (;(s[r]-s[l-])!=(a[r]^a[l-]);l++);
ans+=r-l+;
}
printf("%lld\n",ans);
}
E
题意:
给你一个N个数(2000)的数列 每次操作可以让长度为K的连续序列内的最小值去除 你必须要去除Q次
假设这Q次中去除的最大的为X最小的为Y 问你X-Y最小可以是多少
解:
从1到N 枚举Y=A[i]
然后再找出全部原数列中可以删的不小于A[i]的数
如果找出的数的数目小于Q则不满足条件 跳过 反之则排序去第Q个减去A[i]即为一种的答案
总复杂度为N2LOGN
#include<bits/stdc++.h>
using namespace std;
int a[], b[], c[];
int n, k, q, ans;
int main()
{
scanf("%d%d%d", &n, &k, &q);
for (int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
}
ans = 1e9 + ;
for (int i = ; i <= n; i++) //枚举每个作为Y的a[i]
{
int l = ;
int cnt = ;
for (int j = ; j <= n + ; j++)
if (a[i] > a[j])
{
if (!l) //如果前面没有比a[i]大的 先跳过
{
continue;
}
int r = j - ; //这样L到R区间内所有数都是不小于a[i]的
for (int p = l; p <= r; p++)
{
b[p] = a[p];
}
sort(b + l, b + r + );
for (int p = l; p + k - <= r; p++) //L到R区间内得有不小于K数目的数
{
c[++cnt] = b[p]; //把能删的最小的都删掉
}
l = ;
}
else if (!l) //枚举到不小于a[i]的
{
l = j;
}
if (cnt < q)
{
continue;
}
sort(c + , c + cnt + );
//printf("%d\n",c[q]);
ans = min(ans, c[q] - a[i]);
}
printf("%d\n", ans);
}
Atcoder Regular 098 区间Pre=Xor Q询问区间连续K去最小值最小极差的更多相关文章
- AtCoder Regular Contest 098
AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定 ...
- Atcoder Beginner Contest 121 D - XOR World(区间异或和)
题目链接:https://atcoder.jp/contests/abc121/tasks/abc121_d 题目很裸(Atcoder好像都比较裸 就给一个区间求异或和 n到1e12 肯定不能O(n) ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest
一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- Atcoder regular Contest 073(C - Sentou)
Atcoder regular Contest 073(C - Sentou) 传送门 每个人对开关的影响区间为a[i]--a[i]+t,因此此题即为将所有区间离散化后求所有独立区间的长度和 #inc ...
- SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)
http://www.spoj.com/problems/GSS1/ 题意:无更新询问区间最大连续和. 做法:线段树每个节点维护sum[rt],maxsum[rt],lsum[rt],rsum[rt] ...
- HDU - 1754 线段树-单点修改+询问区间最大值
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...
- POJ - 3264 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
随机推荐
- OPCDAAuto的一个坑
最近项目需要对SCADA系统的下位机采集实时数据,常见做法是两种,一种采用ModBus RTU/TCP协议直接通过支持ModBus的下位机通信,一种是通过OPC规范,使用厂商提供的OPC Server ...
- MYSQL5.6二进制包的安装
二进制1. 下载包 wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz2. 解 ...
- 10 mysql选错索引
10 mysql选错索引 在mysql表中可以支持多个索引,有的sql不指定使用哪个索引,由mysql自己来决定,但是有时候mysql选错了索引,导致执行很慢. 例子 CREATE TABLE `t1 ...
- Hibernate框架 初识 ORM概念
Hibernate概述 Hibernate是一个ORM(对象关系映射)映射框架,它的核心思想就是在底层对JDBC进行了一次封装. 什么是框架 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 ...
- windows10上同时安装py2和py3的情况
2018-06-14 16:14:51 1.同时安装python2和python3的时候,pip只是其中一个版本,使用对应Python版本的pip时,在命令行分别输入如下命令: 查看不同Python ...
- beanFactory 设计模式 Bean 生命周期
写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...
- js里面for循环的++i与i++
首先我们应该都知道++i与i++的区别是: ++i 是先执行 i=i+1 再使用 i 的值,而 i++ 是先使用 i 的值再执行 i=i+1: 然后我们也知道for循环的执行顺序如下: for(A;B ...
- Day02:正则表达式 / Object / 包装类
JAVA正则表达式 实际开发中,经常需要对字符串数据进行一些复杂的匹配,查找,替换等操作. 通过"正则表达式",可以方便的实现字符串的复杂操作. 正则表达式是一串特定字符,组成一个 ...
- 英特尔® Open Image Denoise 库有助于节省时间,提高质量
在使用光线跟踪增强真实性与沉浸感时,游戏开发人员面临复杂的权衡.为了克服一系列挑战,英特尔创建了使用光线跟踪进行图像渲染的一整套解决方案,包含高性能开源滤波器.该解决方案已发布测试版,被集成至 Uni ...
- Zookeeper 假死脑裂
该问题就是服务集群因为网络震荡导致的多主多从问题,解决方案就是设置服务切换的超时时间,但也同时会导致无法达到高可用的要求.