这套题有毒,T1标程挂了,T2题面完全莫名其妙,T3没有告诉取模害我打了好久高精。。。

A题.

统计每个数后面比它小的数的个数记作f把,操作一个数就是把它后面所有比它小的数和它的f清0,然后若是它到它后面最后一个比它小的数之间有等于它的数,就把这个数的f-1

记录一下已经清0的不用再清。应该是可以直接线段树做的,但是我比较蠢就线段树套了个set,结果被wys大佬造的数据卡T了,似乎把set改成treap合并权值相同的点可以过这个数据?

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e5+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,sz,a[N],b[N],f[N],no[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define lc x<<1
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
int sg[N<<];
void update(int x,int l,int r,int pos,int v) {
if(l==r) { sg[x]=v; return; }
if(pos<=mid) update(lc,l,mid,pos,v);
else update(rc,mid+,r,pos,v);
sg[x]=min(sg[lc],sg[rc]);
} int qry(int x,int l,int r,int ql,int qr,int v) {
if(sg[x]>=v) return n+;
if(l>=ql&&r<=qr) {
if(l==r) return l;
if(sg[rc]<v) return qry(rc,mid+,r,ql,qr,v);
else return qry(lc,l,mid,ql,qr,v);
}
int rs=n+;
if(qr>mid) rs=qry(rc,mid+,r,ql,qr,v);
if(rs==n+&&ql<=mid) rs=qry(lc,l,mid,ql,qr,v);
return rs;
} struct node {
int pos,a;
node(int pos,int a):pos(pos),a(a){}
friend bool operator <(const node&A,const node&B) {
return A.a<B.a||(A.a==B.a&&A.pos<B.pos);
}
}; set<node>s[N<<],tps;
void build(int x,int l,int r) {
For(i,l,r)
s[x].insert(node(i,a[i]));
if(l==r) return ;
build(lc,l,mid); build(rc,mid+,r);
} LL qry(int x,int l,int r,int ql,int qr,int v,int rr) {
LL rs=;
if(l>=ql&&r<=qr) {
while(s[x].size()>) {
node tp=*s[x].begin();
if(tp.a>v) break;
if(tp.a==v&&tp.pos!=ql) {
if(tp.pos<rr) {
if(f[tp.pos]) {
f[tp.pos]--;
rs++;
if(f[tp.pos]) tps.insert(tp);
}
}
else break;
}
else {
rs+=f[tp.pos];
f[tp.pos]=;
no[tp.pos]=; }
s[x].erase(tp);
}
while(tps.size()>) {
node tp=*tps.begin();
tps.erase(tp);
s[x].insert(tp);
}
return rs;
}
if(qr<=mid) return qry(lc,l,mid,ql,qr,v,rr);
if(ql>mid) return qry(rc,mid+,r,ql,qr,v,rr);
return qry(lc,l,mid,ql,qr,v,rr)+qry(rc,mid+,r,ql,qr,v,rr);
} int sum[N];
void add(int x,int v) {
for(int i=x;i<=sz;i+=(i&(-i)))
sum[i]+=v;
} int qry(int x) {
int rs=;
for(int i=x;i;i-=(i&(-i)))
rs+=sum[i];
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) read(a[i]),b[i]=a[i];
sort(b+,b+n+);
sz=unique(b+,b+n+)-(b+);
For(i,,n) {
a[i]=lower_bound(b+,b+sz+,a[i])-b;
update(,,n,i,a[i]);
}
LL ans=;
Rep(i,n,) {
f[i]=qry(a[i]-);
ans+=f[i];
add(a[i],);
}
printf("%lld\n",ans);
build(,,n);
For(i,,m) {
int pos,rr;
read(pos);
rr=qry(,,n,pos,n,a[pos]);
if(rr==n+) rr=pos;
if(!no[pos]) {
LL tt=qry(,,n,pos,n,a[pos],rr);
ans-=tt;
}
printf("%lld\n",ans);
}
Formylove;
}

B题

题目应该是9个棋子放9个格子。

