这套题有毒,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. Spring boot ----RestTemplate学习笔记

    ****spring boot-----restTemplate 封装了HttpURLConnection,HttpClient,Netty等接口访问实现库 restTemplet包含以下部分 Htt ...

  2. VS2017编译64位CloudCompare

    需求:编译一个支持读写las点云的CC,然后再开发CC插件实现业务功能. 编译环境: 1.Windows 10 2.Visual Studio 2017 Community 3.Qt 5.9.4 开源 ...

  3. python网络爬虫学习

    网络爬虫 Requests官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html Beautiful So ...

  4. JVM内存分为哪几部分?各个部分的作用是什么?

    JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器. 堆. 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xm ...

  5. docker镜像下载加速(5)

    镜像下载加速 由于 Docker Hub 的服务器在国外,下载镜像会比较慢.幸好 DaoCloud 为我们提供了免费的国内镜像服务. 下面介绍如果使用镜像. 在 daocloud.io 免费注册一个用 ...

  6. 互斥锁Demo

    #include <stdio.h> #include <pthread.h> pthread_t work1Id; pthread_t work2Id; ; ; pthrea ...

  7. python安装 cvxpy 巨坑,一堆C++错误

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#ecos 下载scs,ecos,cvxpy的whl,一个个安装即可 之前被一堆C++错误搞晕了2小时

  8. jsp2自定义标签+属性

    前面说过jsp2自定义标签如果要加入属性需要设置属性的getter和setter方法.代码如下: public class GetParam extends SimpleTagSupport { pr ...

  9. 2019杭电多校第三场hdu6606 Distribution of books(二分答案+dp+权值线段树)

    Distribution of books 题目传送门 解题思路 求最大值的最小值,可以想到用二分答案. 对于二分出的每个mid,要找到是否存在前缀可以份为小于等于mid的k份.先求出这n个数的前缀和 ...

  10. python中字符串输出格式

    print输入格式总结 通过使用ljust(),center(),rjust()函数来实现输入字符串的左右对齐,居中,右对齐等操作; 方法一:(函数不带参数,则默认以空格填充,注意:文字与空格总字符数 ...