题面:https://www.cnblogs.com/Juve/articles/11569010.html

Tourist Attractions:

暴力当然是dfs四层

优化一下,固定两个点,答案就是这两个点的度数减一相乘,在枚举第三点,减去三元环的情况

三元环可以用bitset优化

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<bitset>
#define re register
#define int long long
using namespace std;
const int MAXN=1505;
int n,ans=0,du[MAXN];
bool mp[MAXN][MAXN];
char ch[MAXN];
bitset<MAXN>b[MAXN],t;
signed main(){
scanf("%lld",&n);
for(re int i=1;i<=n;++i){
b[i].reset();
scanf("%s",ch+1);
for(re int j=1;j<=n;++j){
if(ch[j]=='1'){
b[i].set(j,1);
mp[i][j]=1;
++du[i];
}
}
}
t.reset();
for(int x=1;x<=n;++x){
for(int y=1;y<=n;++y){
if(y==x) continue;
if(mp[x][y]!=1) continue;
ans+=(du[x]-1)*(du[y]-1);
t=b[x]&b[y];
ans-=t.count();
}
}
printf("%lld\n",ans);
return 0;
}

养花:

考场上只有暴力了。。。

考虑到k只有1e5,我们考虑预处理出每一个k时的情况

我们考虑分块,预处理出每一个块内%k的最大值,查询时大段直接统计块内的,小段暴力

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int block=1e3;
const int MAXN=1e5+5;
const int N=1e5+2;
const int MAXM=1e2+5;
int n,m,a[MAXN],f[MAXN],blo[MAXN],num,mx[MAXM][MAXN];
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),blo[i]=(i-1)/block;
num=(n-1)/block;
for(int i=0;i<=num;++i){
memset(f,0,sizeof(f));
int l=i*block+1,r=min(n,(i+1)*block);
for(int j=l;j<=r;++j) f[a[j]]=a[j];
for(int j=1;j<=N;++j) f[j]=max(f[j],f[j-1]);
for(int j=1;j<=N;++j){
for(int k=0;k<=N;k+=j){
mx[i][j]=max(mx[i][j],f[min(k+j-1,N)]-k);
}
}
}
while(m--){
int l,r,k,ans=0;
scanf("%d%d%d",&l,&r,&k);
for(int i=blo[l]+1;i<blo[r];++i) ans=max(ans,mx[i][k]);
for(int i=l;i<=min(r,(blo[l]+1)*block);++i) ans=max(ans,a[i]%k);
for(int i=max(l,blo[r]*block+1);i<=r;++i) ans=max(ans,a[i]%k);
printf("%d\n",ans);
}
return 0;
}

画作:

有一个性质:在画的时候每次修改的点都是上一次修改的点的子集

不难证明猜到一个这样的结论: 存在一种最优方案使得每次操作的区
域是上一次的子集且颜色与上一次相反.
考虑归纳证明, 记 S 为当前所有操作区域的并, T 为接下来一步的操作
区域, 我们有:
1. T 与 S 有交的情况一定可以转化成 T 被 S 包含的情况.
2. T 与 S 交集为空时, 可以找一个连接 S 和 T 的集合 M 并操作 S ∪
T ∪ M , 并将之前的所有操作连接到更外的层以及外层的连接部分同时
操作, 特殊处理最外层和第二层的情况.
3. T 被 S 包含时, T 落在某个完整区域内时等价于情况二, 否则一定连
接若干个同色块, 这些块可以同时处理, 步数一定不会更劣.
知道这个结论就比较好做了, 我们可以枚举最后被修改的区域, 这时答
案就是将同色边边权当作 0, 异色边边权当作 1 后距离这个点最远的黑色点
的距离, 对所有点取最小值即可.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n,m,mp[55][55],ans=0x7fffffff;
char ch[55];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int calc(int i,int j){return (i-1)*m+j;}
bool vis[55*55];
int dis[55*55];
priority_queue< pair< pair<int,int>,pair<int,int> > >pq;
inline int dij(int st,int pp,int qq){
memset(dis,0x3f,sizeof(dis));
dis[st]=0;
memset(vis,0,sizeof(vis));
pq.push(make_pair(make_pair(-dis[st],st),make_pair(pp,qq)));
while(!pq.empty()){
pair< pair<int,int>,pair<int,int> > pa=pq.top();
pq.pop();
if(vis[pa.first.second]) continue;
vis[pa.first.second]=1;
int x=pa.second.first,y=pa.second.second;
for(int i=0;i<4;++i){
int p=x+dx[i],q=y+dy[i];
if(p<1||p>n||q<1||q>m) continue;
int w=!(mp[x][y]==mp[p][q]);
int v=calc(p,q);
if(dis[v]>dis[pa.first.second]+w){
dis[v]=dis[pa.first.second]+w;
pq.push(make_pair(make_pair(-dis[v],v),make_pair(p,q)));
}
}
}
int res=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(mp[i][j]==1) res=max(res,dis[calc(i,j)]);
}
}
return res;
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%s",ch+1);
for(int j=1;j<=m;++j){
mp[i][j]=ch[j]-'0';
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
ans=min(ans,dij(calc(i,j),i,j));
}
}
printf("%d\n",ans+1);
return 0;
}

