NOIp2018集训test-10-23
上午考了一套sb题,但是没有人AK。李巨290虐场。
下午又考了一套sb题,李巨AK虐场。%%%
T1 %
中国剩余定理好像做不了啊,我一直在想如何用CRT做,然后就GG了。
然而正解是bike当初说的“CRT根本没用啊你每次合并两个数就可以了”然而这玩意似乎就叫做EXCRT。
考虑合并
x=y mod P
x=bi mod ai
k1*P+y=k2*ai+bi
k1*P+k3*ai=bi-y
exgcd解同余方程,得到一个解,从而得到k1的最小整数解。
x=x+k1*P
P=lcm(P,ai)
洛谷这道题要写快速乘
这道t1相当于是k1是暴力从小到大枚举的,lcm(p1~pi)=p1*p2*……pi,与p(i+1)互质,k最多枚举到i。P和x都很大不需要记下来,只需要记录它们模每个a和每个b的结果即可。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int up=,N=;
typedef unsigned long long LL;
typedef double db;
using namespace std;
int n,m;
int a[N],b[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;
} int bo[up+],p[up+];
void get_prime() {
for(int i=;i<=up;i++) {
if(!bo[i]) p[++p[]]=i;
for(int j=;j<=p[]&&p[j]*i<=up;j++) {
bo[i*p[j]]=;
if(i%p[j]==) break;
}
}
} struct ct {
int ma[N],mb[N];
friend ct operator +(const ct &A,const ct &B) {
ct rs;
For(i,,n) rs.ma[i]=(A.ma[i]+B.ma[i])%p[i];
For(i,,m) rs.mb[i]=((LL)A.mb[i]+B.mb[i])%b[i];
return rs;
}
friend ct operator *(const ct &A,const int &B) {
ct rs;
For(i,,n) rs.ma[i]=A.ma[i]*B%p[i];
For(i,,m) rs.mb[i]=(LL)A.mb[i]*B%b[i];
return rs;
}
}bs,rs; #define ANS
int main() {
#ifdef ANS
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
#endif
get_prime();
read(n); read(m);
For(i,,n) read(a[i]);
For(i,,m) read(b[i]);
For(i,,n) bs.ma[i]=,rs.ma[i]=; // rs=0 bs=1
For(i,,m) bs.mb[i]=,rs.mb[i]=;
For(i,,n) {
while(rs.ma[i]!=a[i]) rs=rs+bs;
bs=bs*p[i];
}
int tp=;
For(i,,n) if(rs.ma[i]==) tp++;
For(i,,m) {
if(tp==n) cout<<bs.mb[i]<<endl;
else cout<<rs.mb[i]<<endl;
}
Formylove;
}
T2 净化
最短路裸题。。
把水厂的dis设为0跑最短路,对于单向边u->v,答案和dis[u]+val(u,v)取max,对于双向边u<->v,ans-dis[u]+ans-dis[v]>=val(u,v)。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=,inf=1e9;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,is[N],ec[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;
} int ecnt,fir[N],nxt[N],to[N],val[N];
void add(int u,int v,int w,int i) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w;
} struct node {
int x,dis;
node(int x,int dis):x(x),dis(dis){}
friend bool operator <(const node&A,const node&B) {
return A.dis>B.dis;
}
};
priority_queue<node>que; int dis[N];
int solve() {
For(i,,n) {
if(is[i]==) {
dis[i]=;
que.push(node(i,));
}
else dis[i]=inf;
}
while(!que.empty()) {
node t=que.top();
que.pop();
if(t.dis!=dis[t.x]) continue;
for(int i=fir[t.x];i;i=nxt[i]) {
if(dis[to[i]]>t.dis+val[i]) {
dis[to[i]]=t.dis+val[i];
que.push(node(to[i],dis[to[i]]));
}
}
}
int rs=;
For(i,,m) {
int x=ec[i][],y=ec[i][];
int t=ec[i][],len=ec[i][];
if(t==) rs=max(rs,dis[x]+len);
else {
int tp=(dis[x]+dis[y]+len)/;
if((dis[x]+dis[y]+len)%) tp++;
if(tp>rs) rs=tp;
}
}
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("purify.in","r",stdin);
freopen("purify.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) read(is[i]);
For(i,,m) {
int x,y,t,len;
read(x); read(y); read(t); read(len);
ec[i][]=x; ec[i][]=y;
ec[i][]=t; ec[i][]=len;
add(x,y,len,i);
if(t==) add(y,x,len,i);
}
printf("%d\n",solve());
Formylove;
}
T3 三点通信
lca裸题。。
树上的答案等于d[x]+d[y]+d[z]-d[lca(x,y)]-d[lca(x,z)]-d[lca(y,z)]
有环的话,记下多出的一条边,要么只在树上走,同上,要么考虑多出的一条边(u,v)要被经过,枚举x,y,z中某些点到u,某些点到v,再加上u,v的权值。
求树上k个点之间的路径长度的话,怕是要建虚树哦,不知道有没有更简单的方法。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,q;
LL HC,HD[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;
} int ecnt,fir[N],nxt[N],to[N];
LL val[N];
void add(int u,int v,LL w) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w;
nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u; val[ecnt]=w;
} int vis[N],R[N],ok,ex,ey,f[N][];
LL dis[N],el;
void dfs(int x,int fa) {
vis[x]=;
f[x][]=fa;
R[x]=R[fa]+;
For(i,,) f[x][i]=f[f[x][i-]][i-];
for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
if(vis[to[i]]) {
ok=;
ex=x; ey=to[i]; el=val[i];
}
else {
dis[to[i]]=dis[x]+val[i];
dfs(to[i],x);
}
}
} 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][];
} LL calc(int a,int b) { return dis[a]+dis[b]-2LL*dis[lca(a,b)]; }
LL calc(int a,int b,int c) { return dis[a]+dis[b]+dis[c]-dis[lca(a,b)]-dis[lca(a,c)]-dis[lca(b,c)]; } LL solve(int a,int b,int c) {
LL rs=calc(a,b,c);
if(ok) {
rs=min(rs,calc(a,ex)+calc(b,c,ey)+el);
rs=min(rs,calc(b,ex)+calc(a,c,ey)+el);
rs=min(rs,calc(c,ex)+calc(a,b,ey)+el);
rs=min(rs,calc(a,ey)+calc(b,c,ex)+el);
rs=min(rs,calc(b,ey)+calc(a,c,ex)+el);
rs=min(rs,calc(c,ey)+calc(a,b,ex)+el);
}
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("three.in","r",stdin);
freopen("three.out","w",stdout);
#endif
read(n); read(m); read(q);
For(i,,m) {
int x,y; LL z;
read(x); read(y); read(z);
add(x,y,z);
}
dfs(,);
For(cs,,q) {
int x,y,z;
read(x); read(y); read(z);
printf("%lld\n",solve(x,y,z));
}
Formylove;
}
NOIp2018集训test-10-23的更多相关文章
- [NOIP2018模拟赛10.23]发呆报告
闲扯 考场看了眼题目感觉很难,一个小时敲完了所有暴力...嗯然后就在那里发呆什么事也没做 T3考场上把数据结构想了个遍都不会完成1操作,现在看这种思路其实之前也接触过... 比较玄学的一件事情就是T1 ...
- 背水一战 Windows 10 (23) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令
[源码下载] 背水一战 Windows 10 (23) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过 ButtonBase 触发命令 作者:webabcd ...
- 10.23 正睿停课训练 Day7
目录 2018.10.23 正睿停课训练 Day7 A 矩形(组合) B 翻转(思路) C 求和(思路 三元环计数) 考试代码 B1 B2 C 2018.10.23 正睿停课训练 Day7 期望得分: ...
- Daily Scrum 10.23
(写于10.22周四) 说下现在的人员情况: 康家华请假至下周一,刘彦熙至周五18:00,张启东至周六中午. 其他人正常工作. 然后是现在的进度情况: 已经完成服务器数据库搭建,以及基础的注册登陆功能 ...
- [NOIP2018模拟赛10.16]手残报告
[NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...
- [jzoj NOIP2018模拟10.23]
丢分主要是下面几个方面: 1.T2代码交错了,有个特判没写丢了10分 2.T1线段树加等差数列写错了(其实二维差分就可以,但我当时不会) 3.T3思考再三还是为了10分写上了主席树,还是写错了 总体评 ...
- [NOIP2018模拟赛10.20A]挂分报告
闲扯 先看看了B组,T1 ZROI刚好讲过一个性质原根一般很小的,直接枚举;T2一眼二分然后似乎状压 T3没看 然后上来A组题,T1 flow这名字...网络流?! T1题面非常的社会主义核心价值观, ...
- Notes of the scrum meeting(2013/10/23)
ps:本来是10月23号周三下午开的会,这几天由于各种事情忙,忘记写博客了,现在补上. 软工项目组buaa_smile开始项目第一次scrum meeting meeting time:4:00~5: ...
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
- NOIP2018 集训(二)
A题 神炎皇 问题描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 \((a,b)\) ,若满足 \(a+b\leq n\) 且 \(a+b\) 是 \(ab\) 的因子,则称 为神 ...
随机推荐
- Linux文件归档工具——cpio
一cpio的介绍 功能:复制文件从或到归档 cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件. cpio [选项] > 文件 ...
- .net从服务端下载文件(可以断点续传)
public void DownFile(string guid) { var fileTransfer = new FileTransfer(); var directoryPath = Path. ...
- OC学习篇之---类目的概念和使用
上一篇文章介绍了OC中的@class关键字的使用http://blog.csdn.net/jiangwei0910410003/article/details/41774747,这一篇我们介绍一下,O ...
- 修改Mysql数据库的字符集
1.先检查数据库的默认字符集是否是引起不能存储中文的原因: 登录数据库后执行下面的命令 mysql> show variables like 'character%'; 由上图可以看出,data ...
- CTF隐写——越光宝盒
0x题目 原题来自于实验吧:http://www.shiyanbar.com/ctf/1992 一句话,和一个PNG图片. 0x解题 1.下载图片以后,发现打不开. 首先想到的就是文件头可能被修改了, ...
- [转]DrawPrimitive 详解Direct3DDevice8
Direct3DDevice8 函数 05-39 DrawPrimitive 详解 费了好大的劲,终于搞清楚 DirectX 3D 三维图像中 DrawPrimitive 的用法(自嘲:未必). D ...
- AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791
一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...
- PAT_A1037#Magic Coupon
Source: PAT A1037 Magic Coupon (25 分) Description: The magic shop in Mars is offering some magic cou ...
- MYSQL索引的深入学习
通常大型网站单日就可能会产生几十万甚至几百万的数据,对于没有索引的表,单表查询可能几十万数据就是瓶颈. 一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条数据,平 ...
- CF1220F
CF1220F 把整棵树分成1的左边和1的右边两部分 最优情况两边子树深度的差一定可以是一 如果还可以是2,也可以通过把多的那一边的点往另一边移使他变成1 如果往一个端点加点,一定不会使这一边变优,也 ...