其实这套题我爆0了,T1define 写成ddefine编译错误 T2有两个变量爆int

但是我看zwh不在悄悄地改了,我心里还是十分愧疚(没有)的。主要是林巨已经虐我125了要是再虐我200分我大概这辈子都追不回来了。

1、上学

动态规划入门题

 //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=,p=;
typedef long long LL;
typedef double db;
using namespace std;
int n,f[N][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 ANS
int main() {
#ifdef ANS
freopen("school.in","r",stdin);
freopen("school.out","w",stdout);
#endif
read(n);
f[][]=;
For(i,,n) For(j,i,n) {
if(i==&&j==) continue;
f[i][j]=((LL)f[i][j-]+f[i-][j])%p;
}
printf("%d\n",f[n][n]);
Formylove;
}

2、旅行

60分树dp入门,100分树dp换根的基本操作。

 //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=;
typedef long long LL;
typedef double db;
using namespace std;
int 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) {
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;
} #define inf 1e18
int sz[N];
LL f[N][],ans[N];
void dfs1(int x,int fa) {
sz[x]=;
f[x][]=inf;
f[x][]=-inf;
for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
dfs1(to[i],x);
sz[x]+=sz[to[i]];
f[x][]=min(f[x][],f[to[i]][]+val[i]);
f[x][]=max(f[x][],f[to[i]][]+val[i]);
}
if(sz[x]==) f[x][]=f[x][]=;
} void dfs2(int x,int fa,LL f0,LL f1,LL ef) {
LL fi1=-inf,se1=-inf,fi0=inf,se0=inf;
if(fa) fi1=f0+ef,fi0=f1+ef;
for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
se0=min(se0,f[to[i]][]+val[i]);
if(se0<fi0) swap(fi0,se0);
se1=max(se1,f[to[i]][]+val[i]);
if(se1>fi1) swap(fi1,se1);
}
ans[x]=fi1;
for(int i=fir[x];i;i=nxt[i]) if(to[i]!=fa) {
LL a,b;
if(fi0==f[to[i]][]+val[i]) a=se0; else a=fi0;
if(fi1==f[to[i]][]+val[i]) b=se1; else b=fi1;
if(a==inf&&b==-inf) a=b=;
dfs2(to[i],x,a,b,val[i]);
}
} #define ANS
int main() {
#ifdef ANS
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
#endif
read(n);
For(i,,n) {
int u,v,w;
read(u); read(v); read(w);
add(u,v,w);
}
dfs1(,);
dfs2(,,,,);
For(i,,n) printf("%lld\n",ans[i]);
Formylove;
}

3、寻找

两道傻逼题+一道码农题。T3我打了两个小时结果题读错了,式子推错了。。。然后我一开始找环也出了点问题,但是代码改成正解还是比较方便。

容易发现给出的图是一个基环外向树。
先考虑没有环的情况,树上的答案很好算,$p_x$表示从rt开始走,走到x点的概率
$p_{rt}=1$

$p_x=p_{fa[x]}* \frac{1}{out_{fa[x]}+1}$

树上x开始走的答案记作$f_x,y$是$x$子树中的点

$f_x=\frac{1}{p_x} \sum_{y}val_y*p_y$

那么只需要对每棵树按dfs序开棵线段树,维护每个点的 $\sum_{y}val_y*p_y$就可以做了

然后考虑环上的点

记从环上的点$x$开始走的答案为$g_x$,设$x$在环上的后继为$y$

$g_x=\frac{val_x+g_y}{out[x]+1}+ \frac{f_x*out_x}{out_x+1}$

设$t_x= \frac{val[x]}{out[x]+1}+\frac{f_x*out_x}{out_x+1}$

$k_x=\frac{1}{out[x]+1}$

$g_x=t_x+k_x*g_y$

解方程就可以得到(y是环上一点)

$g_x*(1-\sum_y \frac{1}{out_y+1})=\sum_{y,y!=x}从x出发走到y的概率*t_y$

大概这样一个式子,我实在不知道怎么表示了。。

有了这个式子,再对每个环再开一个线段树维护就可以了。

 //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=,p=;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,q,val[N];
