【五一qbxt】test2
又犯了一些迷之错误??要不然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的更多相关文章
- 【五一qbxt】day7-2 选择客栈
停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...
- 【五一qbxt】test1
(不知道为什么居然爆零了qwq) (全员爆零诶,最高分10分???还是rand出来的???) 我freopen写错了????自闭了 不行不行再写一遍freopen加深印象,不能再写错了 freopen ...
- 【五一qbxt】day3 动态规划
动态规划 引例: 斐波那契数列: 边界条件:f0=0: f1=1: 能够直接被求出值的状态 不需要计算其他斐波那契数列的值直接可以得到结果: 转移方程:fn=fn-1+fn-2如何用已有状态求出未知状 ...
- 【五一qbxt】day7-1 引水入城
[noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...
- 【五一qbxt】day6 OI中的stl
from:why 很多很多part…… 1.pair: 相当于把两个变量放在一起: #include<utility> using namespace std; pair<TypeN ...
- 【五一qbxt】day5 图论
图论 学好图论的基础: 必须意识到图论hendanteng xuehuifangqi(雾 图 G = (V,E) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成两条即 ...
- 【五一qbxt】day4 数论知识
这些东西大部分之前都学过了啊qwq zhx大概也知道我们之前跟着他学过这些了qwq,所以: 先讲新的东西qwq:(意思就是先讲我们没有学过的东西) 进制转换 10=23+21=1010(2) =32+ ...
- MY TESTS
励志整理所有的n次考试的博客: [五一qbxt]test1 [五一qbxt]test2 [校内test]桶哥的问题 [6.10校内test] noip模拟 6.12校内test [6.12校内test ...
- 【qbxt五一】day2
简单数据结构 入门题: 在初学OI的时候,总会遇到这么一道题. 给出N次操作,每次加入一个数,或者询问当前所有数的最大值. 维护一个最大值Max,每次加入和最大值进行比较. 时间复杂度O(N). 给出 ...
随机推荐
- D. Treasure Hunting ( 思维题 , 贪心)
传送门 题意: 在一个 n * m 的地图里,有 k 个宝藏,你的起点在 (1, 1), 每次你能 向下向右向左移动(只要在地图里): 现在,有 q 个安全的列, 你只有在这些列上面,你才能 ...
- UVA 11178 Morley's Theorem 计算几何模板
题意:训练指南259页 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- luoguP1772 [ZJOI2006]物流运输 x
P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...
- codevs 1231 最优布线问题 x(find函数要从娃娃抓起系列)
题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一 ...
- [转载]blktrace分析IO
前言 上篇博客介绍了iostat的一些输出,这篇介绍blktrace这个神器.上一节介绍iostat的时候,我们心心念念希望得到块设备处理io的service time,而不是service time ...
- 试用saucelabs进行浏览器兼容性测试
Hi,all 跟大家分享下saucelabs,一个云测试平台,支持PC和手机(自带的)浏览器的兼容性测试,并且支持selenium/appium的自动化测试,不过是收费的,价格还挺贵,但是人工的测试是 ...
- JS框架_(JQuery.js)图片相册掀开切换效果
百度云盘 传送门 密码:y0dk 图片掀开切换效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...
- 微信小程序_(组件)组件基础
(progress.text.block) 组件基础效果 官方文档:传送门 Page({ /** * 页面的初始数据 */ data: { text:"Gary 微信小程序\n", ...
- python模块------pyautogui
安装 pip install pyautogui 基本使用 查询 screenWidth, screenHeight = pyautogui.size() # 屏幕尺寸 mouseX, mouseY ...
- 有关于Git操作(持续更新)
Git分支: 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git check ...