Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)
B .Counting Inversion
题意:给定L,R,求这个区间的逆序对数之和。(L,R<1e15)
思路:一看这个范围就知道是数位DP。 只是维护的东西稍微多一点,需要记录后面的各种数字的个数cnt,以及逆序对和sum,以及出现了多少种后缀num。
那么枚举到当前位时,假设为i ,那么sum+=cnt[i+1]+cnt[i+2]+....cnt[9]; cnt[i]+=num; 可以参考CF1073E。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
struct in{
ll num,cnt[],sum;
in(){num=sum=; memset(cnt,,sizeof(cnt)); }
}dp[];
int q[],tot,vis[];
in dfs(int pos,int st,int lim)
{
if(!lim&&vis[pos]) return dp[pos];
if(pos==) {
in res; res.num=;
return res;
}
int up=; in res,tmp; if(lim) up=q[pos-];
rep(i,,up){
tmp=dfs(pos-,i,lim&&i==up);
res.sum+=tmp.sum;
rep(j,i+,) res.sum+=tmp.cnt[j];
rep(j,,) res.cnt[j]+=tmp.cnt[j];
res.cnt[i]+=tmp.num;
res.num+=tmp.num;
}
vis[pos]=;
return dp[pos]=res;
}
ll cal(ll x)
{
if(x<) return ;
tot=; ll ans=;
while(x) q[++tot]=x%,x/=;
memset(dp,,sizeof(dp));
memset(vis,,sizeof(vis));
rep(i,,tot){
ll up=; if(i==tot) up=q[tot];
rep(j,,up){
in tmp=dfs(i,j,(i==tot)&&(j==q[tot]));
ans+=tmp.sum;
rep(k,j+,) ans+=1LL*tmp.cnt[k];
}
}
return ans;
}
int main()
{
ll L,R; int T,Ca=; scanf("%d",&T);
while(T--){
scanf("%lld%lld",&L,&R);
printf("Case %d: %lld\n",++Ca,cal(R)-cal(L-));
}
return ;
}
C .Divisors of the Divisors of An Integer
题意:给出N,问N!的因子的因子个数和。
思路:唯一分解,对于一个素数p,假设它的幂次是x,那么因子的幂次有0,1,2,...x;那么因子的因子幂次就是(0); (0,1); ( 0,1,2); ... ; (0,1,2,...x)
所以就是一个累乘,对于每个素数p,ans*=(x+1)*(x+2)/2; 而阶乘的唯一分解只需要一直除即可。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=1e7+;
int a[maxn],N,p[maxn],vis[maxn],cnt;ll ans=;
int solve(int p)
{
int tN=N,res=;
while(tN) {
res+=tN/p;
if(res>Mod) res-=Mod;
tN/=p;
} return res;
}
int get(int p)
{
if(p&) return 1LL*(p+)/*p%Mod;
return 1LL*p/*(p+)%Mod;
}
int main()
{
rep(i,,){
if(!vis[i]) p[++cnt]=i;
for(int j=;j<=cnt&&p[j]*i<=;j++){
vis[p[j]*i]=;
if(i%p[j]==) break;
}
}
while(~scanf("%d",&N)&N){
ans=;
rep(i,,N) {
if(!vis[i]) a[i]=solve(i);
}
rep(i,,N){
if(a[i])
ans=(ll)ans*get(a[i]+)%Mod;
}
printf("%lld\n",ans);
}
return ;
}
E.Helping the HR
题意:给定每个人的签到和离开时间,问每个人的..情况
思路:模拟; by许。
#include<bits/stdc++.h>
using namespace std;
char str[];
int main()
{
int n,s=*,D=*,E=*;
while(~scanf("%d",&n)&&n)
{
int cnt=;
for(int cas=;cas<n;cas++)
{
int S=,T=,tot=,pre=,p=;
scanf("%s",str);
int len=strlen(str);
for(int i=;i<len;i++)
{
if(str[i]!=':'&&i!=len-)pre=pre*+str[i]-'';
else
{
if(i==len-)pre=pre*+str[i]-'';
tot++;
if(tot<=)
{
S+=pre*p;
if(tot==)p=;
else p/=;
}
else T+=pre*p,p/=;
pre=;
}
}
int flag=;
if(str[]=='D'&&S>D)flag=;
if(str[]=='E'&&S>E)flag=;
int res=T-max(s,S);
if(str[]=='D'&&res<*)flag=;
if(str[]=='E'&&res<*)flag=;
cnt+=flag;
}
if(!cnt)puts("All OK");
else if(cnt<=)printf("%d Point(s) Deducted\n",cnt);
else puts("Issue Show Cause Letter");
}
}
F .Path Intersection
题意:给定一棵树, Q次询问,每次给定K条路经,求这K条路有多少个公共点.
思路:路剖, 即每条路经+1, 然后可以选一条路径看有多少个点被覆盖K次。
好久没写树剖了,开始写错的地方提醒下自己: 当top不同的时候,我们先操作dep[top[]]大的,然后把它变为fa[top[]];
而top相同的,正常的从小到大即可。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn],To[maxn],cnt,dep[maxn];
int sz[maxn],son[maxn],top[maxn],pos[maxn],N;
int Mx[maxn],num[maxn],Lazy[maxn],fa[maxn],tot;
void add(int u,int v){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;
}
void dfs1(int u,int f)
{
sz[u]=; fa[u]=f;
dep[u]=dep[f]+; son[u]=;
for(int i=Laxt[u];i;i=Next[i]){
if(To[i]!=f){
dfs1(To[i],u);
if(sz[To[i]]>sz[son[u]]) son[u]=To[i];
}
}
}
void dfs2(int u,int Top)
{
pos[u]=++tot; top[u]=Top;
if(son[u]) dfs2(son[u],Top);
for(int i=Laxt[u];i;i=Next[i]){
if(To[i]!=fa[u]&&To[i]!=son[u])
dfs2(To[i],To[i]);
}
}
void build(int Now,int L,int R)
{
Mx[Now]=Lazy[Now]=; num[Now]=R-L+;
if(L==R) return; int Mid=(L+R)>>;
build(Now<<,L,Mid); build(Now<<|,Mid+,R);
}
void pushdown(int Now)
{
if(Lazy[Now]) {
Mx[Now<<]+=Lazy[Now];Lazy[Now<<]+=Lazy[Now];
Mx[Now<<|]+=Lazy[Now];Lazy[Now<<|]+=Lazy[Now];
Lazy[Now]=;
}
}
void pushup(int Now)
{
Mx[Now]=Mx[Now<<]; num[Now]=num[Now<<];
if(Mx[Now<<|]>Mx[Now])
Mx[Now]=Mx[Now<<|],num[Now]=num[Now<<|];
else if(Mx[Now<<|]==Mx[Now])
num[Now]+=num[Now<<|];
}
void update(int Now,int L,int R,int l,int r,int val)
{
if(l<=L&&r>=R){
Mx[Now]+=val; Lazy[Now]+=val; return ;
}
pushdown(Now); int Mid=(L+R)>>;
if(l<=Mid) update(Now<<,L,Mid,l,r,val);
if(r>Mid) update(Now<<|,Mid+,R,l,r,val);
pushup(Now);
}
int query(int Now,int L,int R,int l,int r,int K)
{
if(Mx[Now]<K) return ;
if(l<=L&&r>=R) return Mx[Now]==K?num[Now]:;
pushdown(Now); int Mid=(L+R)>>,res=;
if(l<=Mid) res+=query(Now<<,L,Mid,l,r,K);
if(r>Mid) res+=query(Now<<|,Mid+,R,l,r,K);
pushup(Now); return res;
}
void pathup(int u,int v,int val)
{
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
update(,,N,pos[top[u]],pos[u],val);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
update(,,N,pos[u],pos[v],val);
}
int pathquery(int u,int v,int K)
{
int res=;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
res+=query(,,N,pos[top[u]],pos[u],K);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
res+=query(,,N,pos[u],pos[v],K);
return res;
}
int a[maxn],b[maxn];
int main()
{
int T,Q,K,C=,u,v;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
rep(i,,N) Laxt[i]=; cnt=; tot=;
rep(i,,N-){
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
dfs1(,); dfs2(,);
build(,,N);
scanf("%d",&Q);
printf("Case %d:\n",++C);
while(Q--){
scanf("%d",&K);
rep(i,,K) scanf("%d%d",&a[i],&b[i]);
rep(i,,K) pathup(a[i],b[i],);
printf("%d\n",pathquery(a[],b[],K));
rep(i,,K) pathup(a[i],b[i],-);
}
}
return ;
}
I .Triangles
题意:给定两个三维空间里的三角形,求最近距离。
思路:好像是不错的题,想补。
J. VAT Man
签到。 by许。
#include<bits/stdc++.h>
#define db double
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
db x;
cin>>x;
printf("%.2lf\n",x*1.15);
}
}
Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)的更多相关文章
- Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)
A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...
- Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)
C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...
- 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest
目录 Contest Info Solutions B. Counting Inversion C. Divisors of the Divisors of An Integer E. Helping ...
- 2018-2019 ACM-ICPC, Asia Dhaka Regional Contest C.Divisors of the Divisors of An Integer (数论)
题意:求\(n!\)的每个因子的因子数. 题解:我们可以对\(n!\)进行质因数分解,这里可以直接用推论快速求出:https://5ab-juruo.blog.luogu.org/solution-p ...
- Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)
学习了“叙利亚”这个单词:比较温和的一场:几何的板子eps太小了,坑了几发. A .Hello SCPC 2018! 题意:给定一个排列,问它是否满足,前面4个是有序的,而且前面4个比后面的都小. 思 ...
- Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)
这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...
- zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
- 2018 ACM-ICPC Asia Beijing Regional Contest (部分题解)
摘要 本文主要给出了2018 ACM-ICPC Asia Beijing Regional Contest的部分题解,意即熟悉区域赛题型,保持比赛感觉. Jin Yong’s Wukong Ranki ...
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(部分题解)
摘要 本文主要给出了2014-2015 ACM-ICPC, Asia Xian Regional Contest的部分题解,说明了每题的题意.解题思路和代码实现,意即熟悉区域赛比赛题型. Built ...
随机推荐
- SpringBoot启动器
pom.xml文件1.父项目 <parent> <groupId>org.springframework.boot</groupId> <artifactId ...
- JSP开发Web应用系统
1.动态网站开发基础 1-1:动态网页 a.为什么需要动态网页(当我们需要修改网页内容的时候,都要重新上传一次覆盖原来的页面.而且,制作必须要通过专用的网页制作工具,比如:Dreamweaver.Fr ...
- 2-MAVEN 基本命令
MVN的基本命令 mvn package:打包 >生成了target目录 >编译了代码 >使用junit测试并生成报告 >生成代码的jar文件 >运行jar包: java ...
- MAVEN 创建项目
使用archetype生成项目骨架 MAVEN 创建项目JAR 和 MAVEN创建项目WAR中是使用特定的acrchetype来进行创建项目,如果使用其他的archetype来创建项目或是使用 mvn ...
- learning scala output to console
控制台输出语句: print println example: scala> print("i=");print(i)i=345scala> println(" ...
- JS 浮点型计算的精度问题 推荐的js 库 推荐的类库 Numeral.js 和 accounting.js
推荐的类库 Numeral.js 和 accounting.js 文章来自 http://www.css88.com/archives/7324#more-7324
- 计算机基础及发展 part2
一.为什么有操作系统? 一台电脑的基本设备是硬件,诸如:CPU.I/O设备.主存.显示器.打印机等等. 如果软件编程者需要参考如此多的硬件参数来进行编程的话,基本上就不可能再书写代码了. 那么为了有效 ...
- POJ 1840 Eqs 解方程式, 水题 难度:0
题目 http://poj.org/problem?id=1840 题意 给 与数组a[5],其中-50<=a[i]<=50,0<=i<5,求有多少组不同的x[5],使得a[0 ...
- sqlserver指定排序字段
在sqlserver中可以指定排序的字段,需要将哪个字段值排在最前面或最后面,都是可以的.见如下代码: SELECT * FROM public_comment order by case [User ...
- 【转载】JVM系列三:JVM参数设置、分析
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...