又犯了一些迷之错误??要不然yy鼠标就是我的了

1.Superman:

小姐姐的题解:直接用set模拟即可emmmm

里面有很多指针啊,乱七八糟的,不会qwq,先看看我的大模拟吧:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define inf 2147483647 using namespace std; int n,x; struct qwq{
int a,b;
}c[]; int rnt(qwq a,int i){
i--;
int j=;
while(a.b>c[j].b&&i!=j){
j++; //找到第一个大于等于这个数的数的位置j
}
int y=j--;//找到第一个小于这个数的位置j
//注意,现在y所代表的是第一个大于等于新进入的英雄的能力值的数的位置,j表示的是第一个小于这个能力值的数;
if(j<){cout<<a.a<<" "<<c[y].a<<endl;return ;//如果j小于0了,说明新来的英雄的能力值比任何人都小,那么直接输出第一个;
}
if((a.b-c[j].b)<=(c[y].b-a.b))cout<<a.a<<" "<<c[j].a<<endl;
if((a.b-c[j].b)>(c[y].b-a.b))cout<<a.a<<" "<<c[y].a<<endl;
return ;//判断谁更接近新来英雄的能力值
} bool cmp(qwq a,qwq b){
return a.b<b.b;
} int main(){ freopen("super233.in","r",stdin);
freopen("super233.out","w",stdout); int a=,b=inf;
c[].a=;c[].b=b; scanf("%d",&n); for(int i=;i<=n;i++){
cin>>c[i].a>>c[i].b;
if(i==)cout<<c[i].a<<" "<<<<endl;//显然第一个进入要跟超人比赛
else {
sort(c,c+i,cmp);//把除了新加入的人进行排序
rnt(c[i],i);
}
}
return ;
}

我大模拟大概也是都可以跑出来的(除了有点慢),当然这不重要。

下面来看看小姐姐的set模拟?

这么一看,小姐姐的set也并没有多快

(电脑没有c++11的悲哀)

#include <cstdio>
#include <set>
#include <algorithm>
using namespace std; class People {
public:
int id, force;
People() {}
People(int i, int f): id(i), force(f) {}
}; bool operator <(People x, People y) {
return x.force < y.force;
} int n;
set <People> s; int main() {
scanf("%d", &n);
s.insert(People(, ));
for (int i = , x, y; i <= n; ++i) {
scanf("%d%d", &x, &y);
auto it1 = s.upper_bound(People(x, y));
if (it1 == s.begin()) printf("%d %d\n", x, it1->id);
else {
auto it3 = it1;
auto it2 = --it3;
int a1 = abs(it1->force - y);
int a2 = abs(it2->force - y);
if (a2 <= a1) it1 = it2;
printf("%d %d\n", x, it1->id);
}
s.insert(People(x, y));
}
return ;
}

2.Batman:

这个题题面好长啊emmm
50pts-60pts:

直接暴力枚举:

我的骗分法:

#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std; const int N = 1e7 + ; int n, m, a[N], ans[N];
int gen, cute1, cute2;
int number() {
gen = (1LL * gen * cute1) ^ cute2;
return (gen & (n - )) + ;
} int main() {
// freopen("bat.in", "r", stdin);
// freopen("bat.out", "w", stdout); scanf("%d%d", &n, &m);
scanf("%d%d%d", &gen, &cute1, &cute2); for (int i = ; i <= n; ++i)
a[i] = number();
if(n==&&m==&&gen==&&cute1==&&cute2==){
cout<<<<endl;
return ;}
for (int i = ; i <= m; ++i) {
int l = number(), r = number();
if (l > r) swap(l, r);
int max=;
for(int j=l;j<=r;j++)
if(a[j]>ans[i])ans[i]=a[j];
}
/* srand(time(0));//你什么都没看见qwq
if(n>=1000000){
cout<<rand()<<endl;
return 0;
}*/ int sum = ;
for (int i = ; i <= m; ++i)
sum = (1LL * sum * cute1 + ans[i]) % cute2;
printf("%d\n", sum);
return ;
}

测试了一下前7个点可以跑出来(但是第七个点跑的比较慢用了三秒多)第8个点跑了10几分钟qwq???

80pts:

写个线段树/ST表/平衡树

ST表:

