免费送气球

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 566    Accepted Submission(s): 129

Problem Description
又到了GDUT一年一度的程序设计竞赛校赛的时间啦。同学们只要参加校赛,并且每解出一道题目就可以免费获得由ACM协会和集训队送出的气球一个。听到这个消息,JMC也想参加免费拿气球。可是,由于JMC太菜了而被禁止参赛,于是他找到你想让你帮忙参加比赛,可以通过执行下面的C++程序解决问题后获得气球并送给他。JMC保证了下面的程序一定能获得正确的结果。

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取模后输出。

 
Input
单组数据
第一行一个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均不大于目前已添加进序列的数的数量。
 
Output
对于每次操作二,将结果对1000000007取模后输出。
 
Sample Input
6
1 5 1
1 6 3
2 2 5
2 4 8
1 2 2
2 4 8
 
Sample Output
4
11
9
 
题意: 中文题。
解析:离散化之后,建立权值线段树。维护一个ans数组用于区间权值求和,维护一个sum数组用于区间个数求和 和 查询出第first大和second大离散化之后得下标x,y
 
answer = queryans(1,y-1) - queryans(1,x-1) + (second-querysum(1,y-1))*v[ y-1 ] - (first-querysum(1,x-1))*v[ x-1 ]
 
AC代码
#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

Problem Description
今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:
有一个序列,是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的场景下,你能解决这个问题吗?
 
Input
T组样例(T<=100)
两个整数n和k(1<=n<=1e6,1<=k<=n),n和k代表的含义如上文
 
Output
输出1-n之中字典序第k小的数字
 
Sample Input
1
15 7
 
Sample Output
15
 
题意:序列1-n 字典序排序之后 第k个数是多少。
解析:肯定不能字符串排序,铁超时。。。容易想到先计算出 1-9开头的数分别有多少 判断k在哪个区间 从而确定了第一位数 在确定的数字基础上在进行同样的操作 0-9...
所以 写一个函数进行计算 直到k=0。
 
AC代码
#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 思维题的更多相关文章

  1. HDU 6464 /// 权值线段树

    题目大意: 共Q次操作 操作有两种 操作一 在序列尾部加入f[i]个s[i] 操作二 查询序列第f[i]小到第s[i]小之间的总和 离线操作 把序列内的值离散化 然后利用离散化后的值 在线段树上对应权 ...

  2. 区间第k大问题 权值线段树 hdu 5249

    先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...

  3. HDU 5249:KPI(权值线段树)

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  4. HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others)    M ...

  5. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  6. R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数

    R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...

  7. HDU - 2665 Kth number 主席树/可持久化权值线段树

    题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...

  8. HDU - 5592 ZYB's Premutation (权值线段树)

    题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...

  9. hdu 5592 ZYB's Premutation (权值线段树)

    最近在线段树的世界里遨游,什么都能用线段树做,这不又一道权值线段树了么. ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Mem ...

随机推荐

  1. 爬虫制作入门学习笔记2:[转]python爬虫实例项目大全

    WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...

  2. leetcode-24-exercise

    506. Relative Ranks 解题思路: 使用priority_queue.它在插入时会将数据按照由大到小的顺序插入,自然排序了.所以插入时考虑插入pair<nums[i],i> ...

  3. Cheese Aizu - 0558 (搜索题)

    Time limit8000 ms Memory limit131072 kB チーズ () 問題 今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から顔を出した.JOI 町は東西南北に ...

  4. phpmyadmin提示The mbstring extension is missing的解决方法

    解决办法:安装php-mbstring yum install php-mbstring

  5. jmeter switch controller

    工作方式: Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器.有两种赋值方式: 1.第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪 ...

  6. PHP-redis命令之 列表(lists)

    三.列表(lists) 1.lpush:将所有指定的值插入到存于 key 的列表的头部.如果 key 不存在,那么在进行 push 操作前会创建一个空列表. 如果 key 对应的值不是一个 list ...

  7. Java中的数据类型和引用

    JAVA数据类型分primitive数据类型和引用数据类型. Java中的primitive数据类型分为四类八种.primitive也不知道怎么翻译比较贴切, 暂且叫他基本数据类型吧, 其实直接从英文 ...

  8. mysql查询的语法

    单表查询语法 SELECT DISTINCT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条 ...

  9. ie9/8的iframe中jQuery报错

    此文章用于对工作中遇到的问题进行记录 jQuery 版本:1.9.1 按照一般的思路,jquery 1.x的是支持ie9及以下的,但是今天发现jquery报错了,代码错误位置在源码版本的第4888行 ...

  10. dubbo与zk注册中心如何对接,如何做到服务自动发现

    先看下consumer端发起调用时的链路流程: +---------------------------+ +---------------------------+ +--------------- ...