难度:☆☆☆☆☆☆☆

/*
可以先考虑一维,可知 模k意义下相同的前缀和任意两个相减都是k的倍数
问题等价于统计前缀何种模k相同的数的对数。
多维的时候二维前缀和,压行或者压列,n^3可以解决。
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> #define K 1000007
#define N 400 using namespace std;
typedef long long LL;
int f[K],s[N][N]; int main()
{
freopen("rally.in", "r", stdin);
freopen("rally.out", "w", stdout);
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
scanf("%d",s[i]+j);
s[i][j]+=s[i-][j]+s[i][j-]-s[i-][j-];
if (s[i][j]<) s[i][j]+=k;
if (s[i][j]>) s[i][j]%=k;
}
LL ans=;
f[]=;
for (int l=;l<=m;l++)
for (int r=l;r<=m;r++)
{
for (int i=;i<= n;i++)
{
int sum=s[i][r]-s[i][l-];
if (sum<) sum+=k;
ans+=f[sum];f[sum]++;
}
for (int i=;i<=n;i++)
{
int sum=s[i][r]-s[i][l-];
if (sum<) sum+=k;f[sum]--;
}
}
printf("%lld\n",ans);
return ;
}

/*
树形dp可做,好难好难的样子
考虑贪心 暗点的深度排序,每次拿出未被更新的最深的点把他的k级父亲标记
然后用这个点向外扩展更新每个点距离标记点的距离
正确性显然
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 100007 using namespace std;
int head[N],q[N],f[N],fa[N];
int n,m,ans,cnt,K,t;
struct edge{
int u,v,net;
}e[N<<]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].net=head[u];head[u]=cnt;
} void bfs()
{
int he=,ta=;
q[ta++]=;fa[]=;
while(he<=ta)
{
int u=q[he++];;
for(int i=head[u];i;i=e[i].net)
{
int v=e[i].v;
if(!fa[v])
{
fa[v]=u;q[ta++]=v;
}
}
}
} void update(int u)
{
if(!f[u]) return;
for(int i=head[u];i;i=e[i].net)
{
int v=e[i].v;
if(f[v]<f[u]-)
f[v]=f[u]-,update(v);
}
} int main()
{
freopen("general.in", "r", stdin);
freopen("general.out", "w", stdout);
int x,y;
n=read();K=read();t=read();
for(int i=;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
}
bfs();
memset(f,-,sizeof f);
for(int i=n;i;i--)
{
if(f[q[i]]==-)
{
int j=q[i];
for(int k=K;k;k--) j=fa[j];
ans++;f[j]=K;
update(j);
}
}
printf("%d\n",ans);
return ;
}

这道题简直了,妙不可言!!!!!!!!!!!!!!

前方高能题解

可是...那个“比较简单的状压dp”怎么写啊......

gg

std

#include <bits/stdc++.h>
using namespace std; typedef pair<int, int> pii;
#define fir first
#define sec second
#define INF 0x3f3f3f3f
#define MAXN 40005
#define TOP 18 int n, K, m, cnt = 0;
bool a[MAXN];
int dis[18][MAXN], b[70];
pii p[18]; queue <int> q; void bfs(pii st)
{
for (int i = 0; i < MAXN; i++) dis[st.fir][i] = INF;
q.push(st.sec);
dis[st.fir][st.sec] = 0;
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i = 1; i <= m; i++)
{
if (x - b[i] >= 0 && dis[st.fir][x - b[i]] > dis[st.fir][x] + 1)
{
dis[st.fir][x - b[i]] = dis[st.fir][x] + 1;
q.push(x - b[i]);
}
if (x + b[i] <= n && dis[st.fir][x + b[i]] > dis[st.fir][x] + 1)
{
dis[st.fir][x + b[i]] = dis[st.fir][x] + 1;
q.push(x + b[i]);
}
}
}
} int dp[1 << 18]; int solve(int mask)
{
if (dp[mask] != -1) return dp[mask];
if (mask == 0) return 0;
int &ret = dp[mask];
ret = INF;
int x = 0;
while (!(mask & (1 << x))) x++;
for (int i = x + 1; i < 2 * K; i++)
if (mask & (1 << i)) ret = min(ret, solve(mask ^ (1 << x) ^ (1 << i)) + dis[x][p[i].sec]);
return ret;
} int main()
{
freopen("starlit.in", "r", stdin);
freopen("starlit.out", "w", stdout);
scanf("%d %d %d", &n, &K, &m);
for (int i = 1, x; i <= K; i++) scanf("%d", &x), a[x] = true;
for (int i = 1; i <= m; i++) scanf("%d", &b[i]);
for (int i = 0; i <= n; i++) if (a[i] != a[i + 1]) p[cnt] = pii(cnt, i), cnt++;
for (int i = 0; i < cnt; i++) bfs(p[i]);
memset(dp, -1, sizeof dp);
int ans = solve((1 << cnt) - 1);
assert(ans != INF);
printf("%d\n", ans);
return 0;
}

  

湖南集训day8的更多相关文章

  1. 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生

    题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的 ...

  2. P3900 [湖南集训]图样图森破

    P3900 [湖南集训]图样图森破 链接 分析: 感觉像个暴力. 可以枚举回文串的回文中心,即枚举一个串,枚举一个串的位置作为回文中心,然后求出这个串内的回文串的长度. 此时如果回文串两端都没有到这个 ...

  3. [日常训练]常州集训day8

    T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...

  4. bzoj 3653 [湖南集训]谈笑风生

    题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...

  5. luogu P3899 [湖南集训]谈笑风生

    传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为 ...

  6. 洛谷P3899 [湖南集训]谈笑风生(线段树合并)

    题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空 ...

  7. P3899 [湖南集训]谈笑风生

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P38 ...

  8. LG3898 [湖南集训]大新闻

    题意 题目描述 **记者弄了个大新闻,这个新闻是一个在 [0,n) 内等概率随机选择的整数,记其为 x.为了尽可能消除这个大新闻对公众造成的不良印象,我们需要在 [0,n)内找到某一个整数 y,使得 ...

  9. 【洛谷 P3899】 [湖南集训]谈笑风生 (主席树)

    题目链接 容易发现\(a,b,c\)肯定是在一条直链上的. 定义\(size(u)\)表示以\(u\)为根的子树大小(不包括\(u\)) 分两种情况, 1.\(b\)是\(a\)的祖先,对答案的贡献是 ...

随机推荐

  1. 小程序button默认样式透彻理解

    微信小程序有一个默认样式,特别是有一个外边框,虽然看起来不别扭,但是自己每次设置border:0:都不生效,写成内联的样式也不生效,后来才知道里面的边框是伪元素的边框,这里的伪元素可以理解为用css动 ...

  2. Socket中BufferedReader.readLine()的阻塞特性导致的数据无法多次发送的问题

    https://blog.csdn.net/shenpibaipao/article/details/70236657

  3. C++ Primer(第4版)-学习笔记-第5部分:高级主题

    第17章  用于大型程序的工具 异常处理 不存在数组或函数类型的异常.相反,如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,类似地,如果抛出一个函数,函数被转换为指向该函数的指针. 不要抛出 ...

  4. 洛谷——P2709 小B的询问

    P2709 小B的询问 莫队算法,弄两个指针乱搞即可 这应该是基础莫队了吧 $x^2$可以拆成$((x-1)+1)^2$,也就是$(x-1)^2+1^2+2\times (x-1)$,那么如果一个数字 ...

  5. PHP 计数排序

    计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 算法描述 找出待排序的数组中 ...

  6. Android jdbc连接mysql报错解决方案 (Communications link failure)

    最近调试安卓连接mysql真是心态爆炸,快两天才搞出来.以下整理一些常见问题. 检查manifest文件里网络权限是否打开 检查数据库IP是否有问题(包括一些沙雕错误,比如是不是在ip首或尾多了个空格 ...

  7. Shock wave

    ** shock wave thickness of shock wave is order of 1e-7 m why governed by Euler Equation? P334 shock ...

  8. Trie树 hihocoder 1014

    Trie树 hihocoder 1014 传送门 字典树的基本应用 #include<queue> #include<cmath> #include<cstdio> ...

  9. javaHttp请求,接收到的是中文乱码如何处理

    可在service()方法中加日志,看哪种不是乱码 例如,中文乱码的话,中文编码一般有 UTF-8,GBK,ISO-8859-1 加日志为 List<String> list = new ...

  10. 戏说云计算之PaaS,IaaS,SaaS

    最近我们聊到"CRM系统PAAS化",有些可能就不了解,到底什么是PAAS.云计算还有IaaS,SaaS概念,这三者之间有什么区别?今天智云通CRM系统小编用通俗易懂的例子跟大家分 ...