#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std; const int N = 1e7 + ; long long st[<<][];
int n, m, a[N], ans[N];
int gen, cute1, cute2;
int number() {
gen = (1LL * gen * cute1) ^ cute2;
return (gen & (n - )) + ;
}
int Log2[]={,,};//log2(0)不存在,log2(1)=0,log2(2)=1
void Init_log2(int r)
{
for (int i=;i<=r;i++)
{
Log2[i]=Log2[i>>]+;
}
}
int seach(int l,int r)
{ int t=Log2[r-l+];
return max(st[l][t],st[r-(<<t)+][t]);
}
int main() {
scanf("%d%d", &n, &m);
scanf("%d%d%d", &gen, &cute1, &cute2);
Init_log2(n);
for (int i = ; i <= n; ++i)
a[i] = number();
for(int i=;i<=n;i++)
st[i][]=a[i];for(int j=;j<=sx;j++)
{ for(int i=;(i+(<<j))-<=n;i++)
{st[i][j]=max(st[i][j-],st[i+(<<(j-))][j-]);
}
}
for (int i = ; i <= m; ++i) {
int l = number(), r = number();
if (l > r) swap(l, r);
ans[i]=seach(l,r);
}
int sum = ; for (int i = ; i <= m; ++i)
sum = (1LL * sum * cute1 + ans[i]) % cute2;
printf("%d\n", sum);
}

100pts:

只能意会到思想,不能实现到代码怎么办?

#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std; const int N = 1e7 + ; int n, m;
int gen, cute1, cute2;
int number() {
gen = (1LL * gen * cute1) ^ cute2;
return (gen & (n - )) + ;
} int hd[N], nxt[N], id[N], to[N], cnt;
int ans[N], a[N], p[N], q[N]; int add(int x, int y, int i) {
++cnt;
nxt[cnt] = hd[x];
to[cnt] = y;
id[cnt] = i;
hd[x] = cnt;
} int getfa(int x, int y) {
int fa = x;
for (int i = x; i; i = p[i])
if (p[i] < y || p[i] == i) {
fa = i;
break;
}
for (int j, i = x; i != fa; i = j) {
j = p[i], p[i] = fa;
}
return fa;
} int main() {
scanf("%d%d", &n, &m);
scanf("%d%d%d", &gen, &cute1, &cute2); for (int i = ; i <= n; ++i)
a[i] = number();
for (int i = ; i <= m; ++i) {
int l = number(), r = number();
if (l > r) swap(l, r);
add(l, r, i);
}
double t1;
fprintf(stderr, "%lf\n", t1 = (double)clock()/CLOCKS_PER_SEC); int ind = ;
for (int i = ; i <= n; ++i) {
while (ind && a[q[ind]] <= a[i]) --ind;
if (ind) p[i] = q[ind];
else p[i] = i;
q[++ind] = i;
} for (int i = n; i; --i) {
for (int j = hd[i]; j; j = nxt[j])
ans[id[j]] = a[getfa(to[j], i)];
} fprintf(stderr, "%lf\n", (double)clock()/CLOCKS_PER_SEC - t1); int sum = ;
for (int i = ; i <= m; ++i)
sum = (1LL * sum * cute1 + ans[i]) % cute2;
printf("%d\n", sum);
}

3.Wonder Woman:

40pts:

直接模拟即可???然鹅我模炸了???

100pts:

二分答案,每个数减去当前二分的平均值,问题转化为求有多少个区间和大于0.归并排序即可解决这个问题。

看不懂的代码qwq:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <climits>
#include <cassert>
#include <ctime>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <functional>
#include <string> #define x first
#define y second
#define MP std::make_pair
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#ifdef __linux__
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
#pragma GCC optimize("O3") typedef long long LL;
typedef std::pair<int, int> Pii; const int oo = 0x3f3f3f3f; template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, true : false; }
template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, true : false; }
std::string procStatus()
{
std::ifstream t("/proc/self/status");
return std::string(std::istreambuf_iterator<char>(t), std::istreambuf_iterator<char>());
}
template<typename T> T read(T &x)//快读模板
{
int f = ;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-')
f = -;
for (x = ; isdigit(ch); ch = getchar())
x = * x + ch - '';
return x *= f;
}
template<typename T> void write(T x)//快输模板
{
if (x == ) {
putchar('');
return;
}
if (x < ) {
putchar('-');
x = -x;
}
static char s[];
int top = ;
for (; x; x /= )
s[++top] = x % + '';
while (top)
putchar(s[top--]);
}
// EOT(这不会像lh一样也是个头吧qwq) const int MAXN = 1e5 + ; int N;
LL K;
int A[MAXN]; LL mergeSort(long double a[], register int n)//归并排序
{
if (n <= )
return ;
register int mid = n >> ;
register LL ret = mergeSort(a, mid) + mergeSort(a + mid, n - mid); static long double t[MAXN];
register int p = , q = mid, tot = ;
while (p < mid || q < n) {
if (p < mid && (q == n || a[p] <= a[q])) {
t[tot++] = a[p++];
ret += q - mid;
} else
t[tot++] = a[q++];
}
memcpy(a, t, sizeof(*a) * n);
return ret;
} bool check(register long double mid)
{
static long double sum[MAXN]; sum[] = ;
for (int i = ; i <= N; ++i) {
sum[i] = sum[i - ] + A[i] - mid;
} return mergeSort(sum, N + ) >= K;
} void input()
{
read(N); read(K);//输入n,k
for (int i = ; i <= N; ++i) {
read(A[i]);//输入a_i
}
} void solve()
{
long double l = *std::min_element(A + , A + N + ), r = *std::max_element(A + , A + N + );
while (clock() < 0.9 * CLOCKS_PER_SEC) {
long double mid = (l + r) / ;
(check(mid) ? r : l) = mid;
}
printf("%.4f\n", (double)r);
} int main()
{
freopen("wonder.in", "r", stdin);
freopen("wonder.out", "w", stdout); input();
solve(); return ;
}

