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 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
随机推荐
- 左值引用&右值引用实践【TODO】
这篇文章写的很好,下半部分还未完全理解,后续还需要回头来看看20190706(): https://www.cnblogs.com/likaiming/p/9045642.html 简单实践如下: # ...
- np.hstack和np.vstack
np.vstack:按垂直方向(行顺序)堆叠数组构成一个新的数组 In[3]: import numpy as np In[4]: a = np.array([[1,2,3]]) a.shape Ou ...
- Error-ASP.NET:在从服务器接收结果时发生传输级错误。 (provider: Session Provider, error: 19 - 物理连接不可用)
ylbtech-Error-ASP.NET:在从服务器接收结果时发生传输级错误. (provider: Session Provider, error: 19 - 物理连接不可用) 1.返回顶部 1 ...
- 对redis的一些理解
缓存就是在内存中存储的数据备份,当数据没有发生本质变化的时候,我们避免数据的查询操作直接连接数据库,而是去 内容中读取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度要比从数据库 ...
- 慕课网_Java Socket应用---通信是这样练成的
第1章 网络基础知识 1-1 网络基础简介 (10:21) 第2章 Java 中网络相关 API 的应用 2-1 Java 中的 InetAddress 的应用 (08:10) import java ...
- Delphi中基本控件之SaveDialog控件的使用总结
首先向Form窗体拖一个SaveDialog控件,Name属性改为:dlgSave,然后添加一个按钮,Caption属性改为:浏览,Name属性改为:btnBrowse. 然后双击浏览按钮添加如下代码 ...
- Delphi实现类的持久化保存(DFM格式)
var inStream,outStream:TMemoryStream; begin inStream:=TMemoryStream.Create; outStream:=TMemoryStream ...
- 简单的servlet上传文件
boolean multipartContent = ServletFileUpload.isMultipartContent(request);if (multipartContent==true) ...
- Android 消息传递机制
线程间消息传递机制 1.消息怎么发送的? 我们都知道当调用Handler发送消息的时候,不管是调用 sendMessage,sendEmptyMessage,sendMessageDelayed还是其 ...
- Activity 的 36 大难点,你会几个
前言 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Activity 的内容以问题的形式梳理出来,也供大家查缺补漏. 本文中 ...