char s[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 mo(LL x) { return x<?x+p:(x>=p?x-p:x); } struct sgtree {
LL sg[N*];
int rt[N<<],len[N<<],ls[N*],rs[N*];
int tot;
#define lc ls[x]
#define rc rs[x]
#define mid ((l+r)>>1)
void update(int &x,int l,int r,int pos,int v) {
if(!x) x=++tot;
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]=mo(sg[lc]+sg[rc]);
} LL qry(int x,int l,int r,int ql,int qr) {
if(l>=ql&&r<=qr) return sg[x];
if(qr<=mid) return qry(lc,l,mid,ql,qr);
if(ql>mid) return qry(rc,mid+,r,ql,qr);
return mo(qry(lc,l,mid,ql,qr)+qry(rc,mid+,r,ql,qr));
}
}t; LL ksm(LL a,LL b) {
LL rs=,bs=a;
while(b) {
if(b&) rs=rs*bs%p;
bs=bs*bs%p;
b>>=;
}
return rs;
} LL k1[N],k2[N];
LL frc(LL a,LL b) { return a*ksm(b,p-)%p; } int ecnt,fir[N],nxt[N],to[N],in[N],out[N];
void add(int u,int v) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; out[u]++; in[v]++;
} int get(int x,int y) { return (x-)*m+y; } int vis[N],tag[N],pi[N],nx[N];
int dfs(int x,int st) {
if(vis[x]==st) return x;
if(vis[x]) return ;
vis[x]=st;
int rs=;
for(int i=fir[x];i;i=nxt[i]) {
int tp=dfs(to[i],st);
if(tp) { rs=tp; nx[x]=to[i]; }
}
tag[x]=rs;
return rs;
} int id[N],ed[N];
void dfs_H(int x) {
int rt=x,hc=;
id[x]=; pi[x]=;
for(;;) {
if(nx[x]!=rt) pi[nx[x]]=(LL)pi[x]*k1[x]%p;
x=nx[x];
hc++;
if(x==rt) break;
ed[rt]=x;
id[x]=hc+;
}
t.len[n*m+rt]=hc;
} int sum[N],top[N],fa[N],dfn[N],dfk,sz[N];
void dfs2(int x,LL P,int Top) {
sz[x]=;
top[x]=Top;
dfn[x]=++dfk;
if(!tag[x]) pi[x]=P;
for(int i=fir[x];i;i=nxt[i]) if(!tag[to[i]]) {
fa[to[i]]=x;
if(x==Top&&tag[x]) dfs2(to[i],P*frc(,out[x])%p,Top);
else dfs2(to[i],P*k1[x]%p,Top);
sz[x]+=sz[to[i]];
}
} #define ANS
int main() {
#ifdef ANS
freopen("search.in","r",stdin);
freopen("search.out","w",stdout);
#endif
read(n); read(m);
t.tot=;
For(i,,n) {
scanf("%s",s+);
For(j,,m) {
if(s[j]=='U') add(get(i-,j),get(i,j));
if(s[j]=='D') add(get(i+,j),get(i,j));
if(s[j]=='L') add(get(i,j-),get(i,j));
if(s[j]=='R') add(get(i,j+),get(i,j));
}
}
For(i,,n*m) {
k1[i]=ksm(out[i]+,p-);
k2[i]=(-k1[i]+p)%p;
}
For(i,,n*m) if(!vis[i]) dfs(i,i);
For(i,,n*m) if(tag[i]&&!id[i]) dfs_H(tag[i]);
For(i,,n*m) if(!in[i]||tag[i]) {
dfk=;
dfs2(i,,i);
t.len[i]=dfk;
}
read(q);
For(i,,q) {
int o,x,y,z;
read(o); read(x); read(y);
x=get(x,y);
if(o==) {
read(z); val[x]=z;
LL upv=tag[x]?z:(LL)z*pi[x]%p;
t.update(t.rt[top[x]],,t.len[top[x]],dfn[x],upv);
if(tag[top[x]]) {
int ii=top[x];
int rt=tag[ii];
LL f=t.sg[t.rt[ii]];
LL tt=((LL)val[ii]*k1[ii]%p+f*k2[ii]%p)%p;
tt=tt*pi[ii]%p;
t.update(t.rt[rt+n*m],,t.len[rt+n*m],id[top[x]],tt);
}
}
else {
if(!tag[x]) {
LL ans=t.qry(t.rt[top[x]],,t.len[top[x]],dfn[x],dfn[x]+sz[x]-);
ans=ans*frc(,pi[x])%p;
printf("%lld\n",ans);
}
else {
int rt=n*m+tag[x],edd=ed[tag[x]];
LL ans1=t.qry(t.rt[rt],,t.len[rt],id[x],t.len[rt]);
ans1=ans1*frc(,pi[x])%p;
LL ans2=id[x]>?t.qry(t.rt[rt],,t.len[rt],,id[x]-):;
if(ans2) ans2=ans2*frc(pi[edd],pi[x])%p*k1[edd]%p;
LL ans=frc((ans1+ans2)%p,(-(LL)pi[edd]*k1[edd]%p+p)%p);
printf("%lld\n",ans);
}
}
}
Formylove;
}