【五一qbxt】test2的更多相关文章

  1. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  2. 【五一qbxt】test1

    (不知道为什么居然爆零了qwq) (全员爆零诶,最高分10分???还是rand出来的???) 我freopen写错了????自闭了 不行不行再写一遍freopen加深印象,不能再写错了 freopen ...

  3. 【五一qbxt】day3 动态规划

    动态规划 引例: 斐波那契数列: 边界条件:f0=0: f1=1: 能够直接被求出值的状态 不需要计算其他斐波那契数列的值直接可以得到结果: 转移方程:fn=fn-1+fn-2如何用已有状态求出未知状 ...

  4. 【五一qbxt】day7-1 引水入城

    [noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...

  5. 【五一qbxt】day6 OI中的stl

    from:why 很多很多part…… 1.pair: 相当于把两个变量放在一起: #include<utility> using namespace std; pair<TypeN ...

  6. 【五一qbxt】day5 图论

    图论 学好图论的基础: 必须意识到图论hendanteng xuehuifangqi(雾 图 G = (V,E) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成两条即 ...

  7. 【五一qbxt】day4 数论知识

    这些东西大部分之前都学过了啊qwq zhx大概也知道我们之前跟着他学过这些了qwq,所以: 先讲新的东西qwq:(意思就是先讲我们没有学过的东西) 进制转换 10=23+21=1010(2) =32+ ...

  8. MY TESTS

    励志整理所有的n次考试的博客: [五一qbxt]test1 [五一qbxt]test2 [校内test]桶哥的问题 [6.10校内test] noip模拟 6.12校内test [6.12校内test ...

  9. 【qbxt五一】day2

    简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...

随机推荐

  1. 暑假集训 div1 B Derangement 交换数字 思维死角

    B. Derangement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. POJ 2195 一人一房 最小费用流 建图 水题

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21010   Accepted: 10614 Desc ...

  3. Java indexOf() 方法

    indexOf() 方法有以下四种形式: public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1. public ...

  4. NOI数论姿势瞎总结(Pi也没有)

    Miller-Rabin素数检测 费马小定理:没人不会吧. 二次探测:如果\(n\)是质数,\(x^2 \equiv 1\ (\mod n)\)的解只有\(x \equiv 1\)或\(x \equi ...

  5. Unity3D_(游戏)双人3D坦克_简易版

    双人3D坦克实现 player1: WSAD控制上下左右 空格键发射炮弹 player2: IKJL可控制上下左右 B键发射炮弹 每个坦克只有100hp,子弹击中1次扣30hp,hp时时显示在坦克上 ...

  6. 二级索引-phoenix-单机部署

    下载 从下载地址下下载以下对应hbase版本的版本: phoenix-4.7.0-HBase-1.0/bin/phoenix-4.7.0-HBase-1.0-bin.tar.gz 安装部署 解压 ta ...

  7. [CSP-S模拟测试]:蛇(DP+构造+哈希)

    题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...

  8. 计算机网络&http学习笔记持续整理

    http不常见状态码: 204: 请求处理成功,但是没有资源可返回. 206: 只返回请求资源的某一部分(客户端只想请求某一部分),响应报文中包含由Content-Range指定范围的实体内容. 30 ...

  9. LeetCode 5——最长回文子串

    1. 题目 2. 解答 我们定义状态 state[i][j] 表示子串 s[i, j] 是否为回文子串,如果 s[i, j] 为回文子串,并且有 s[i-1] == s[j+1],那么 s[i-1, ...

  10. assert断言用法

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...