1. ​ Journey to Un’Goro 思维+dfs

大意:有个只包含‘r,b’的长度为 n 的字符串,对于区间 [l,r] 若区间内 ‘r’ 的个数是奇数,那么称这个区间为好的区间,现在需要构造字符串,使得它的好的区间是所有字符串中最多的,输出’'好的区间‘ ’的个数,以及按字典序从小到大输出所有这样的字符串,若超过100个只需要输出100个。

思路:对于区间问题,尤其是区间计数类问题,直接做不好做的话,不妨尝试转化成前缀问题。记 sumisum_isumi​ 为 字符‘r’ 的个数的前缀和。那个对于区间 [l,r]中的 个数 即为 sumr−suml−1sum_r-sum_{l-1}sumr​−suml−1​,若使的个数为奇数,那么sumrsum_rsumr​ 、 suml−1sum_{l-1}suml−1​ 奇偶性不同。

sum0、sum1、.......sumnsum_0、sum_1、.......sum_nsum0​、sum1​、.......sumn​ 假设有 x个是奇数个,y 个是偶数个 x+y=n+1x+y=n+1x+y=n+1

好的区间的个数=xy,根据基本不等式 当 x=y,xy 取最大值

也就是说 ∣x−y∣<=1|x-y|<=1∣x−y∣<=1 又有 x+y =n+1。所以 x和y 均不会超过 (n+1)/2(上取整)。然后就可以dfs+剪枝写了。

代码如下:

#include <bits/stdc++.h>
#define rep(i,bbb,eee) for(int i=bbb;i<=eee;i++)
#define frep(i,bbb,eee) for(int i=bbb;i>=eee;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define pb push_back
#define AC signed
// #define x first
// #define y second
#define int long long
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int N=100010,M=1000000007;
int n,lim,cnt,ans;
char s[N];
void dfs(int id,int cnt1,int cnt2,int sum)
{if(cnt1>lim||cnt2>lim)return ;if(id==n){cout<<s<<"\n";cnt++;if(cnt==100)exit(0);return ;}s[id]='b';dfs(id+1,cnt1+(sum%2==0),cnt2+(sum%2),sum);s[id]='r';dfs(id+1,cnt1+(sum%2!=0),cnt2+(sum%2==0),sum+1);
}
void solve()
{cin>>n;int x=(n+1)/2,y=n+1-x;ans=x*y,lim=(n+2)/2;cout<<ans<<"\n";dfs(0,1,0,0);
}
AC main()
{ios::sync_with_stdio(false);cin.tie(0);int _=1;//cin>>_;while(_--)solve();return 0;
}
  1. Kobolds and Catacombs 签到

思路:直接模拟就好,从后往前预处理后缀最小值,然后从前往后扫一遍,并维护前缀最大值,若后缀最小值比当前前缀最大值小,那么必定得把他们分成一组。

  1. The Witchwood 签到
  2. The Boomsday Project dp

大意:给定 n,m,r 代表 n 种租车折扣卡,m个组成订单,以及不用折扣卡租车的花费。每种折扣卡有个时间限制,次数限制,和花费。求最终花费的最小值。

思路:不难看出要用dp 写,每种折扣卡既有时间限制,又有次数限制。直接状态定义的话很麻烦。我们注意到题目给出的条件:所有订单的租车次数之和是不超过3e5的,所以我们可以尝试变形下,用 a[i] 表示租第 i 次车的天数,从小到大排个序,将问题转化成线性dp。记租车的总数为 cnt。不难想出状态定义 f[i,j] 表示租前 i 次,且最后一次用了折扣卡 j 的最小花费。

接下来想想怎么状态转移。不妨令 bjb_jbj​ 表示第 j 种折扣卡当前左边界,djd_jdj​表示时间限制,cjc_jcj​表示次数限制,vjv_jvj​表示花费。

f[i,j]=min(f[i−1,j]+r,f[i−b[j],j]+vj)f[i,j]=min(f[i-1,j]+r,f[i-b[j],j]+v_j)f[i,j]=min(f[i−1,j]+r,f[i−b[j],j]+vj​)

j 都一样,显然可以省掉一维

其中 bjb_jbj​ 满足

a[bj]+dj−1>=a[i]a[b_j]+d_j-1>=a[i]a[bj​]+dj​−1>=a[i]

bj+cj−1>=ib_j+c_j-1>=ibj​+cj​−1>=i

我们知道aia_iai​ 是单调不降的,所以 bjb_jbj​ 也是单调不降的。左边界越靠左折扣卡利用越充分,所以直接从上次的左边界开始判断就行了。就可以省掉一维从头开始枚举的时间复杂度,总的时间复杂度 O(n∗cnt)O(n*cnt)O(n∗cnt)

代码如下:

