HDU 6464 权值线段树 && HDU 6468 思维题
免费送气球
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 566 Accepted Submission(s): 129
void solve(int Q, int type[], long long first[], long long second[]) {
vector<long long> vec;
for (int i = 0; i < Q; ++i) {
if (type[i] == 1) {
long long k = first[i], val = second[i];
while (k--) {
vec.push_back(val);
}
}
else if (type[i] == 2) {
sort(vec.begin(), vec.end());
long long l = first[i] - 1, r = second[i], res = 0;
while (l < r) {
res = (res + vec[l++]) % 1000000007;
}
printf("%lld\n", res);
}
}
}
为防止你被JMC的代码搞到头晕目眩,JMC特意给出了问题的文字描述。已知一开始有一个空序列,接下来有Q次操作,每次操作给出type、first和second三个值。当type为1时,意味着该操作属于第一种操作:往序列尾部添加first个second数。当type为2时,意味着该操作属于第二种操作:查询序列中第first小至第second小的数值之和(一共有(second - first + 1)个数被累加),并将结果对1000000007取模后输出。
第一行一个Q(1 <= Q <= 1e5),代表Q次操作。
接下来有Q行,每行包含三个整数type、first和second;其中1 <= type <= 2。当type等于1时,0 <= first,second < 1e9。当type等于2时,1 <= first <= second,且first和second均不大于目前已添加进序列的数的数量。
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n")
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl
#define ffread(a) fastIO::read(a)
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
const int inf = 0x3f3f3f3f;
const ll mod = ;
const double epx = 1e-;
const double pi = acos(-1.0);
//head-----------------------------------------------------------------
ll sum[maxn*],ans[maxn*];
void PushUp(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
ans[rt]=(ans[rt<<]+ans[rt<<|])%mod;
}
void update(int x,ll val,ll vall,int l,int r,int rt)
{
if(l==x&&r==x)
{
sum[rt]+=vall;
ans[rt]=(ans[rt]+val)%mod;
return;
}
int mid=(l+r)>>;
if(x<=mid)
update(x,val,vall,l,mid,rt<<);
else
update(x,val,vall,mid+,r,rt<<|);
PushUp(rt);
}
ll query1(int L,int R,int l,int r,int rt)
{
if(R<L)
return ;
if(L<=l&&R>=r)
{
return sum[rt];
}
int mid=(l+r)>>;
ll anss=;
if(L<=mid)
anss+=query1(L,R,l,mid,rt<<);
if(R>mid)
anss+=query1(L,R,mid+,r,rt<<|);
return anss;
}
int query2(ll x,int l,int r,int rt)
{
if(l==r)
{
return l;
}
int mid=(l+r)>>;
if(sum[rt<<]>=x)
return query2(x,l,mid,rt<<);
else
return query2(x-sum[rt<<],mid+,r,rt<<|);
}
ll query3(int L,int R,int l,int r,int rt)
{
if(R<L)
return ;
if(L<=l&&R>=r)
{
return ans[rt];
}
int mid=(l+r)>>;
ll anss=;
if(L<=mid)
anss=(anss+query3(L,R,l,mid,rt<<))%mod;
if(R>mid)
anss=(anss+query3(L,R,mid+,r,rt<<|))%mod;
return anss;
}
struct query
{
ll op,x,y;
}q[maxn];
vector<ll> v;
int getid(ll x)
{
return lower_bound(all(v),x)-v.begin()+;
}
int main()
{
int n;
scanf("%d",&n);
{
for(int i=;i<n;i++)
{
scanf("%lld%lld%lld",&q[i].op,&q[i].x,&q[i].y);
v.pb(q[i].y);
}
sort(all(v));
v.erase(unique(all(v)),v.end());
int sizen=v.size();
for(int i=;i<n;i++)
{
if(q[i].op==)
{
update(getid(q[i].y),(q[i].y*q[i].x)%mod,q[i].x,,sizen,);
}
else
{
int valx=query2(q[i].x,,sizen,);
int valy=query2(q[i].y,,sizen,);
if(valx==valy)
{
ll ret = ((q[i].y-q[i].x+)%mod*v[valx-])%mod;
printf("%lld\n",ret);
}
else
{
ll numx=query1(,valx-,,sizen,);
ll numy=query1(,valy-,,sizen,);
ll ret=(query3(,valy-,,sizen,)-query3(,valx-,,sizen,)+mod)%mod;
ret=(ret-((q[i].x-numx-)%mod*v[valx-])%mod+mod)%mod;
ret=(ret+((q[i].y-numy)%mod)*v[valy-]%mod)%mod;
printf("%lld\n",ret);
}
}
}
}
}
zyb的面试
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 509 Accepted Submission(s): 199
有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?
例如n=15,k=7, 排列顺序为1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9;那么第7个数字就是15.
那么,如果你处在zyb的场景下,你能解决这个问题吗?
两个整数n和k(1<=n<=1e6,1<=k<=n),n和k代表的含义如上文
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n")
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl
#define ffread(a) fastIO::read(a)
using namespace std;
typedef long long ll;
const int maxn = 1e2+;
const int inf = 0x3f3f3f3f;
const int mod = ;
const double epx = 1e-;
const double pi = acos(-1.0);
//head-----------------------------------------------------------------
vector<int> ans; //已确定的数字
int getnum(int x,int y)
{
int res=,ji=,now=;
for(int i=ans.size()-;i>=;i--)
{
now+=ans[i]*ji;
ji*=;
}
for(int i=;i<=1e6;i*=) //位数
{
int temp=min((x++now)*i,y+);
if(temp>=(now+x)*i)
res+=temp-(now+x)*i;
if(temp==y+)
break;
}
return res;
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
ans.clear();
scanf("%d%d",&n,&m);
while(m!=)
{
int sum=;
for(int i=;i<;i++)
{
if(ans.size()==&&i==)
continue;
int temp=getnum(i,n);
if(sum+temp>=m)
{
m-=sum;
ans.pb(i);
m--;
break;
}
sum+=temp;
}
}
for(int i=;i<ans.size();i++)
cout<<ans[i];
cout<<endl;
}
}
HDU 6464 权值线段树 && HDU 6468 思维题的更多相关文章
- HDU 6464 /// 权值线段树
题目大意: 共Q次操作 操作有两种 操作一 在序列尾部加入f[i]个s[i] 操作二 查询序列第f[i]小到第s[i]小之间的总和 离线操作 把序列内的值离散化 然后利用离散化后的值 在线段树上对应权 ...
- 区间第k大问题 权值线段树 hdu 5249
先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...
- HDU 5249:KPI(权值线段树)
KPI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...
- HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others) M ...
- 2019年CCPC网络赛 HDU 6703 array【权值线段树】
题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...
- R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数
R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
- HDU - 5592 ZYB's Premutation (权值线段树)
题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...
- hdu 5592 ZYB's Premutation (权值线段树)
最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Mem ...
随机推荐
- Android自动化测试如何获取坐标点?
有以下三种方法: 1.打开开发者选项中的“显示指针位置”: 英文文版本为Settings->Developer option->Show touches(on)->Pointer l ...
- alex 推荐的书
这两本书不错, 追风筝的人<白鹿原>~~~反天不错~~~可以看下.14:27:22AndyZhang 2018-1-29 14:27:22 改变人的东西 读书.看电影.旅行.经历各种事 ...
- clr(Windows 运行时和公共语言运行时)
Windows 运行时 编译器使用 COM 引用计数机制来确定对象是否不再使用并可以删除. 因为从 Windows 运行时接口派生的对象实际上是 COM 对象,所以这是可行的. 在创建或复制对象时 ...
- 利用委托实现自己的数据缓存仓库(附上Demo)
Demo源码 写在前面的话 写完这篇博客后,总觉得少了些什么,后来想了下,感觉自己只是把结果给亮了出来,自己为什么想到这么做,这个类库出生的缘由未详述,因此,在本段作下说明,如有不足之处,希望能和大家 ...
- 转 关于oracle 分区表 表空间以及索引的总结
关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文 ...
- python学习-- 两种方式查看自己的Django版本
[第一种方式] Windows系统下 按住Windows按键 + R 进入搜索:搜索CMD进入控制台:输入Python进入Python解释器 Linux系统下 直接使用终端调用Python解释器 接下 ...
- python学习-- 默认urls中 Path converter
默认Path converter Django2.0自带的PathConveter包括: str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器. int:匹配0及 ...
- python 时间、日期、时间戳的转换
在实际开发中经常遇到时间格式的转换,例如: 前端传递的时间格式是字符串格式,我们需要将其转换为时间戳,或者前台传递的时间格式和我们数据库中的格式不对应,我们需要对其进行转换才能与数据库的时间进行匹配等 ...
- Baum-Welch算法(EM算法)对HMM模型的训练
Baum-Welch算法就是EM算法,所以首先给出EM算法的Q函数 \[\sum_zP(Z|Y,\theta')\log P(Y,Z|\theta)\] 换成HMM里面的记号便于理解 \[Q(\lam ...
- Django模板(filter过滤器{{ }}与tag标签{% %}应用)
模板里面过滤器与标签的应用 templates模板里面的应用参考(主要应用在这里面) <!DOCTYPE html> <html lang="en"> & ...