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去最小值最小极差的更多相关文章

  1. AtCoder Regular Contest 098

    AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定 ...

  2. Atcoder Beginner Contest 121 D - XOR World(区间异或和)

    题目链接:https://atcoder.jp/contests/abc121/tasks/abc121_d 题目很裸(Atcoder好像都比较裸 就给一个区间求异或和 n到1e12 肯定不能O(n) ...

  3. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  4. AtCoder Regular Contest

    一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...

  5. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  6. Atcoder regular Contest 073(C - Sentou)

    Atcoder regular Contest 073(C - Sentou) 传送门 每个人对开关的影响区间为a[i]--a[i]+t,因此此题即为将所有区间离散化后求所有独立区间的长度和 #inc ...

  7. SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)

    http://www.spoj.com/problems/GSS1/ 题意:无更新询问区间最大连续和. 做法:线段树每个节点维护sum[rt],maxsum[rt],lsum[rt],rsum[rt] ...

  8. HDU - 1754 线段树-单点修改+询问区间最大值

    这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...

  9. POJ - 3264 线段树模板题 询问区间最大最小值

    这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...

随机推荐

  1. struts1使用select标签

    今天使用struts1标签的时候总是出错,后来查了一下,好像不能和什么标签混用.就只用了html原来的标签实现 <select name="newsType_id"> ...

  2. Kotlin之注释

    kotliin中注释和java注释是一样的,支持单行注释和多行注释,但kotlin支持嵌套,java不支持

  3. c#端口扫描器wpf+socket

    布局如下 <Window x:Class="PortTest.MainWindow" xmlns="http://schemas.microsoft.com/win ...

  4. 如何数冲突域(collision domains)个数

    数冲突域的核心是: switch.bridge的每个端口都是一个冲突域(因为它们有存储转发功能) hub的所有端口在同一冲突域内(因为hub本身是模拟导线,各个端口可以看成接在一起) 对下图而言 共有 ...

  5. redhat下配置SEED DVS6446开发环境2

    ---恢复内容开始--- 1.rpcbind步骤  linux包:portmap安装包 libgssglue-0.1-8.1.el6.i686.rpm libtirpc-0.2.1-1.el6.i68 ...

  6. JPA访问数据库的几种方式

    JPA访问数据库的几种方式 本文为原创,转载请注明出处:https://www.cnblogs.com/supiaopiao/p/10901793.html 1. Repository 1.1. 通过 ...

  7. 使用多个fixture和fixture直接互相调用

    使用多个fixture 如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组.list或字典,然后从里面取出对应数据. # test_fixture4.py impo ...

  8. Activity启动场景Task分析(二)

    场景分析 下面通过启动Activity的代码来分析一下: 1.桌面 首先,我们看下处于桌面时的状态,运行命令: adb shell dumpsys activity 结果如下 ACTIVITY MAN ...

  9. Flume采集日志

    角色 Source 数据来源 (exec, kafka, http…)Channel 数据通道 (memory,file,jdbc)Sink 数据目的地 (kafka,hdfs,es…) Agent ...

  10. cocos2dx[3.2](7) 核心类Director/Scene/Layer/Sprite

    [核心类] 导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步: cocos2dx基础篇(2) 第一个程序 导演控制场景,场景控制图层,图层控制精灵,精灵控制动作. ...