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 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
随机推荐
- struts1使用select标签
今天使用struts1标签的时候总是出错,后来查了一下,好像不能和什么标签混用.就只用了html原来的标签实现 <select name="newsType_id"> ...
- Kotlin之注释
kotliin中注释和java注释是一样的,支持单行注释和多行注释,但kotlin支持嵌套,java不支持
- c#端口扫描器wpf+socket
布局如下 <Window x:Class="PortTest.MainWindow" xmlns="http://schemas.microsoft.com/win ...
- 如何数冲突域(collision domains)个数
数冲突域的核心是: switch.bridge的每个端口都是一个冲突域(因为它们有存储转发功能) hub的所有端口在同一冲突域内(因为hub本身是模拟导线,各个端口可以看成接在一起) 对下图而言 共有 ...
- redhat下配置SEED DVS6446开发环境2
---恢复内容开始--- 1.rpcbind步骤 linux包:portmap安装包 libgssglue-0.1-8.1.el6.i686.rpm libtirpc-0.2.1-1.el6.i68 ...
- JPA访问数据库的几种方式
JPA访问数据库的几种方式 本文为原创,转载请注明出处:https://www.cnblogs.com/supiaopiao/p/10901793.html 1. Repository 1.1. 通过 ...
- 使用多个fixture和fixture直接互相调用
使用多个fixture 如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组.list或字典,然后从里面取出对应数据. # test_fixture4.py impo ...
- Activity启动场景Task分析(二)
场景分析 下面通过启动Activity的代码来分析一下: 1.桌面 首先,我们看下处于桌面时的状态,运行命令: adb shell dumpsys activity 结果如下 ACTIVITY MAN ...
- Flume采集日志
角色 Source 数据来源 (exec, kafka, http…)Channel 数据通道 (memory,file,jdbc)Sink 数据目的地 (kafka,hdfs,es…) Agent ...
- cocos2dx[3.2](7) 核心类Director/Scene/Layer/Sprite
[核心类] 导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步: cocos2dx基础篇(2) 第一个程序 导演控制场景,场景控制图层,图层控制精灵,精灵控制动作. ...