#include <bits/stdc++.h>
#define int long long
#define rep(i,bbb,eee) for(int i=bbb;i<=eee;i++)
#define frep(i,bbb,eee) for(int i=bbb;i>=eee;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define pb push_back
#define AC signed
// #define x first
// #define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const int N=300010,M=1000000007;
inline int read()
{int x=0,f=1;char ch=getchar();while(!isdigit(ch)&&ch!='-')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f*x;
}
inline void print(int x)
{   if(x<0){putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
int n,m,r,f[N],a[N],b[N],cnt;
struct node{int d,k,c;
}cd[510];
void solve()
{cin>>n>>m>>r;rep(i,1,n){int d,k,c;cin>>d>>k>>c;cd[i]={d,k,c};}while(m--){int p,q;cin>>p>>q;while(q--)a[++cnt]=p;}sort(a+1,a+1+cnt);rep(i,1,n)b[i]=1;rep(i,1,cnt)f[i]=1e18;rep(i,1,cnt){f[i]=f[i-1]+r;rep(j,1,n){while(a[b[j]]+cd[j].d<=a[i]||b[j]+cd[j].k<=i)b[j]++;f[i]=min(f[i],f[b[j]-1]+cd[j].c);}}cout<<f[cnt]<<"\n";}
AC main()
{ios::sync_with_stdio(false);cin.tie(0);int _=1;//cin>>_;while(_--)solve();return 0;
}

总结:写题时对于某些细节可以先设出来,构思好大概再去想细节。

  1. Rise of Shadows 数论

不会数论,先鸽了

  1. United in Stormwind 阅读理解、模拟

2020 icpc 沈阳相关推荐

  1. 2020 ICPC沈阳站-D,H

    icpc好难啊,希望有生之年能拿牌ort..... D. Journey to Un'Goro (思维) 链接:https://codeforces.com/gym/103202/problem/D ...

  2. 2020 ICPC Macau A. Accelerator(期望,计数,分治FFT)(每日一题 21.7.6)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2020 ICPC Macau A. Accelerator(分治FFT) Problem 给定长度为 ...

  3. 2020 ICPC NAC

    2020 ICPC NAC 题号 题目 知识点 难度 A Another Coin Weighing Puzzle B Mini Battleship C Bomas D All Kill E Gri ...

  4. 2018 ICPC 沈阳站

    细胞色素训练3 排名:100/193 2018年ICPC沈阳站,学长在这里拿金了.听学长说开始时候很快的出了两题,排名第四,是可以进final的,然后一直没过题,直到最后封榜时候连过两题,金牌最后一名 ...

  5. ICPC 沈阳M - United in Stormwind SOSDP+FWT+容斥

    题意: 题意是真的难懂,求题目集(0~1<<m)中满足>=k对不同的试卷,两张试卷不同当且仅当至少存在一位不同,而且该位在题目集里. n<=2e5 m<=20 思路: 我 ...

  6. 2021 ICPC 沈阳赛区J题 Luggage Lock

    2021 ICPC 沈阳赛区J题 Luggage Lock 题意 有TTT组样例,其中每组样例为: 给定一个密码为b0b1b2b3b_0b_1b_2b_3b0​b1​b2​b3​的密码锁,已知当前密码 ...

  7. 21年icpc沈阳站记录

    icpc沈阳站记录 2021.11.22凌晨 从昨晚紧张到辗转反侧,虽然早就做好了打铁的心理准备,但待到比赛最后一刻两道铜牌题还没出时,满脑子的不甘心.当然最后肯定铁了395/576. 11.21也就 ...

  8. 第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂)

    第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂) 题目来源:第46届icpc 沈阳 J-Luggage Lock 题意: 给出两个四位数的密码锁a和 ...

  9. The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)

    题目链接The 2020 ICPC Asia Shenyang Regional Programming Contest 题目大意: 一天内有H小时,每小时M分钟,时针分针以恒定速率旋转. 现在若时针 ...

最新文章

  1. Oracle Study之--Oracle触发器(Trigger)
  2. mysql事务实现数据更新_MySql事务select for update及数据的一致性处理讲解
  3. shell 中的运算
  4. 打造基于大并发通信技术及大数据技术的O2O系统
  5. Java----前端验证之验证码额实现
  6. 机器学习算法-随机森林之理论概述
  7. Vue系列vue-router的配置使用(一)
  8. python创建树结构、求深度_Python实现二叉树的最小深度的两种方法
  9. Hive 复杂数据类型之map
  10. vue中组件间的传参
  11. 聚类法 人脸识别 matlab,声纹识别 快速概览 + 详细了解N:N聚类算法是如何应用的...
  12. 京东数科“机房巡检机器人”高价值专利荣获专利大奖
  13. Java入门级项目 汽车租赁系统
  14. 职场工作人员需不需要写日报
  15. SAP固定资产模块的表
  16. 设计模式常用的七大原则总结
  17. C#WinForm应用程序——简易摇号系统
  18. LC-3学习记录(一)
  19. Jmeter源码分析(二)
  20. VR开发-VRTK基本设置

热门文章

  1. npm全局安装和本地安装及卸载
  2. makefile文件解释
  3. 模型是如何训练出来的
  4. Linux小白进阶之克隆服务器
  5. 【Java】Java绘制UML图
  6. python基础编程(Ⅲ)
  7. 低频矢量网络分析仪(VNA)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. L1-020 帅到没朋友(两种方法)
  9. 量化交易之数据获取篇
  10. python 字符串删除首尾空格