NOI.AC WC模拟赛
4C(容斥)
http://noi.ac/contest/56/problem/25
同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形)。
问题变成,决定这个L形中每个位置的高度,是每个位置都不超出所在行列的限制,且每行每列都有至少一个位置达到最高限制。
容斥,暴力枚举有多少行多少列没有任何一个位置达到最高限制,这些行列中的位置都只能取到0~h。其余L形中的位置都无限制,即能取到0~h+1。
#include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ,mod=1e9+; ; int ksm(int a,int b){ ; ) ) res=1ll*res*a%mod; return res; } bool cmp(int a,int b){ return a>b; } int main(){ scanf(][]=; rep(i,,N-){ C[i][]=; rep(j,,i) C[i][j]=(C[i-][j]+C[i-][j-])%mod; } rep(i,,n) scanf(,a+n+,cmp); rep(i,,m) scanf(,b+m+,cmp); a[n+]=b[m+]=-; ,y=; x<n||y<m; ){ ],b[y+]),xx=x,yy=y,ans=; ]==h) ++x; ]==h) ++y; rep(i,,x-xx) rep(j,,y-yy){ int S1=(x-i)*(y-j)-xx*yy,S2=x*y-S1-xx*yy; ,S1)%mod*ksm(h,S2)%mod; ) ans=(ans-res+mod)%mod; else ans=(ans+res)%mod; } Ans=1ll*Ans*ans%mod; } printf("%d\n",Ans); ; }
5A(杜教筛)
$$\begin{align*}
&\ \ \ \ \sum_{k=1}^{n}\sum_{i=1}^{k}\sum_{j=1}^{k}(i,j,k)\\
&=\sum_{p=1}^{n}p\sum_{k=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{i=1}^{k}\sum_{j=1}^{k}[(i,j,k)=1]\\
&=\sum_{p=1}^{n}p\sum_{k=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{i=1}^{k}\sum_{j=1}^{k}\sum_{d|i,d|j,d|k}\mu(d)\\
&=\sum_{p=1}^{n}p\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\sum_{k=1}^{\lfloor\frac{n}{pd}\rfloor}\sum_{i=1}^{k}\sum_{j=1}^{k}1\\
&=\sum_{p=1}^{n}p\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)f(\lfloor\frac{n}{pd}\rfloor)\\
&=\sum_{T=1}^{n}f(\lfloor\frac{n}{T}\rfloor)\sum_{d|T}\mu(d)\cdot\frac{T}{d}\\
&=\sum_{T=1}^{n}f(\lfloor\frac{n}{T}\rfloor)\varphi(T)
\end{align*}$$
其中$f(n)=\sum_{i=1}^{n}i^2=\frac{n(n+1)(2n+1)}{6}$,最后一步是根据$id*\mu=\varphi$得到的。
观察这个式子发现可以根号加速,$\varphi$的前缀和用杜教筛求出。通过记忆化能做到玄学复杂度。
#include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ; ,inv,b[N],p[N],tot,phi[N],Phi[N],ans; int ksm(int a,int b){ ; ) ) res=1ll*res*a%mod; return res; } )%mod*(x+x+)%mod*inv%mod; } void init(int n){ rep(i,,n){ ; ; i*p[j]<=n; ++j){ b[i*p[j]]=; ); else { phi[i*p[j]]=phi[i]*p[j]; break; } } } } int P(int x){ if (x<=m) return phi[x]; if (~Phi[n/x]) return Phi[n/x]; ; ,j; i<=x; i=j+) j=x/(x/i),res=(res+1ll*(j-i+)*P(x/i))%mod; res=((1ll*x*(x+)>>)-res+mod)%mod; return Phi[n/x]=res; } int main(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf(,mod-); phi[]=; init(m); rep(i,,m) phi[i]=(phi[i]+phi[i-])%mod; memset(Phi,-,sizeof(Phi)); ,j; i<=n; i=j+) j=n/(n/i),ans=(ans+1ll*(P(j)-P(i-)+mod)*S(n/i))%mod; printf("%d\n",ans); ; }
5B(后缀树DP)
http://noi.ac/contest/57/problem/18
最优策略显然是,每次根据已知部分,估计出对方下一步最有可能出什么,再以此决定出拳。
将串反序建出原串的后缀树,再在后缀树上DP即可。用id存下子串第一次出现的位置。转移显然。
#include<cstdio> #include<vector> #include<cstring> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long long ll; using namespace std; ; char s[N]; ,w[N],d[N],a[N],lst,rt,mx[N],son[N][],fa[N],id[N]; vector<int>Son[N]; ll sw[N],f[N]; void ext(int c,int x){ ; id[np]=x; while (p && !son[p][c]) son[p][c]=np,p=fa[p]; ; return; } int q=son[p][c]; ) { fa[np]=q; return; } ; son[nq][]=son[q][]; son[nq][]=son[q][]; son[nq][]=son[q][]; fa[nq]=fa[q]; fa[q]=fa[np]=nq; while (p && son[p][c]==q) son[p][c]=nq,p=fa[p]; } || (y==&&x==)) ? w[z] : (((x-y+)%==) ? d[z] : ); } void dfs(int x){ ; rep(i,,ed) dfs(Son[x][i]),id[x]=id[Son[x][i]]; if (mx[x]>=n) return; rep(j,,){ ll res=1ll<<; rep(i,,ed){ int y=Son[x][i],op=a[id[y]+mx[x]]; res=min(res,sw[min(mx[y],n)]-sw[mx[x]+]+f[y]+calc(j,op,mx[x]+)); } f[x]=max(f[x],res); } } int main(){ scanf(); rep(i,,n) a[i]=(s[i]==:(s[i]==:); rep(i,,n) scanf(]+w[i]; *n; i; i--) ext(a[i],i); rep(i,,nd) Son[fa[i]].push_back(i); dfs(); printf(]); ; }
6B(2-SAT)
http://noi.ac/contest/58/problem/24
每只蚯蚓建n个点,点v[i][j]表示蚯蚓i是否位于节点j的子树内。
2-SAT建图,边数为$O(mn^2+qn)$。
#include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ,M=; ][]; int cnt,scc,top,hd[N],v[M],nxt[M],low[N],dfn[N],stk[N],inq[N],bel[N]; void adde(int x,int y){ V[++tot]=y,Nxt[tot]=Hd[x],Hd[x]=tot; } void add(int x,int y){ v[++cnt]=y,nxt[cnt]=hd[x],hd[x]=cnt; x^=,y^=; v[++cnt]=x,nxt[cnt]=hd[y],hd[y]=cnt; } void dfs(int u,int f){ fa[u]=f,dep[u]=dep[f]+,L[u]=++tim; for(int i=Hd[u];i;i=Nxt[i]) if(V[i]!=f) dfs(V[i],u); R[u]=tim; } void tarjan(int u){ dfn[u]=low[u]=++tim; stk[++top]=u,inq[u]=; for(int i=hd[u];i;i=nxt[i]) if (!dfn[v[i]]) tarjan(v[i]),low[u]=min(low[u],low[v[i]]); else if(inq[v[i]])low[u]=min(low[u],dfn[v[i]]); if(dfn[u]==low[u]){ int x=tot; scc++; ; } } int main(){ scanf("%d%d%d",&n,&m,&Q); rep(i,,n) scanf("%d%d",&x,&y),adde(x,y),adde(y,x); dfs(,); tot=; rep(i,,m) rep(j,,n) id[i][j]=tot,tot+=; rep(i,,m){ add(id[i][]^,id[i][]); rep(j,,n) add(id[i][j],id[i][fa[j]]); rep(j,,n) rep(k,j+,n) if((L[j]<L[k]||L[j]>R[k])&&(L[k]<L[j]||L[k]>R[j])) add(id[i][j],id[i][k]^); } while(Q--){ scanf("%d%d%d",&x,&y,&z); for (int i=Hd[z];i;i=Nxt[i]) ); ) add(id[x][z]^,id[y][z]); } tim=; rep(i,,tot-) if (!dfn[i]) tarjan(i); rep(i,,m){ ; rep(j,,n) ]) ret=dep[j]>dep[ret]?j:ret; printf("%d ",ret); } ; }
NOI.AC WC模拟赛的更多相关文章
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- [NOI.AC 2018NOIP模拟赛 第三场 ] 染色 解题报告 (DP)
题目链接:http://noi.ac/contest/12/problem/37 题目: 小W收到了一张纸带,纸带上有 n个位置.现在他想把这个纸带染色,他一共有 m 种颜色,每个位置都可以染任意颜色 ...
- NOI.AC NOIP模拟赛R3解题报告
心路历程 预计得分:\(100+100+50=250\) 实际得分:\(10 +100 +50 = 160\) 三道原题,真好.T2做过,T1写了个错误思路,T3写了写50分状压dp. 整场考试实际在 ...
- noi.ac NOI挑战营模拟赛1-5
注:因为博主是个每次考试都爆零垫底的菜鸡,所以此篇博客很有可能咕咕咕 (指只贴AC代码不写题解的......如果我真的不会做的话,就不能怪我了qwqwq) Day1 T1 swap 23pts 从一个 ...
随机推荐
- react 带参数事件方法不立即执行
handleClick:()=>{this.to_step('to_step3_2')}}
- [转]QList内存释放
QList<T> 的释放分两种情况: 1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码 #include <QtCore/QCoreApplicat ...
- Treats for the Cows 区间DP POJ 3186
题目来源:http://poj.org/problem?id=3186 (http://www.fjutacm.com/Problem.jsp?pid=1389) /** 题目意思: 约翰经常给产奶量 ...
- HDU 2825 Wireless Password
题目链接:HDU-2825 题意:给出m个单词,要构造出满足包含其中大于等于k个单词的字符串,字符只包括小写字母,问长度为n的这样的串有多少个. 思路:令dp[i][j][k]表示当前已经构造了i个字 ...
- URIEncoding与useBodyEncodingForURI 在tomcat中文乱码处理上的区别
大家知道tomcat5.0开始,对网页的中文字符的post或者get,经常会出现乱码现象. 具体是因为Tomcat默认是按ISO-8859-1进行URL解码,ISO-8859-1并未包括中文字符,这样 ...
- 删除git库中untracked files(未监控)的文件
https://blog.csdn.net/ronnyjiang/article/details/53507306 在编译git库拉下来的代码时,往往会产生一些中间文件,这些文件我们根本不需要,尤其是 ...
- robotframework-ride多次运行,有时候不显示日志信息
解决方法: 修改"C:\Python27\lib\site-packages\robotide\contrib\testrunner\testrunner.py"文件pop方法中 ...
- git忽略特殊文件或文件夹
1.在项目目录中添加“.gitignore”文件,项目目录就是你存放git工程的目录就是有“.git”目录的目录 vi .gitignore 2.在文件中添加如下内容,其中“/runtime/”是忽略 ...
- Bugfree3.0.4 Linux环境安装指南
一. 安装apache服务器 1. 检查apache服务器是否安装 service httpd status 2. 如提示未被识别的服务,则表明组件未安装,需手动安装 yum install http ...
- shell 中>/dev/null 2>&1含义
shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 分解这个组合:“>/dev/null 2>&1” 为五 ...