csp-s模拟48,49 Tourist Attractions,养花,画作题解的更多相关文章

  1. csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作

    最近有点头晕........... T1 养花 考场我没想到正解,后来打的主席树,对于每个摸数查找1-(k-1),k-(2k-1)...的最大值,事实上还是很容易被卡的但是没有数据好像还比较友善, 对 ...

  2. LYDSY模拟赛day1 Tourist Attractions

    /* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...

  3. CSPS模拟 48

    ??? 分数越来越低??? T1 String Master 题目过于毒瘤,以至于我都不想改 T2 Tourist Attractions 稍微转化题意是求无向图的三角形个数 由于坚信bitset不是 ...

  4. 旅游景点 Tourist Attractions 题解

    题面在这里 再次破了纪录,连做了3天... 让我们从头来一点一点分析 1.预处理 先看题面,乍一看貌似是个图论题,有n个点m条边,给定一些必须经过的点和强制经过顺序,求一条最短路 我们发现n和m都比较 ...

  5. [CSP-S模拟测试]:Tourist Attractions(简单图论+bitset)

    题目描述 在美丽的比特镇一共有$n$个景区,编号依次为$1$到$n$,它们之间通过若干条双向道路连接.$Byteasar$慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起$4$个景区的门票费. ...

  6. [考试反思]0921csp-s模拟测试49:困顿

    太弱.还是太弱. 拉不开分差,离第一机房分数线估计还是300多分. 但是,还是要骂:XX出题人. 部分分非常少且没有意义,T1基本只有0/纯暴力20/100三个档, T2正解是n2但是n3一分不给,还 ...

  7. 2019.9.21 csp-s模拟测试49 反思总结

    没赶上昨天的考试,不过我这种人考不考都没有多少提升吧. 挺服气的一场考试,有生以来参加的最让人想笑的考试. T1:养花 取模,区间询问最大值,有点套路化的预处理答案…难点也在预处理上.容易想到分块然后 ...

  8. 解题:POI 2007 Tourist Attractions

    题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...

  9. [POI2007]Tourist Attractions

    题目大意: 给你一个$n(n\leq 2\times 10^4)$个点,$m(m\leq 2\times 10^5)$条边的带边权的连通图.其中有$k(k\leq 20)$个关键点.关键点之间有$g$ ...

随机推荐

  1. 1001CSP-S模拟测试赛后总结

    祖国七十岁生日快乐!!! 话说在国庆节这天考试…… 临时换座换到了某诺和yzh中间.两边都是大佬紧张一批. 加上迟到了两分钟,加上昨晚熬夜写实践报告,状态并不是特别好. 这套题稍简单.于是尽管我T1A ...

  2. System.String.cs

    ylbtech-System.String.cs 1.程序集 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5619 ...

  3. CSS 属性1

    CSS列表属性 list-style:列表样式,取值:none.去掉项目符号或编号前面的各种符号. CSS边框属性:每个元素都可以加边框线  border-left:左边框线.   格式:border ...

  4. ERROR 1839 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON

    从cdb上dump一个库结构,准备与本地结构做对比(可以直接compare,但速度贼慢).使用dump脚本在本地创建的时候报错 -- 导出指定库的结构 shell> mysqldump -hxx ...

  5. <day002>Selenium基本操作+unittest测试框架

    任务1:Selenium基本操作 from selenium import webdriver # 通用选择 from selenium.webdriver.common.by import By # ...

  6. netty 使用Java序列化

    SubscribeReq package com.zhaowb.netty.ch7_1; import java.io.Serializable; public class SubscribeReq ...

  7. csps模拟68d,e,f题解

    题面:https://www.cnblogs.com/Juve/articles/11655531.html 三道数据结构? d: 贪心,先按a排序,然后枚举删了前i个a值比较小的,然后在剩下的里面删 ...

  8. pytorch 入门指南

    两类深度学习框架的优缺点 动态图(PyTorch) 计算图的进行与代码的运行时同时进行的. 静态图(Tensorflow <2.0) 自建命名体系 自建时序控制 难以介入 使用深度学习框架的优点 ...

  9. QQ交流群

  10. groupBy 后附加数量和每组百分比

    SELECT i_State, n, , ) rat FROM ( SELECT * FROM ( ) n FROM planinfo GROUP BY i_State ) t1 ) s ) t