floyd跑第i个点经过k条边到第j个点的方案数,矩阵优化。统计答案的时候9!枚举每个棋子到哪个格子即可。

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int p=1e9+;
typedef long long LL;
typedef double db;
using namespace std;
int tx[]={,,,-},ty[]={-,,,};
LL n,ans; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct jz {
LL a[][];
friend jz operator *(const jz&A,const jz&B) {
jz rs;
For(i,,) For(j,,) {
rs.a[i][j]=;
For(k,,)
(rs.a[i][j]+=A.a[i][k]*B.a[k][j]%p)%=p;
}
return rs;
}
}bs,rs; void ksm(LL b) {
while(b) {
if(b&) rs=rs*bs;
bs=bs*bs;
b>>=;
}
} int vis[];
void dfs(int pos,LL now) {
if(!now) return;
if(pos==) {
ans=(ans+now)%p;
return ;
}
For(i,,) if(!vis[i]) {
vis[i]=;
dfs(pos+,now*rs.a[pos][i]%p);
vis[i]=;
}
} int get(int x,int y) { return (x-)*+y-;} #define ANS
int main() {
#ifdef ANS
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
#endif
For(i,,) For(j,,) {
rs.a[i][j]=bs.a[i][j]=;
if(i==j) rs.a[i][j]=;
}
For(i,,) bs.a[i][i]=;
For(x,,) For(y,,) {
For(t,,) if(x+tx[t]>=&&x+tx[t]<=&&y+ty[t]>=&&y+ty[t]<=) {
bs.a[get(x,y)][get(x+tx[t],y+ty[t])]=;
}
}
read(n);
ksm(n);
dfs(,);
printf("%lld\n",ans);
Formylove;
}

C题

60分可以莫比乌斯反演,场上以为要写高精于是这是一个莫比乌斯加高精的30分代码。。

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e6+;
typedef long long LL;
typedef double db;
const LL base=1e9;
using namespace std;
LL n,k; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct GJ {
LL a[];
int len;
friend GJ operator +(const GJ&A,const GJ&B) {
GJ C;
C.len=max(A.len,B.len);
LL tp=;
For(i,,C.len) {
C.a[i]=(i>A.len?:A.a[i])+(i>B.len?:B.a[i])+tp;
tp=C.a[i]/base;
if(C.a[i]>=base) C.a[i]=C.a[i]%base;
}
while(tp!=) {
C.a[++C.len]=(tp>=base?tp%base:tp);
tp/=base;
}
return C;
}
friend GJ operator -(const GJ&A,const GJ&B) {
GJ C;
C.len=A.len;
LL tp=;
For(i,,C.len) {
C.a[i]=A.a[i]-(i>B.len?:B.a[i])-tp;
if(C.a[i]<) {
C.a[i]+=base;
tp=;
}
else tp=;
}
while(C.len&&C.a[C.len]==) {
C.len--;
}
return C;
}
friend GJ operator *(const GJ&A,const GJ&B) {
GJ C;
C.len=A.len+B.len+;
For(i,,C.len) C.a[i]=;
For(i,,A.len) For(j,,B.len) {
C.a[i+j]+=A.a[i]*B.a[j];
if(C.a[i+j]>=base) {
C.a[i+j+]+=C.a[i+j]/base;
C.a[i+j]%=base;
}
}
while(C.len&&C.a[C.len]==) {
C.len--;
}
return C;
}
}; void print(GJ x) {
Rep(i,x.len,) {
if(i!=x.len) printf("%.9lld",x.a[i]);
else printf("%lld",x.a[i]);
}
} void put_it(GJ &A,LL x) {
if(x==) {
A.len=,A.a[]=;
}
else {
A.len=-;
LL tp=x;
while(tp) {
A.a[++A.len]=tp%base;
tp/=base;
}
}
} GJ ksm(LL a,LL b) {
GJ rs,bs;
rs.len=;
rs.a[]=;
put_it(bs,a);
while(b) {
if(b&) rs=rs*bs;
bs=bs*bs;
b>>=;
}
return rs;
} LL gcd(LL a,LL b) { return !b?a:gcd(b,a%b); } int mu[N],bo[N],p[N];
void get_prime() {
mu[]=;
For(i,,n) {
if(!bo[i]) {
p[++p[]]=i; mu[i]=-;
}
for(int j=;j<=p[]&&p[j]*i<=n;j++) {
bo[p[j]*i]=;
if(i%p[j]==) {
mu[p[j]*i]=;
break;
}
mu[p[j]*i]=-mu[i];
}
}
} #define ANS
int main() {
#ifdef ANS
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
read(n); read(k);
GJ ans;
ans.len=;
ans.a[]=;
get_prime();
For(d,,n) {
GJ D=ksm(d,k),tp;
tp.len=; tp.a[]=;
For(i,,n/d) if(mu[i]==){
int x=i*d;
GJ tt;
put_it(tt,(LL)(n/x)*(n/x));
tp=tp+tt;
}
For(i,,n/d) if(mu[i]==-) {
int x=i*d;
GJ tt;
put_it(tt,(LL)(n/x)*(n/x));
tp=tp-tt;
}
ans=ans+D*tp;
}
print(ans);
Formylove;
}
/*
1000 5 1000000 5
*/

