2019nc#7
题号 | 标题 | 已通过代码 | 题解/讨论 | 通过率 | 团队的状态 |
---|---|---|---|---|---|
A | String | 点击查看 | 进入讨论 | 566/3539 | 通过 |
B | Irreducible Polynomial | 点击查看 | 规律 | 730/2290 | 未通过 |
C | Governing sand | 点击查看 | 进入讨论 | 388/2088 | 通过 |
D | Number | 点击查看 | 进入讨论 | 959/1469 | 通过 |
E | Find the median | 点击查看 | 离散化 | 88/985 | OK |
F | Energy stones | 点击查看 | BIT | 16/132 | 未通过 |
G | Make Shan Happy | 点击查看 | 进入讨论 | 3/29 | 未通过 |
H | Pair | 点击查看 | 数位DP | 93/245 | OK |
I | Chessboard | 点击查看 | 进入讨论 | 17/83 | 未通过 |
J | A+B problem | 点击查看 | 进入讨论 | 1024/1844 | 通过 |
K | Function | 点击查看 | 进入讨论 | 8/49 | 未通过 |
E-Find the median
题意
n次操作,($n \le 400000$),每次给出$L_i, R_i$向集合中插入,让你把$[L_i, L_i+1, L_i+2, ... , R_i]$ 插入到集合中,同时输出集合的中位数。
集合一开始为空,($1 \le L_i, R[i] \le 1e9$)
思路
空间有限,所以不可以把两个端点间的一段单独拿出来当成一个点
动态开点也被卡了空间
具体思路还是离散化,我们可以中间的点和左端点看成一个点
把原来对闭区间的操作改为对左闭右开区间的操作
就是把原来的$[L_i, R_i]$ 更改为 $[L_i, R_i + 1)$
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize(4)
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
// #include<bits/extc++.h>
// using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a) typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll; const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /**********showtime************/
const int big = 1e9;
const int maxn = ;
int X[maxn],Y[maxn];
int L[maxn], R[maxn];
int a1,b1,c1,m1;
int a2,b2,c2,m2;
struct node{
int cnt;
ll sum;
int lazy;
int len;
} tree[maxn * ];
//离散化
vector<int>vec;
int getid(int x) {
return lower_bound(vec.begin(), vec.end(), x) - vec.begin() + ;
}
// void pushdown(int le,int ri,int rt) {
tree[rt<<].cnt += tree[rt].lazy;
tree[rt<<|].cnt += tree[rt].lazy;
tree[rt<<].lazy += tree[rt].lazy;
tree[rt<<|].lazy += tree[rt].lazy;
int mid = (le + ri) >> ; tree[rt<<].sum += 1ll*tree[rt].lazy * (vec[mid] - vec[le-]);
tree[rt<<|].sum += 1ll*tree[rt].lazy *(vec[ri] - vec[mid]);
tree[rt].lazy = ;
} void update(int L, int R, int le, int ri, int rt) {
if(le >= L && ri <= R) {
tree[rt].lazy++;
tree[rt].cnt++;
//因为每个节点表示【le实际值,ri实际值)的长度。
tree[rt].sum += 1ll*(vec[ri] - vec[le - ]);
return;
}
int mid = (le + ri) >> ;
if(tree[rt].lazy) pushdown(le,ri,rt);
if(mid >= L) {
update(L, R, le, mid, rt<<);
}
if(mid < R) {
update(L, R, mid+, ri, rt<<|);
}
tree[rt].sum = tree[rt<<].sum + tree[rt<<|].sum;
} int query(ll tot, int le, int ri, int rt) {
if(le == ri) { int cnt = tree[rt].cnt, res;
int lbound = vec[le-];
if(tot % cnt == ) {
res = lbound + tot / cnt - ;
}
else
res = lbound + tot / cnt;
return res; } int mid = (le + ri) >> ;
if(tree[rt].lazy) pushdown(le,ri,rt); ll lsum = tree[rt<<].sum;
if(lsum >= tot) return query(tot,le, mid, rt<<);
else return query(tot - lsum, mid+, ri, rt<<|);
}
int main(){ int n;
scanf("%d", &n);
scanf("%d%d%d%d%d%d", &X[], &X[], &a1, &b1, &c1, &m1);
scanf("%d%d%d%d%d%d", &Y[], &Y[], &a2, &b2, &c2, &m2); L[] = min(X[], Y[]) + ;
R[] = max(X[], Y[]) + ;
L[] = min(X[], Y[]) + ;
R[] = max(X[], Y[]) + ;
//因为我后面操作的是左闭右开区间,所以这里右端点++。
R[] ++; R[] ++;
vec.pb(L[]);vec.pb(R[] );
vec.pb(L[]);vec.pb(R[]);
for(int i=; i<=n; i++) {
X[i] = (1ll*a1 * X[i-] + 1ll*b1 * X[i-] + c1 )% m1;
Y[i] = (1ll*a2 * Y[i-] + 1ll*b2 * Y[i-] + c2 )% m2;
L[i] = min(X[i], Y[i]) + ;
R[i] = max(X[i], Y[i]) + ;
R[i] ++;
vec.pb(L[i]); vec.pb(R[i]);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
for(int i=; i<=n; i++) {
L[i] = getid(L[i]);
R[i] = getid(R[i]);
} int tot = vec.size(); ll all = ; for(int i=; i<=n; i++) { update(L[i], R[i] - , , tot, ); all += 1ll*(vec[R[i]-] - vec[L[i] - ]); printf("%d\n", query((all + )/, , tot, ));
}
return ;
}
H Pair
题意
给定A,B,C($A \le 1e9, B \le 1e9, C \le 1e9$),求满足
$$ (x \& y) > C $$
$$ (x \oplus y) < C$$
的<x, y>对数。其中
$ 1 \le x \le A, 1 \le y \le B$
思路
数位DP,自己code了好久
/*
* @Author: chenkexing
* @Date: 2019-08-09 23:58:00
* @Last Modified by: chenkexing
* @Last Modified time: 2019-08-10 22:19:16
* @Link https://ac.nowcoder.com/acm/contest/887/H
*/
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize(4)
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
// #include<bits/extc++.h>
// using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a) typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll; const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /**********showtime************/
ll dp[][][][][][][];
//dp[len][limit1][limit2][ok1][ok2]
//由于两个数要大于0,所以多加上ok1,ok2.
//f1 &的, f2 ^的 // == 2 表示不行了
int shuA[],shuB[],shuC[];
ll dfs(int len, int limit1, int limit2, int ok1, int ok2, int f1, int f2){
if(f1 == && f2 == ) return ;
if(dp[len][limit1][limit2][ok1][ok2][f1][f2] != -)
return dp[len][limit1][limit2][ok1][ok2][f1][f2];
if(len == ) {
return ok1 && ok2 && (f1 == || f2 == );
} int up1 = , up2 = ;
if(limit1) up1 = shuA[len];
if(limit2) up2 = shuB[len];
ll res = ;
// cout<<len<<" " << up1<<" , " << up2<<endl;
for(int i=; i<=up1; i++) {
for(int j=; j<=up2; j++) { // if(len == 2)cout<<len << " " << i << " , " << j << " = " << f1 <<" , , " <<f2 << endl; if(f1 == || f2 == )
res += dfs(len-, limit1 && i == up1, limit2 && j == up2, ok1 || i, ok2 || j, f1, f2);
else {
int F1 = f1, F2 = f2;
if((i & j) < shuC[len]) F1 = ;
else if((i & j) > shuC[len]) F1 = max(F1, ); if((i ^ j) > shuC[len]) F2 = ;
else if((i ^ j) < shuC[len]) F2 = max(F2, );
res += dfs(len-, limit1 && i == up1, limit2 && j == up2, ok1 || i, ok2 || j, F1, F2);
}
} }
dp[len][limit1][limit2][ok1][ok2][f1][f2] = res;
return res;
} int main(){
int T; scanf("%d", &T);
while(T--) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
memset(dp, -, sizeof(dp));
int len = ;
for(int i=; i<=len; i++) shuA[i] = a % , a = a >> ;
for(int i=; i<=len; i++) shuB[i] = b % , b = b >> ;
for(int i=; i<=len; i++) shuC[i] = c % , c = c >> ;
printf("%lld\n", dfs(len, , , , , , ));
}
return ;
}
2019nc#7的更多相关文章
- 2019nc#2
A Eddy Walker 题意 你有n个点(0-n-1),按顺序形成一个环,初始时你在0的位子,你随机顺时针走一步或者逆时针走一步, 一旦你走到一个点后,环上所有点都被经过至少一次后,你就必须停下来 ...
- 2019nc#10
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Blackjack 点击查看 背包DP 32/109 补好了 B Coffee Chicken 点击查看 进入讨论 738/2992 通过 ...
- 2019nc#9
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A The power of Fibonacci 点击查看 进入讨论 69/227 未通过 B Quadratic equation 点击查看 ...
- 2019NC#8
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A All-one Matrices 点击查看 单调栈+前缀和 326/2017 通过 B Beauty Values 点击查看 进入讨论 8 ...
- 2019nc#6
https://ac.nowcoder.com/acm/contest/886#question 题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Garbage Classificatio ...
- 2019nc#5
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A digits 2 点击查看 1017/2384 通过 B generator 1 点击查看 567/3692 通过 C generato ...
- 2019nc#4
题号 标题 已通过代码 题解 通过率 团队的状态 A meeting 点击查看 树直径 604/2055 B xor 点击查看 线段树维护线性基交 81/861 未通过 C sequence 点击 ...
- 2019nc#3
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Graph Games 点击查看 进入讨论 18/292 未通过 B Crazy Binary String 点击查看 1107/3615 ...
- 2019NC#1
LINK B Integration 题意: 给定$a_1,a_2,...,a_n$, 计算 $$\frac{1}{π}\int_{0}^{\infty}\frac{1}{\prod\limits_{ ...
随机推荐
- TypeScript入门实例
前言 TypeScript是JavaScript的超集,微软公司开发,利用es6语法,实现对js的面向对象编程思想,写代码的时候会像强类型语言一样,指定参数类型.返回值类型,类型不对会报错,但编译后还 ...
- 【iOS】“找不到使用指定主机名的服务器”
今天用 Application Loader 提交 APP 的时,遇到了这个奇葩的问题,如下图: 后来换个网络解决了……我也不知道什么原因,就这么奇葩的弄好了……
- Android CountDownTimer 类实现倒计时
本文用 Android 中的 CountDownTimer 类实现倒计时功能,类似输入手机号获得验证码.界面如下所示: 1. 点击 “开始计时” 按钮后开始进行倒计时, 2. 倒计时过程: 3. 时间 ...
- js常用事件列表
onmousedown.onmouseup 以及 onclick 事件 onmousedown, onmouseup 以及 onclick 构成了鼠标点击事件的所有部分.首先当点击鼠标按钮时,会触发 ...
- 自定义SWT控件四之其它下拉框
4.其它下拉框 4.1 添加联动二级多选择框(有添加按钮和删除按钮) package com.view.control.select; import java.util.ArrayList; impo ...
- (转载)js数组中的find、filter、forEach、map四个方法的详解和应用实例
数组中的find.filter.forEach.map四个语法很相近,为了方便记忆,真正的掌握它们的用法,所以就把它们总结在一起喽. find():返回通过测试的数组的第一个元素的值 在第一次调用 c ...
- 02、Java的lambda表达式和JavaScript的箭头函数
前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系:本次试图通过这篇文章弄懂上面的两个"语法糖". 简介 ...
- Jquery 实现添加删除,checkbok 的全选,反全选,但是批量删除没有实现
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title& ...
- PIP键盘设置实时时钟--智能模块
大家好,许久没来发帖,今天带来点干货.希望大家多多讨论,相互学习. 使用 TOPWAY Smart LCD (HMT050CC-C) PIP键盘设置实时时钟 第一步 建立工程 第二步 建立2 ...
- 【Python】狂蟒来袭 | 使用Anaconda搭建Python开发环境
这段时间转了一个小圈圈,发现又回来了,瞎忙.想要学习数据挖掘的小伙伴一定得对机器学习有所了解吧,我之前看过几页周志华老师的西瓜书,但终没能坚持下来. 人生处处是起点,什么时候都不晚.记此笔记以分享与督 ...