SDOI2018
SD的题有点反人类啊。。。
d1t1[SDOI2018]物理实验
感觉比较好想但不太好写,写了一半弃了
d1t2[SDOI2018]战略游戏
建出圆方树,每次建虚树,答案就是虚树上的原点个数减去询问的点数。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#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=4e5+;
typedef long long LL;
typedef double db;
using namespace std;
int cas,n,m,Q,tot; 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 graph {
int ecnt,fir[N],nxt[N],to[N],v[N],dfn[N],dfs_clock,f[N][],R[N],sz[N]; void init() {
memset(fir,,sizeof(fir));
memset(v,,sizeof(v));
ecnt=; For(i,,n) v[i]=;
} int in(int y,int x) { return dfn[y]>=dfn[x]&&dfn[y]<dfn[x]+sz[x]; } void add(int u,int v) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
} void dfs(int x,int fa) {
sz[x]=;
f[x][]=fa;
v[x]+=v[fa];
R[x]=R[fa]+;
dfn[x]=++dfs_clock;
For(i,,) f[x][i]=f[f[x][i-]][i-];
for(int i=fir[x];i;i=nxt[i]) {
dfs(to[i],x);
sz[x]+=sz[to[i]];
}
} int lca(int x,int y) {
if(R[x]<R[y]) swap(x,y);
Rep(i,,) if(R[f[x][i]]>=R[y])
x=f[x][i];
if(x==y) return x;
Rep(i,,) if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][];
} }G; struct Tarjan {
int dfn[N],low[N],dfs_clock,rr,sta[N],top;
int ecnt,fir[N],nxt[N],to[N]; void init() {
memset(fir,,sizeof(fir));
memset(dfn,,sizeof(dfn));
ecnt=; dfs_clock=; top=; tot=n;
} void add(int u,int v) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
} void tarjan(int x,int F) {
dfn[x]=low[x]=++dfs_clock;
for(int i=fir[x];i;i=nxt[i]) {
if(i==(F^)) continue;
if(!dfn[to[i]]) {
sta[++top]=i;
tarjan(to[i],i);
if(low[to[i]]>=dfn[x]) {
G.add(x,++tot);
while(top) {
int j=sta[top--];
G.add(tot,to[j]);
if(j==i) break;
}
}
low[x]=min(low[x],low[to[i]]);
}
else low[x]=min(low[x],dfn[to[i]]);
}
}
}T; bool cmp(const int &A,const int&B) { return G.dfn[A]<G.dfn[B]; } struct work {
int q[N],sta[N],top;
void sol() {
read(n); read(m);
G.init(); T.init();
For(i,,m) {
int u,v;
read(u); read(v);
T.add(u,v);
}
T.tarjan(,);
G.dfs(,);
read(Q);
while(Q--) {
int c; top=;
read(c); q[]=c;
For(i,,c) read(q[i]);
sort(q+,q+c+,cmp);
For(i,,c-) q[++q[]]=G.lca(q[i],q[i+]);
sort(q+,q+q[]+,cmp);
int sz=unique(q+,q+q[]+)-(q+);
int ans=q[]<=n;
For(i,,sz) {
while(top&&!G.in(q[i],q[sta[top]])) top--;
if(top) { ans+=G.v[q[i]]-G.v[q[sta[top]]]; }
sta[++top]=i;
}
printf("%d\n",ans-c);
}
}
}W; //#define DEBUG
int main() {
#ifdef DEBUG
freopen("1.in","r",stdin);
//freopen(".out","w",stdout);
#endif
read(cas);
while(cas--) W.sol();
return ;
}
d1t3[SDOI2018]反回文串
我觉得有点神啊。。。
要用O(1)快速乘,不然会T成55分。
如果质因子的数组没开LL,会卡死在91分。。
如果抄了luogu题解里的O(1)快速乘,没有对结果取模,94分。。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define For(i,a,b) for(LL i=(a);i<=(b);i++)
#define Rep(i,a,b) for(LL i=(a);i>=(b);i--)
const int N=1e5+;
typedef long long LL;
typedef long double LD;
typedef double db;
using namespace std;
LL T;
LL n,k,p,q[N],lq[N],cq[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;
} LL ksc(LL a,LL b,LL p) {
/*a%=p; b%=p;
LL rs=0,bs=a;
while(b) {
if(b&1) rs=(rs+bs)%p;
bs=(bs+bs)%p;
b>>=1;
}
return rs;*/
LL tp=a*b-(LL)((LD)a/p*b+1.0e-8)*p;
return tp<?tp+p:tp%p;
} LL tp=a*b-(LL)((LD)a/p*b+1.0e-8)*p; LL ksm(LL a,LL b,LL p) {
LL rs=,bs=a%p;
while(b) {
if(b&) rs=ksc(rs,bs,p);
bs=ksc(bs,bs,p);
b>>=;
}
return rs;
} int miller_rabin(LL n) {
if(n==||n==||n==||n==||n==||n==) return ;
if(!(n%)||!(n%)||!(n%)||!(n%)||!(n%)) return ;
LL u=n-,k=;
while(!(u&)) { u>>=; k++; }
For(ti,,) {
LL a=rand()%(n-)+;
LL x=ksm(a,u,n),y;
For(i,,k) {
y=ksc(x,x,n);
if(y==&&x!=&&x!=n-) return ;
x=y;
}
if(x!=) return ;
}
return ;
} LL gcd(LL a,LL b) { return !b?a:gcd(b,a%b); } LL pollard_rho(LL n,LL c) {
LL x=rand()%n,y=x;
for(LL i=,k=;;i++) {
x=(ksc(x,x,n)+c)%n;
LL tp=gcd(n,(x-y+n)%n);
if(tp>&&tp<n) return tp;
if(x==y) return n;
if(i==k) k+=k,y=x;
}
} void find(LL n) {
if(miller_rabin(n)) {
q[++q[]]=n;
return ;
}
LL tp=n;
for(LL c=;;c++) {
tp=pollard_rho(n,c);
if(tp>&&tp<n) break;
}
find(tp); find(n/tp);
} LL F(LL d) { return ksm(k,((d&)?d/+:d/),p); }
LL h(LL d) { return (d&)?d%p:d/%p; } LL ans;
void dfs(int pos,int up,LL now,LL tt) {
if(pos==up+) {
LL d=n/now;
if((d&)&&!(now&)) ;
else ans=(ans+F(d)*h(d)%p*tt%p)%p; return;
}
For(i,,cq[pos]) {
dfs(pos+,up,now,i?(-lq[pos]%p+p)%p*tt%p:tt);
now*=lq[pos];
}
} void solve() {
sort(q+,q+q[]+); lq[]=;
For(i,,q[]) {
if(i==||q[i]!=q[i-]) { lq[++lq[]]=q[i]; cq[lq[]]=; }
else cq[lq[]]++;
}
ans=; dfs(,lq[],,);
printf("%lld\n",ans);
} //#define DEBUG
int main() {
#ifdef DEBUG
freopen("1.in","r",stdin);
//freopen(".out","w",stdout);
#endif
srand();
read(T);
while(T--) {
read(n); read(k); read(p);
q[]=; find(n);
solve();
}
return ;
}
d2t1[SDOI2018]原题识别
什么神题啊。。。
感觉前30分可以树上莫队,中间30分可以树套树搞一下。
正解好神啊,不会啊,等我什么时候学会了来补吧。
d2t2[SDOI2018]旧试题
题解超详细的。
也好神啊。
听说很卡常,大常数选手不敢写。。
d2t3[SDOI2018]荣誉称号
全场最简单的一道题。
转化为二叉树,限制变成树上任意一条长度为k+1的链的和mod m==0
发现要满足要求,则i*2^(k+1)和i在mod m意义下同余。
于是可以拿前2^k-1个点dp,在每个点处计算它和它下面和它同余的所有点的代价和。
这个代价可以算出第一个然后预处理出b的前缀和来快速转移。
然后就可以2^k*m^2的dp转移了。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#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=2e7+;
typedef long long LL;
typedef double db;
using namespace std;
int T,n,k,m,a[N],b[N],sta[N],top; 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;
} unsigned int SA, SB, SC;int p, A, B;
unsigned int rng61(){
SA ^= SA << ;
SA ^= SA >> ;
SA ^= SA << ;
unsigned int t = SA;
SA = SB;
SB = SC;
SC ^= t ^ SA;
return SC;
}
void gen(){
scanf("%d%d%d%d%u%u%u%d%d", &n, &k, &m, &p, &SA, &SB, &SC, &A, &B);
for(int i = ; i <= p; i++)scanf("%d%d", &a[i], &b[i]);
for(int i = p + ; i <= n; i++){
a[i] = rng61() % A + ;
b[i] = rng61() % B + ;
}
} bool cmp(const int &A,const int &B) {
return a[A]<a[B];
} LL dp[][],t[],c[];
void solve() {
LL ans=;
For(i,,n) a[i]%=m;
memset(dp,,sizeof(dp));
Rep(i,(<<k+)-,) {
memset(t,,sizeof(t));
memset(c,,sizeof(c));
top=;
for(LL pos=i,bs=;pos<=n;pos*=(<<k+),bs*=(<<k+)) {
for(int l=pos;l/bs==i;l++) {
sta[++top]=l; c[a[l]]+=b[l];
}
}
For(j,,m-) c[j]+=c[j-];
For(j,,m-) {
if(j==) For(k,,top) t[j]+=(a[sta[k]]<=j?j-a[sta[k]]:m-(a[sta[k]]-j))*b[sta[k]];
else t[j]=t[j-]+c[j-]-(m-)*(c[j]-c[j-])+(c[m-]-c[j]);
}
if(i>=(<<k)) {
For(j,,m-) dp[i][j]=t[j];
}
else {
For(j,,m-) For(k,,m-) {
LL tp=dp[i<<][j]+dp[(i<<)|][j];
dp[i][(j+k)%m]=min(dp[i][(j+k)%m],tp+t[k]);
}
}
}
printf("%lld\n",dp[][]);
} //#define DEBUG
int main() {
#ifdef DEBUG
freopen("1.in","r",stdin);
//freopen(".out","w",stdout);
#endif
read(T);
while(T--) {
gen();
solve();
}
return ;
}
SDOI2018的更多相关文章
- [SDOI2018] 旧试题
推狮子的部分 \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma(ijk) =\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_ ...
- 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)
[BZOJ5332][SDOI2018]旧试题(数论,三元环计数) 题面 BZOJ 洛谷 题解 如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数. 首先约数个数这个东西很不爽,就搞一搞 ...
- [SDOI2018]战略游戏 圆方树,树链剖分
[SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...
- SDOI2018 一轮培训划水祭
\(\mathcal{Day \ \ -3}\) 作为前言来讲,我对于过几天的省选培训还是很期待的--就算我的实力根本不够,名额是学校推荐的,但是能见到\(\mathcal{cwbc}\)以及一众大佬 ...
- 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)
[BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...
- [loj#2566][BZOJ5333] [Sdoi2018]荣誉称号 树形dp
#2566. 「SDOI2018」荣誉称号 休闲游戏玩家小 Q 不仅在算法竞赛方面取得了优异的成绩,还在一款收集钻石的游戏中排名很高. 这款游戏一共有 n 种不同类别的钻石,编号依次为 1 到 n ...
- P4619 [SDOI2018]旧试题
题目 P4619 [SDOI2018]旧试题 Ps:山东的题目可真(du)好(liu),思维+码量的神仙题 推式 求\(\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ij ...
- SDOI2018退役记
在NOIp2017中,我意识到自己啥也不会.如今SDOI2018快来了,自己还是啥也不会.高一两次考试注定以打两次酱油告终.还是记录一下,到NOIp之后如果还没有退役的话,那这个博客可能还会继续更新吧 ...
- [SDOI2018]物理实验 set,扫描线,旋转坐标系
[SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. ...
- 【扯淡篇】SDOI2018丶一轮游丶记
--某不知名蒟蒻的SDOI2018 R1退役场游记&&OI生涯总结 真的是混不下去了. 进队是不可能的, 进队是不可能进队的. 这辈子不可能进队的. 刷题又不会刷 就是靠打表找规律这种 ...
随机推荐
- H5新增input表单、表单属性
新增表单 email,Email类型 url , Url类型 date,日期类型 time,时间类型 month,月类型 week,周类型 number,数字类型 tel,电话类型 search,搜索 ...
- 2018-10-31-WPF-在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待
title author date CreateTime categories WPF 在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待 lindexi 2018-10-31 9:30:9 + ...
- linux磁盘分区、挂载、查看
实战: 34 查看本机所有磁盘 fdisk -l 35 查看磁盘挂载情况 lsblk -f 36 39: ...
- CSS3(@media)判断手机横竖屏
@media all and (orientation : landscape) { h2{color:red;}/*横屏时字体红色*/ } @media all and (orientation : ...
- leetcood学习笔记-169-求众数
题目描述: 方法一:排序输出中位数 class Solution(object): def majorityElement(self, nums): """ :type ...
- 数字IC设计工程师成长之路
学习的课程 仿真工具VCS实践学习 2019年12月9日-2019年12月23日
- php面向对象深入理解(一)
面向对象(Object Oriented Programming,OOP)的基础知识: 第一个例子: 类Test.class.php <?php class Test{ public $a= ...
- thinkphp 域名部署
ThinkPHP支持模块(甚至可以包含控制器)的完整域名.子域名和IP部署功能,让你的模块变得更加灵活,模块绑定到域名或者IP后,URL地址中的模块名称就可以省略了,所以还可以起到简化URL的作用. ...
- 【Codeforces Round #429 (Div. 2) B】 Godsend
[Link]:http://codeforces.com/contest/841/problem/B [Description] 两个人轮流对一个数组玩游戏,第一个人可以把连续的一段为奇数的拿走,第二 ...
- NX二次开发-UFUN工程图更新视图UF_DRAW_update_one_view
NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...