D1T1:潜入行动

裸的树上DP。f[i][j][0/1][0/1]表示以i为根的子树放j个设备,根有没有放,根有没有被子树监听,的方案数。转移显然。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,mod=1e9+;
ll tmp[][][];
int n,k,cnt,u,v,sz[N],dp[N][][][],h[N],to[N<<],nxt[N<<]; void ins(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
void add(int &x,ll y){ if (x+y>=mod) x=x+y-mod; else x=x+y; } void dfs(int x,int fa){
sz[x]=; dp[x][][][]=; dp[x][][][]=;
for (int i=h[x]; i; i=nxt[i]){
int v=to[i];
if (v==fa) continue;
dfs(v,x);
int tx=min(k,sz[x]),tv=min(k,sz[v]);
rep(j,,tx) rep(a,,) rep(b,,)
tmp[j][a][b]=dp[x][j][a][b],dp[x][j][a][b]=;
rep(j,,tx){
for(int a=; a<=tv && j+a<=k; a++){
add(dp[x][j+a][][],tmp[j][][]*dp[v][a][][]%mod);
add(dp[x][j+a][][],(tmp[j][][]*dp[v][a][][]+tmp[j][][]*(dp[v][a][][]+dp[v][a][][]))%mod);
add(dp[x][j+a][][],tmp[j][][]*(dp[v][a][][]+dp[v][a][][])%mod);
add(dp[x][j+a][][],(tmp[j][][]*(dp[v][a][][]+dp[v][a][][])+tmp[j][][]*(dp[v][a][][]+dp[v][a][][])+tmp[j][][]*(dp[v][a][][]+dp[v][a][][]))%mod);
}
}
sz[x]+=sz[v];
}
} int main(){
freopen("action.in","r",stdin);
freopen("action.out","w",stdout);
scanf("%d%d",&n,&k);
rep(i,,n) scanf("%d%d",&u,&v),ins(u,v),ins(v,u);
dfs(,-);
printf("%d\n",(dp[][k][][]+dp[][k][][])%mod);
return ;
}

D1T1

D2T2:防御网络

https://blog.csdn.net/scar_lyw/article/details/80410420

首先连接环的桥边的贡献很好算,tarjan过程中可直接求出。然后对于每一个环,求出环上被选中边数的期望。
一个环被选中的边,一定是环长减去最大的一个空隙。我们枚举环上的[s,s+len]中的点被选中(一个点被选中当且仅当子图S中包含这个点或这个点连出的外向树中的点)。设DP状态dp[s][len][k]表示[s,s+len]中有点且这段的最大空隙为k的方案数。求出dp数组后贡献就很容易求得了,注意还有一个空隙是环长-len。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,mod=1e9+;
int n,m,u,v,cnt,ans,f[N],p2[N],sz[N],vis[N],fa[N];
int dp[N][],sm[N][],h[N],to[N],nxt[N],dep[N];
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } int ksm(int a,int b){
int res=;
for (; b; a=1ll*a*a%mod,b>>=)
if (b & ) res=1ll*res*a%mod;
return res;
} void calc(int s,int len,int n){
rep(i,s-,n) dp[i][]=dp[i][]=sm[i][]=sm[i][]=;
dp[s][]=sm[s][]=f[s];
rep(i,s+,n){
int l=max(s,i-len+)-;
if (i-len>=s) dp[i][]=(dp[i][]+1ll*(dp[i-len][]+dp[i-len][])*f[i])%mod;
dp[i][]=(dp[i][]+1ll*f[i]*(sm[i-][]-sm[l][]+mod))%mod;
dp[i][]=(dp[i][]+1ll*f[i]*(sm[i-][]-sm[l][]+mod))%mod;
sm[i][]=(sm[i-][]+dp[i][])%mod; sm[i][]=(sm[i-][]+dp[i][])%mod;
ans=(ans+1ll*min(i-s,n-len)*dp[i][])%mod;
}
} void solve(int u,int v){
int cur=v,lst=,tot=;
for (; cur!=u; lst=cur,cur=fa[cur])
f[++tot]=p2[sz[cur]-sz[lst]],vis[cur]=;
f[++tot]=p2[n-sz[lst]];
rep(i,,tot-) rep(j,,tot-i) calc(i,j,tot);
} void dfs(int x){
dep[x]=dep[fa[x]]+; sz[x]=;
For(i,x) if (!dep[k=to[i]]) fa[k]=x,dfs(k),sz[x]+=sz[k];
else if (dep[k]>dep[x]) solve(x,k);
} int main(){
freopen("defense.in","r",stdin);
freopen("defense.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,m) scanf("%d%d",&u,&v),add(u,v),add(v,u);
p2[]=; rep(i,,n) p2[i]=p2[i-]*2ll%mod;
rep(i,,n) p2[i]--;
dfs();
rep(i,,n) if (!vis[i]) ans=(ans+1ll*p2[sz[i]]*p2[n-sz[i]])%mod;
ans=1ll*ans*ksm(p2[n]+,mod-)%mod;
printf("%d\n",ans);
return ;
}

D2T2

D1T3:绝地反击

如果确定这个正n边形的话,二分+Dinic就好了。退火/爬山旋转正n边形即可。

正解是网络流退流,未看。

D2T1:部落战争

https://www.cnblogs.com/HocRiser/p/10268249.html

D2T2:扫地机器人

留坑。

D2T3:军训列队

显然集合后每个人的相对位置可以不改变,那么把所求的式子列出来就会发现是一些定值加上关于每个人的坐标和集合点的差的绝对值的数。拆成两部分,显然左半部分向右走,右半部分向左走。

在主席树上二分这个分界点,维护区间中点的坐标和,剩下的直接求解。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define lson ls[x],L,mid
#define rson rs[x],mid+1,R
typedef long long ll;
using namespace std; const int N=,M=;
ll c,sum[N],sm[M];
int n,Q,m,l,r,k,K,nd,a[N],rt[N],v[M],ls[M],rs[M]; void ins(int y,int &x,int L,int R,int k){
x=++nd; ls[x]=ls[y]; rs[x]=rs[y]; v[x]=v[y]+; sm[x]=sm[y]+k;
if (L==R) return;
int mid=(L+R)>>;
if (k<=mid) ins(ls[y],lson,k); else ins(rs[y],rson,k);
} int que(int x,int y,int L,int R,int k){
if (L==R){ c+=sm[x]-sm[y]; return v[x]-v[y]; }
int mid=(L+R)>>,t=v[ls[x]]-v[ls[y]];
if (k+t-<mid) return que(ls[x],ls[y],L,mid,k);
else{
c+=sm[ls[x]]-sm[ls[y]];
return v[ls[x]]-v[ls[y]]+que(rs[x],rs[y],mid+,R,k+t);
}
} int main(){
freopen("line.in","r",stdin);
freopen("line.out","w",stdout);
scanf("%d%d",&n,&Q);
rep(i,,n) scanf("%d",&a[i]),m=max(m,a[i]),sum[i]=sum[i-]+a[i];
rep(i,,n) ins(rt[i-],rt[i],,m,a[i]);
while (Q--){
scanf("%d%d%d",&l,&r,&k); c=;
int tot=que(rt[r],rt[l-],,m,k),len=r-l+;
ll s1=1ll*tot*k+1ll*tot*(tot-)/-c;
ll s2=sum[r]-sum[l-]-c-1ll*(len-tot)*k-1ll*(tot+len-)*(len-tot)/;
printf("%lld\n",s1+s2);
}
return ;
}

D2T3

JSOI2018R2题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Unix/Linux系统时间函数API

    首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...

  2. Servlet笔记1--概述

    JavaEE概述及系统架构分析: (1) JavaEE概述: (2) 系统架构分析:

  3. 利用rundll32执行程序的函数执行程序

    1.前言 无意间发现hexacorn这个国外大佬,给出了很多通过rundll32执行DLL中的函数执行程序的方法,思路很灵巧. 2.原理 rundll32加载dll 用法: rundll32 < ...

  4. 二维码扫描开源库ZXing定制化

    最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. 建议: 如果需要集成到自己的app上,而不是做一个demo,不推荐用ZXing的Android外围开 ...

  5. Linux Module框架【转】

    转自:http://www.cnblogs.com/LittleHann/p/4558719.html catalog 1. 概述 2. 使用模块 3. 插入和删除模块 4. 自动化与热插拔 5. 版 ...

  6. Win2003不显示移动硬盘、U盘解决方法

    Win2003已经识别出了“移动硬盘”,只是没有分配盘符. 解决方法:插入移动硬盘,右键单击“我的电脑”,选择“管理”,进入“计算机管理”,点击“存储”下面的“磁盘管理”.可以看到现在计算机中有两个磁 ...

  7. Python_oldboy_自动化运维之路_全栈考试(七)

    1. 计算100-300之间所有能被3和7整除的所有数之和 # -*- coding: UTF-8 -*- #blog:http://www.cnblogs.com/linux-chenyang/ c ...

  8. 你竟然在公钥中下毒!——如何在RSA公钥中添加后门

    原文:http://www.hackdig.com/?01/hack-17893.htm 分享到: 当我知道它是如何运行时,我惊得下巴都掉了.这是一个非常简单的手法,但这篇文章会颠覆你之前对RSA的看 ...

  9. 使用dos命令创建多模块Maven项目

    好吧,咱们接着上一篇博客继续用另一种方式来创建Maven项目.不过在创建之前我们应该先熟悉一些相关dos命令. 创建web项目命令: mvn archetype:generate -DgroupId= ...

  10. kickstart配置LINUX无人值守选项--rootpw

    linux kickstart rootpw密码可以使用明文,也可以使用加密过的值(密码为:IPPBXADMINROOT) 注意:在这里要使用加密过的值,否则安全性就太低了 rootpw --iscr ...