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生涯总结 真的是混不下去了. 进队是不可能的, 进队是不可能进队的. 这辈子不可能进队的. 刷题又不会刷 就是靠打表找规律这种 ...
随机推荐
- python_django_template模块
官方文档 博文导航: 定义模板: 变量 标签: if for include url csrf_token 过滤器: 简单过滤器 HTML转义 加减乘除的过滤器 注释: 模板继承 模板语言:Dja ...
- native 之bitmap 保存坑
之前开发项目的时候遇到几次一键保存二维码,或凭证的需求,但是使用h5 a标签 保存网络图片有些并不支持,于是想到了 使用navite 的bitmap可能会好一些 bitmap js封装后的原生图片对象 ...
- spark运行任务报错:Container [...] is running beyond physical memory limits. Current usage: 3.0 GB of 3 GB physical memory used; 5.0 GB of 6.3 GB virtual memory used. Killing container.
spark版本:1.6.0 scala版本:2.10 报错日志: Application application_1562341921664_2123 failed 2 times due to AM ...
- pycharm 2020 激活码 破解教程
以下是安装完pycharm后进行破解!! 1.修改hosts,在hosts文件最后添加2行“0.0.0.0 account.jetbrains.com”和“0.0.0.0 www.jetbrain ...
- 安装监控MongoDB的Python安装包时候报错:HTTP Error 403: SSL is required
安装pymongo-2.3.tar.gz,执行命令python setup.py install报错: HTTP Error 403: SSL is required 分析原因:安装需要下载这个dis ...
- js条件语句,用if...else if....else方程ax2+bx+c=0一元二次方程。求根
if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if...else if... ...
- Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存
首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...
- bzoj_auto_submiter(辣鸡Py毁我青春系列)
听说你们的bzoj小号都很厉害? 不如试试bzoj金坷垃——bzoj_auto_submiter! 把所有的代码拖进解压后的文件夹,然后双击run.cmd. 看到有chrome浏览器窗口弹出来不要慌, ...
- python round, ceil, flooor
round(num, n) 保留n位小数 round(80.23456, 2) : 80.23 round(100.000056, 3) : 100.0 round(-100.000056, 3) : ...
- ParameterizedThreadStart task
using System;using System.Diagnostics;using System.Threading;using System.Threading.Tasks; namespace ...