正解是随便化一下化成杜教筛的样子,然后杜教筛。先坑着,哪天没事做可能会打吧,,

暑假集训test-8-30的更多相关文章

  1. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  2. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  3. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  4. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  5. 2013ACM暑假集训总结-致将走上大三征途的我

    回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...

  6. [补档]暑假集训D6总结

    考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...

  7. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/   ...

  8. [补档]暑假集训D1总结

    归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...

  9. 2016HUAS_ACM暑假集训3F - Jungle Roads

    这个题目属于最小生成树问题,可以用Prim,也可以用Kruskal(还没试).题意简单直接,给你一个图,求出它最小生成树的权值. 题目最有趣的地方就是图的顶点是字母,稍微处理一下就好了. Sample ...

  10. 2016HUAS暑假集训训练2 D - 敌兵布阵

    Description Lily 特别喜欢养花,但是由于她的花特别多,所以照料这些花就变得不太容易.她把她的花依次排成一行,每盆花都有一个美观值.如果Lily把某盆花照料的好的话,这盆花的美观值就会上 ...

随机推荐

  1. 项目实战 - 混合式App开发

    为何要使用混合式开发? 要说为什么使用Hybrid App [混合式开发],就要先了解什么是Native App[原生程序], Web App[网站程序]. Native App 是专门针对某一类移动 ...

  2. linux php5.6 安装

    如果之前有安装其他版本PHP,请先卸载干净   配置yum源 追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fe ...

  3. Spring 整合 Redis(转)

    转自http://blog.csdn.net/java2000_wl/article/details/8543203 pom构建: <modelVersion>4.0.0</mode ...

  4. Github pages博客搭建与域名绑定

    Github Page github page是由用户编写的托管在github上的静态网页,为了搭建一个个人博客,我们可以租用一个云服务器然后部署我们的博客项目,常见的比如wordpress,像wp这 ...

  5. SQL 删除

    SQL Delete 语句(删除表中的记录) DELETE语句用于删除表中现有记录. SQL DELETE 语句 DELETE 语句用于删除表中的行. SQL DELETE 语法 DELETE FRO ...

  6. INNODB存储引擎之缓冲池

    以下的资料总结自:官方文档和<MySQL技术内幕-INNODB存储引擎>一书. 对INNODB存储引擎缓冲池的那一段描述来自博文:http://www.ywnds.com/?p=9886说 ...

  7. Android中让View匀速旋转

    项目需求,需要一个实现一个单帧的旋转动画,来提示当前进度,类似与圆圈型的progressbar. 首先定义anim文件: [html] view plaincopyprint? 1.     < ...

  8. 区间dp(二维)——cf1199F

    复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ...

  9. [bzoj1706]奶牛接力跑 题解 (矩阵快速幂(或者叫倍增Floyd?))

    Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T < ...

  10. TeleportPoint可瞬移的目标位置

    TeleportPoint.png 最外部的组件: Animation: 包含了该装置的几个动画Teleport Point: 点传送的脚本 teleport_marker_mesh: 外部的圆柱形光 ...