NOIp2018集训test-9-2(pm)的更多相关文章

  1. NOIp2018集训test-10-24(am&pm)

    李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...

  2. NOIp2018集训test-9-21(am/pm)

    Am DAY1 抄代码 送分题 //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++ ...

  3. NOIp2018集训test-9-19(am&pm)

    AM 这是一套在长沙考过而且我能记得全部正解的题,然后期望得分300实际得分155. T1 很套路,随便搞(我当年是怎么花大半场时间写T1并且写出现在两倍长的代码的??) //Achen #inclu ...

  4. NOIp2018集训test-9-22(am/pm) (联考三day1/day2)

    szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...

  5. NOIp2018集训test-9-17(pm)

    T1记忆(memory) 我大概是只记忆只有七秒的金鱼吧.看了下以前的代码发现真的很简单,但是考场上只打了个暴力,虽然骗了88pt.就是枚举选的是哪个串,然后vis[i]表示选了i这些位能不能猜出它, ...

  6. NOIp2018集训test-9-8(pm) (联考一day2)

    把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...

  7. NOIp2018集训test-9-7(pm) (联考一day1)

    又被辉神吊打了.今天不仅被辉神李巨吊打,还给基本上给全班垫底了. 看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推. Orz lyc BM直接水过,Orz wys六个fo ...

  8. NOIp2018集训test-9-6(pm)

    T1T2是洛谷原题.Orz辉神290,被辉神吊起来打. 题 1 包裹快递 二分答案.这题似乎卡精度,不开long double二分500次都过不去. //Achen #include<algor ...

  9. NOIp2018集训test-9-5(pm)

    老张说:这套题太简单啦,你们最多两个小时就可以AK啦! 题 1 数数 我看到T1就懵了,这就是老张两个小时可以AK的题的T1?? 然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心. 等 ...

随机推荐

  1. appium1.4+华为8.0执行自动化脚本,报启动session失败,原因是unicode_ime_apk\Uni codeIME-debug.apk在手机上已存在,再次安装失败,导致启动session失败,解决办法:换高版本的appium

    最开始做Android自动化测试时,通过执行脚本发现报,已安装UnicodeIME-debug.apk,再次安装失败,当时觉得这个apk对我来说没用,就把D:\Program Files (x86)\ ...

  2. Java IO之处理流

    一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性) ...

  3. leetcode-164周赛-1267-统计参与通信的服务器

    题目描述: 自己的提交: class Solution: def countServers(self, grid: List[List[int]]) -> int: from collectio ...

  4. DEDE织梦标签经常调用的内容

    DEDE织梦标签名称:{/dede:arclist} 详解 标签名称:arclist标记简介:织梦常用标记,也称为自由列表标记,其中imglist.imginfolist.specart.coolar ...

  5. 【TCP】TCP状态

    下图所示,TCP通信过程包括三个步骤:建立TCP连接通道(三次握手).数据传输.断开TCP连接通道(四次挥手). 这里进一步探究TCP三路握手和四次挥手过程中的状态变迁以及数据传输过程.先看TCP状态 ...

  6. apue 第18章 终端I/O

    终端I/O有两种不同的工作模式: (1)规范模式:输入以行单位进行处理,每个读请求也最多返回一行. (2)非规范模式:输入字符不装配成行. 终端设备是由通常位于内核中的终端驱动程序控制的.每个终端设备 ...

  7. Android Studio androidx 包冲突解决方法

    如果包冲突了会包如下这样的错: Android dependency 'androidx.core:core' has different version for the compile (1.0.0 ...

  8. java 后台 实现简单的验证码

    private int width =80;private int height=30;private Random r=new Random();private String fontnames[] ...

  9. 炼数成金数据分析课程---10、python中如何画图

    炼数成金数据分析课程---10.python中如何画图 一.总结 一句话总结: 主要matplotlib库,pandas中也可以画一些基础图 大纲+实例快速学习法 1.matplotlib的最简单画图 ...

  10. Devstack 多节点自动化部署

    本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...