\(T1\)

传送门

解题思路

  傻逼\(dp\)。。直接\(ST\)表处理最大值\(O(n^2)\)艹过了。

代码

#include<bits/stdc++.h>

using namespace std;
const int N=10005; inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,k,a[N],f[N],Max[N][15],lg[N]; int query(int l,int r){
int t=lg[r-l+1];
return max(Max[l][t],Max[r-(1<<t)+1][t]);
} int main(){
n=rd(),k=rd();
for(int i=1;i<=n;i++) a[i]=rd(),Max[i][0]=a[i];
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);
for(int i=1;i<=n;i++)
for(int j=max(0,i-k);j<i;j++)
f[i]=max(f[i],f[j]+query(j+1,i)*(i-j));
printf("%d\n",f[n]);
return 0;
}

\(T2\)

传送门

解题思路

  傻逼容斥。。用的哈希存状态,刚开始用的取摸哈希,发现冲突率太高,\(WA\)了好几次用自然溢出过了。

代码

#include<bits/stdc++.h>

using namespace std;
const int N=50005;
const int base=66662333;
const int P=131;
typedef long long LL;
typedef unsigned long long ull; inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,a[N][7],tp[34];
LL ans;
ull hsh[N][34];
map<ull,int> mp; void prework(int x){
for(int i=1;i<(1<<5);i++){
int num=0;
for(int j=1;j<=5;j++) if((1<<(j-1))&i)
num++,hsh[x][i]=(hsh[x][i]+a[x][j])*base+P;
mp[hsh[x][i]]++;
}
} inline void calc(int x){
for(int i=1;i<(1<<5);i++){
int num=mp[hsh[x][i]];
if(num==1) continue;
mp[hsh[x][i]]=1;
ans+=1ll*tp[i]*num*(num-1)/2;
}
} int main(){
n=rd(); ans=1ll*n*(n-1)/2;
for(int i=1;i<=n;i++){
for(int j=1;j<=5;j++)
a[i][j]=rd();
sort(a[i]+1,a[i]+6);
prework(i);
}
for(int i=1;i<(1<<5);i++)
tp[i]=(__builtin_popcount(i)&1)?(-1):1;
for(int i=1;i<=n;i++) calc(i);
printf("%lld\n",ans);
return 0;
}

\(T3\)

传送门

解题思路

  似乎想了好一会,后来发现可以类似分层图最短路做,把美味值取负数做为点权,设\(dis(i)(0)\)表示没有到过干草棚最短路,\(dis(i)(1)\)表示到过干草棚最短路,转移时随便讨论一下。然后最后如果\(dis(i)(1)<=dis(i)(0)\),说明可行。

代码

#include<bits/stdc++.h>

using namespace std;
const int N=100005;
const int M=200005; inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,m,K,head[N],cnt,to[M<<1],nxt[M<<1],val[M<<1];
int dis[N][3],w[N];
bool vis[N];
queue<int> Q; inline void add(int bg,int ed,int w){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt,val[cnt]=w;
} void spfa(){
memset(dis,0x3f,sizeof(dis));
dis[n][0]=0; Q.push(n);
while(Q.size()){
int x=Q.front(); Q.pop(); vis[x]=0;
for(int i=head[x];i;i=nxt[i]){
int u=to[i];
if(dis[x][0]+val[i]<dis[u][0]){
dis[u][0]=dis[x][0]+val[i];
if(!vis[u]) Q.push(u),vis[u]=1;
}
if(w[u] && dis[x][0]+val[i]-w[u]<dis[u][1]){
dis[u][1]=dis[x][0]+val[i]-w[u];
if(!vis[u]) Q.push(u),vis[u]=1;
}
if(dis[x][1]+val[i]<dis[u][1]){
dis[u][1]=dis[x][1]+val[i];
if(!vis[u]) Q.push(u),vis[u]=1;
}
}
}
} int main(){
n=rd(),m=rd(),K=rd(); int x,y,z;
for(int i=1;i<=m;i++){
x=rd(),y=rd(),z=rd();
add(x,y,z),add(y,x,z);
}
for(int i=1;i<=K;i++) x=rd(),w[x]=max(w[x],rd());
if(w[n]) {for(int i=1;i<n;i++) puts("1"); return 0;}
spfa();
for(int i=1;i<n;i++){
if(dis[i][0]>=dis[i][1]) puts("1");
else puts("0");
}
return 0;
}

USACO2018 DEC (Gold) (dp,容斥+哈希,最短路)的更多相关文章

  1. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

  2. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  3. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

  4. [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)

    先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...

  5. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

  6. Codeforces 611C New Year and Domino DP+容斥

    "#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...

  7. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  8. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  9. CF285E Positions in Permutations(dp+容斥)

    题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k. Solution 直接dp会有很大的后效性. 所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1] ...

随机推荐

  1. IDEA工具与第三方工具集成

    IDEA工具与第三方工具集成 Tomcat部署 (一)配置Tomcat ->->->配置信息 常见问题: [1]注意部署异常:java.lang.OutOfMemoryError: ...

  2. Canvas入门02-绘制直线

    主要使用的API有: context.moveTo(x,y) 声明线的起始坐标 context.lineTo(x,y) 声明线的下一个坐标 context.fillStyle  声明线的填充颜色 co ...

  3. Docker之单多/机容器管理

    Compose是用于定义和运行多容器Docker应用程序的工具.通过Compose,您可以使用YAML文件来配置应用程序的服务.然后,使用一个命令,就可以从配置中创建并启动所有服务. Docker-C ...

  4. 发布项目到github上web服务器来运行

    $ git add dist Administrator@LuoTong- MINGW32 /D/react_workspace (master) $ git commit -m "git ...

  5. Hibernate-Criteria学习笔记

    hibernate_jpa注解 目前最新版的hibernate,5.2,底层整合了jpa,用idea的hibernate工具生成实体时,实体包含了注解的配置文件,缺一不可 如,用户类实体,生成之后是这 ...

  6. BZOJ 3810 [Coci2015]Stanovi

    这讲真就是一篇显得自己认真做题的博客 因为真的比较习惯将培训所有的题都放到一篇博客中,又因为暑假好多培训,所以单题很少,这也是从博客中摘出来的 题目链接 如果合法,一定有一条贯穿整个矩形的线: dp[ ...

  7. c语言中不允许在函数外部给全局变量赋值

    今天,在写条件编译的时候,出现了在函数外部给全局变量赋值的情况,gcc报错,那么c语言为什么不允许在函数外部给变量赋值呢?为什么声明变量的时候可以对变量进行赋值? 出错代码: /* 2 * ===== ...

  8. 19: vue项目使用整理

    1.1  axios 基本用法 安装:npm install axios -S                   # 也可直接下载axios.min.js文件 1.axios借助Qs对提交数据进行序 ...

  9. Docker 镜像的常用操作

    镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 一 Docker 下载镜像 1.1 下 ...

  10. php手动实现ip2long和long2ip

    php手动实现ip2long和long2ip /** * 测试 */ public function testipAction() { $ip = '10.58.101.175'; echo ip2l ...