其实这套题我爆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. Map集合类(二.其他map集合jdk1.8)

    java集合笔记一 java集合笔记二 java集合笔记三 1.hashtable(线程安全) 1.存储数据为数组+链表2.存储键值对或获取时通过hash值取模数组长度确定节点在数组中的下标位置 in ...

  2. Mysql学习笔记(001)-常见命令

    常见命令 SHOW DATABASES; /* use test; create database myemployees; use myemployees; create table employe ...

  3. 【JZOJ6431】【luoguP5658】【CSP-S2019】括号树

    description analysis 用栈维护一下树上路径未匹配的左括号,然后在树上找右括号匹配,设\(f[i]\)为\(i\)节点的贡献,\(g[i]\)是答案 为左括号可以直接继承父节点的信息 ...

  4. Vue学习笔记【13】——键盘修饰符以及自定义键盘修饰符

    1.x版本中自定义键盘修饰符[了解] Vue.directive('on').keyCodes.f2 = 113; 2.x版本中自定义键盘修饰符 通过Vue.config.keyCodes.名称 = ...

  5. CSS3 @media 查询(制作响应式布局)

    这里简单说明一下@media 查询. 详细说明文档:http://www.runoob.com/cssref/css3-pr-mediaquery.html 使用 @media 查询,你可以针对不同的 ...

  6. APICloud框架——获取本地图片信息

    api.getPicture 获取本地图片放置到服务器上或者在app中预览是app的基本功能,今天使用了APICloud框架的api.getPicture这个api获取到的本地图片预览在app中,就像 ...

  7. 1245. Tree Diameter

    解题思路:本题是一道图的题目,但是无向图,给定的输入是图的各个边,题目中给出一个关键信息(Each node has labels in the set {0, 1, ..., edges.lengt ...

  8. ASP.NET Core学习——3

    中间件 中间件是用于组成应用程序管道来处理请求和相应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件,并在管道中调用下一个组件之前和之后执行某些操作.请求委托被用来建立请求管道,请求委托处 ...

  9. Jmeter json和正在提取及断言

    Jmeter  json和正在提取及断言 一.提取所需要断言的内容: 响应数据如下:加入需要提取userid为10477的值 { "pub": { , ", " ...

  10. hibernate5.2.10.Final基本配置

    1.在官网去下载,解压后在lib/required目录下的所有jar包都是必要的. 2.为了之后配置方便,建议在eclipse里面安装一个东东,操作步骤是在eclipse->Help->I ...