2014 Multi-University Training Contest 5
hdu4911
max(逆序数-k,0)
#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
#define LL long long
#define gcd(a,b) (b==0?a:gcd(b,a%b))
#define lcm(a,b) (a*b/gcd(a,b))
//O(n)求素数,1-n的欧拉数
#define N 100010
//A^x = A^(x % Phi(C) + Phi(C)) (mod C)
map<int,int>f;
struct node
{
int a;
int id;
}p[N];
int s[N<<],b[N];
void up(int w)
{
s[w] = s[w<<]+s[w<<|];
}
void build(int l,int r,int w)
{
if(l==r)
{
s[w] = ;
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
}
void update(int p,int d,int l,int r,int w)
{
if(l==r)
{
s[w] += d;
return ;
}
int m =(l+r)>>;
if(p<=m)
update(p,d,l,m,w<<);
else
update(p,d,m+,r,w<<|);
up(w); }
int query(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
return s[w];
int m = (l+r)>>;
int res = ;
if(a<=m) res+=query(a,b,l,m,w<<);
if(b>m) res+=query(a,b,m+,r,w<<|);
return res;
}
bool cmp(node a,node b)
{
return a.a<b.a;
}
int main()
{
int n,i,j,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
f.clear();
for(i = ; i<= n; i++)
{
scanf("%d",&p[i].a);
p[i].id = i;
b[i] = p[i].a;
}
sort(b+,b+n+);
f[b[]] = ;
int o = ;
for(i = ; i<= n; i++)
if(b[i]!=b[i-])
{
f[b[i]] = ++o;
}
build(,o,);
LL s = ;
for(i = ; i<= n ;i++)
{
//cout<<f[p[i].a]<<endl;
int kk = ;
if(f[p[i].a]<o)
kk = query(f[p[i].a]+,o,,o,);
update(f[p[i].a],,,o,);
s+=kk;
}
LL x = ;
s = max(x,s-k);
cout<<s<<endl;
}
return ;
}
HDU4913
几个数的LCM = 分解质因子之后每个质因子的最高次幂相乘之积 这里因为只有2、3 . lcm = 2^max*3^max
可以把b从小到大排序
x1 a1 b1
x2 a2 b2
x3 a3 b3
x4 a4 b4
假如现在集合里面没有数为空集,从上往下依次插入这些数,插入x1时 ,因为当前b1是最大的,它所构成的所有集合中3的最高次幂肯定选b1,
所以现在只需找到集合中的2的最高次幂分别有哪些,显然第一个只有 a1.而当插入第二个、第三个、第四个时,3的最高次幂分别为b2 b3 b4 ,a的选择会有多种,
对于如果选择了a1那么这样的集合将会有2^k个,k = 比a1小的数的个数,总的式子为 bi(2^k1*2^a1+2^k2*2^a2+2^k3*2^a3......) ( 所有的aj<ai)
这样可以开一个线段树维护前面有多少个比ai小的数,再开一个线段树维护后面的每一项的总值,例如1就为2^k1*2^a1
每插入一项,就把2^ki*2^ai放入第i个位置,求完当前和值后,将所有大于ai的值*2,依次扫描一遍就可得出结果。
#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
#define LL __int64
#define gcd(a,b) (b==0?a:gcd(b,a%b))
#define lcm(a,b) (a*b/gcd(a,b))
#define N 100005
#define mod 1000000007
struct node
{
int a,b;
int id;
} p[N];
LL lz[N<<],s[N<<];
LL sum[N<<];
int po[N];
LL mul(LL a,LL b,LL m)
{
LL d,t;
d=;
t=a;
while (b>)
{
if (b%==)
d=(d*t)%m;
b/=;
t=(t*t)%m;
}
return d;
}
bool cmp(node x,node y)
{
return x.a<y.a;
}
bool cmpp(node x,node y)
{
return x.b<y.b;
}
void up(int w)
{
s[w] = (s[w<<]+s[w<<|])%mod;
}
void build(int l,int r,int w)
{
lz[w] = ;
if(l==r)
{
s[w] = ;
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
}
void down(int w,int m)
{
if(lz[w]!=)
{
lz[w<<] = (lz[w<<]*lz[w])%mod;
lz[w<<|] = (lz[w<<|]*lz[w])%mod;
s[w<<] = (s[w<<]*lz[w])%mod;
s[w<<|] = (s[w<<|]*lz[w])%mod;
lz[w] = ;
}
}
void update(int p,LL d,int l,int r,int w)
{
if(l==r)
{
s[w] = d;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(p<=m)
update(p,d,l,m,w<<);
else
update(p,d,m+,r,w<<|);
up(w);
}
void update1(int a,int b,LL d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
s[w] = (s[w]*d)%mod;
lz[w] = (lz[w]*d)%mod;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m) update1(a,b,d,l,m,w<<);
if(b>m) update1(a,b,d,m+,r,w<<|);
up(w);
}
LL query(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r) return s[w];
int m = (l+r)>>;
LL res = ;
if(a<=m) res+=query(a,b,l,m,w<<);
if(b>m) res = (res+query(a,b,m+,r,w<<|))%mod;
return res;
}
void up1(int w)
{
sum[w] = sum[w<<]+sum[w<<|];
}
void build1(int l,int r,int w)
{
if(l==r)
{
sum[l] = ;
return ;
}
int m = (l+r)>>;
build1(l,m,w<<);
build1(m+,r,w<<|);
up1(w);
}
void update2(int p,int l,int r,int w)
{
if(l==r)
{
sum[w] = ;
return ;
}
int m = (l+r)>>;
if(p<=m)
update2(p,l,m,w<<);
else update2(p,m+,r,w<<|);
up1(w);
}
int query1(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
{
return sum[w];
}
int m = (l+r)>>;
int res=;
if(a<=m) res+=query1(a,b,l,m,w<<);
if(b>m) res+=query1(a,b,m+,r,w<<|);
return res;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(sum,,sizeof(sum));
for(i = ; i<= n; i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
p[i].id = i;
}
sort(p+,p+n+,cmp);
for(i = ; i <= n ; i++)
{
po[p[i].id] = i;
}
sort(p+,p+n+,cmpp);
build(,n,);
LL ans = ;
build1(,n,);
for(i = ; i <= n; i++)
{
int k = query1(,po[p[i].id],,n,);
//cout<<k<<" "<<p[i].a<<" "<<po[p[i].id]<<endl;
update2(po[p[i].id],,n,);
update(po[p[i].id],mul(,p[i].a+k,mod),,n,);
LL ss = query(po[p[i].id],n,,n,);
// cout<<ss<<endl;
ans=(ans+(mul(,p[i].b,mod)*ss)%mod)%mod;
if(po[p[i].id]<n)
update1(po[p[i].id]+,n,,,n,);
}
printf("%I64d\n",ans);
}
return ;
}
#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
#define LL __int64
#define gcd(a,b) (b==0?a:gcd(b,a%b))
#define lcm(a,b) (a*b/gcd(a,b))
#define N 100005
#define mod 1000000007
struct node
{
int a,b;
int id;
} p[N];
LL lz[N<<],s[N<<];
LL sum[N<<];
int po[N];
LL mul(LL a,LL b,LL m)
{
LL d,t;
d=;
t=a;
while (b>)
{
if (b%==)
d=(d*t)%m;
b/=;
t=(t*t)%m;
}
return d;
}
bool cmp(node x,node y)
{
return x.a<y.a;
}
bool cmpp(node x,node y)
{
return x.b<y.b;
}
void up(int w)
{
s[w] = (s[w<<]+s[w<<|])%mod;
}
void build(int l,int r,int w)
{
lz[w] = ;
if(l==r)
{
s[w] = ;
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
up(w);
}
void down(int w,int m)
{
if(lz[w]!=)
{
lz[w<<] = (lz[w<<]*lz[w])%mod;
lz[w<<|] = (lz[w<<|]*lz[w])%mod;
s[w<<] = (s[w<<]*lz[w])%mod;
s[w<<|] = (s[w<<|]*lz[w])%mod;
lz[w] = ;
}
}
void update(int p,LL d,int l,int r,int w)
{
if(l==r)
{
s[w] = d;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(p<=m)
update(p,d,l,m,w<<);
else
update(p,d,m+,r,w<<|);
up(w);
}
void update1(int a,int b,LL d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
s[w] = (s[w]*d)%mod;
lz[w] = (lz[w]*d)%mod;
return ;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m) update1(a,b,d,l,m,w<<);
if(b>m) update1(a,b,d,m+,r,w<<|);
up(w);
}
LL query(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r) return s[w];
int m = (l+r)>>;
LL res = ;
if(a<=m) res+=query(a,b,l,m,w<<);
if(b>m) res = (res+query(a,b,m+,r,w<<|))%mod;
return res;
}
void up1(int w)
{
sum[w] = sum[w<<]+sum[w<<|];
}
void build1(int l,int r,int w)
{
if(l==r)
{
sum[l] = ;
return ;
}
int m = (l+r)>>;
build1(l,m,w<<);
build1(m+,r,w<<|);
up1(w);
}
void update2(int p,int l,int r,int w)
{
if(l==r)
{
sum[w] = ;
return ;
}
int m = (l+r)>>;
if(p<=m)
update2(p,l,m,w<<);
else update2(p,m+,r,w<<|);
up1(w);
}
int query1(int a,int b,int l,int r,int w)
{
if(a<=l&&b>=r)
{
return sum[w];
}
int m = (l+r)>>;
int res=;
if(a<=m) res+=query1(a,b,l,m,w<<);
if(b>m) res+=query1(a,b,m+,r,w<<|);
return res;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(sum,,sizeof(sum));
for(i = ; i<= n; i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
p[i].id = i;
}
sort(p+,p+n+,cmp);
for(i = ; i <= n ; i++)
{
po[p[i].id] = i;
}
sort(p+,p+n+,cmpp);
build(,n,);
LL ans = ;
build1(,n,);
for(i = ; i <= n; i++)
{
int k = query1(,po[p[i].id],,n,);
//cout<<k<<" "<<p[i].a<<" "<<po[p[i].id]<<endl;
update2(po[p[i].id],,n,);
update(po[p[i].id],mul(,p[i].a+k,mod),,n,);
LL ss = query(po[p[i].id],n,,n,);
// cout<<ss<<endl;
ans=(ans+(mul(,p[i].b,mod)*ss)%mod)%mod;
if(po[p[i].id]<n)
update1(po[p[i].id]+,n,,,n,);
}
printf("%I64d\n",ans);
}
return ;
}
2014 Multi-University Training Contest 5的更多相关文章
- HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2014 Multi-University Training Contest 9#11
2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others) ...
- 2014 Multi-University Training Contest 9#6
2014 Multi-University Training Contest 9#6 Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Oth ...
- 2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/法)
解题报告 两人轮流取球,大的人赢,,, 贴官方题解,,,反正我看不懂.,,先留着理解 关于费马小定理 关于原根 找规律找到的,,,sad,,, 非常easy找到循环节为p-1,每个循环节中有一个非零的 ...
- 2014 Multi-University Training Contest 1/HDU4864_Task(贪心)
解题报告 题意,有n个机器.m个任务. 每一个机器至多能完毕一个任务.对于每一个机器,有一个最大执行时间Ti和等级Li,对于每一个任务,也有一个执行时间Tj和等级Lj.仅仅有当Ti>=Tj且Li ...
- hdu 4937 2014 Multi-University Training Contest 7 1003
Lucky Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) T ...
- hdu 4941 2014 Multi-University Training Contest 7 1007
Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- hdu 4939 2014 Multi-University Training Contest 7 1005
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...
随机推荐
- 【PHP设计模式 02_JieKou.php】面向接口开发
<?php /** * [面向接口开发] * */ header("Content-type: text/html; charset=utf-8"); /*共同接口--连接数 ...
- Json常见问题
1.创建包含 JSON 语法的 JavaScript 字符串: var txt = '{ "employees" : [' + '{ "firstName":& ...
- poj2269 Friends
计算表达式. 只有3种运算符:*,+,- , *优先级高于后两者,后两者优先级相同. 有两种符号:{},(). 利用递归和堆栈即可解决. 首先遇到左括号开始入栈直到遇到右括号,遇到右括号时对括号内的数 ...
- 使用NPOI随意创建Excel(含下拉列表)
//创建工作簿 HSSFWorkbook ssfworkbook = new HSSFWorkbook(); //创建工作表(页) HSSFSheet sheet1 = ssfworkbook.Cre ...
- 【linux命令与工具】lsmod命令
lsmod命令用来显示已被内核加载的模块的状态 描述: lsmod命令可以美观地显示/prco/module中的内容,这些内容是被已被内核加载模块的信息. 使用lsmod之后,系统会显示出目前已经存在 ...
- HDU(1856),裸的带权并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:朋友圈问题,A和B是朋友,B和C是朋友则A和C也是朋友,依次类推,题目的意思就是求最大的朋 ...
- lua注释
1. 单行注释 -- 功能等同于C++中的// 2. 多行注释 --[[ 注释的内容 ]] 功能等同于C++中的 /**/ 3. 多行注释 --[====[ 注释和内容 ]=== ...
- #ifdef DEBUG的理解
今天看到一段代码,对ifdef的概念比较模糊,于是去学习了一下,找到一个很好的解释,如下: 在工程设置里有一些设置会对该工程自动产生一系列的宏,用以控制程序的编译和运行.就好象楼上说的一样,如果你把代 ...
- Jquery 内容简介
内容简介 内容简介 • 什么是Jquery • 万能的选择器 • 管理jQuery包装集 • 使用jQuery操作元素的属性与样式 • 事件与事件对象 • jQuery中的Ajax • jQuery ...
- 2016年10月16日 星期日 --出埃及记 Exodus 18:27
2016年10月16日 星期日 --出埃及记 Exodus 18:27 Then Moses sent his father-in-law on his way, and Jethro returne ...