2020 icpc 沈阳
- 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;
}
- Kobolds and Catacombs 签到
思路:直接模拟就好,从后往前预处理后缀最小值,然后从前往后扫一遍,并维护前缀最大值,若后缀最小值比当前前缀最大值小,那么必定得把他们分成一组。
- The Witchwood 签到
- 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;
}
总结:写题时对于某些细节可以先设出来,构思好大概再去想细节。
- Rise of Shadows 数论
不会数论,先鸽了
- United in Stormwind 阅读理解、模拟
2020 icpc 沈阳相关推荐
- 2020 ICPC沈阳站-D,H
icpc好难啊,希望有生之年能拿牌ort..... D. Journey to Un'Goro (思维) 链接:https://codeforces.com/gym/103202/problem/D ...
- 2020 ICPC Macau A. Accelerator(期望,计数,分治FFT)(每日一题 21.7.6)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2020 ICPC Macau A. Accelerator(分治FFT) Problem 给定长度为 ...
- 2020 ICPC NAC
2020 ICPC NAC 题号 题目 知识点 难度 A Another Coin Weighing Puzzle B Mini Battleship C Bomas D All Kill E Gri ...
- 2018 ICPC 沈阳站
细胞色素训练3 排名:100/193 2018年ICPC沈阳站,学长在这里拿金了.听学长说开始时候很快的出了两题,排名第四,是可以进final的,然后一直没过题,直到最后封榜时候连过两题,金牌最后一名 ...
- ICPC 沈阳M - United in Stormwind SOSDP+FWT+容斥
题意: 题意是真的难懂,求题目集(0~1<<m)中满足>=k对不同的试卷,两张试卷不同当且仅当至少存在一位不同,而且该位在题目集里. n<=2e5 m<=20 思路: 我 ...
- 2021 ICPC 沈阳赛区J题 Luggage Lock
2021 ICPC 沈阳赛区J题 Luggage Lock 题意 有TTT组样例,其中每组样例为: 给定一个密码为b0b1b2b3b_0b_1b_2b_3b0b1b2b3的密码锁,已知当前密码 ...
- 21年icpc沈阳站记录
icpc沈阳站记录 2021.11.22凌晨 从昨晚紧张到辗转反侧,虽然早就做好了打铁的心理准备,但待到比赛最后一刻两道铜牌题还没出时,满脑子的不甘心.当然最后肯定铁了395/576. 11.21也就 ...
- 第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂)
第46届icpc 沈阳 J-Luggage Lock(思维 + 爆搜 / 队友玄学出法, 还没看懂) 题目来源:第46届icpc 沈阳 J-Luggage Lock 题意: 给出两个四位数的密码锁a和 ...
- The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)
题目链接The 2020 ICPC Asia Shenyang Regional Programming Contest 题目大意: 一天内有H小时,每小时M分钟,时针分针以恒定速率旋转. 现在若时针 ...
最新文章
- Oracle Study之--Oracle触发器(Trigger)
- mysql事务实现数据更新_MySql事务select for update及数据的一致性处理讲解
- shell 中的运算
- 打造基于大并发通信技术及大数据技术的O2O系统
- Java----前端验证之验证码额实现
- 机器学习算法-随机森林之理论概述
- Vue系列vue-router的配置使用(一)
- python创建树结构、求深度_Python实现二叉树的最小深度的两种方法
- Hive 复杂数据类型之map
- vue中组件间的传参
- 聚类法 人脸识别 matlab,声纹识别 快速概览 + 详细了解N:N聚类算法是如何应用的...
- 京东数科“机房巡检机器人”高价值专利荣获专利大奖
- Java入门级项目 汽车租赁系统
- 职场工作人员需不需要写日报
- SAP固定资产模块的表
- 设计模式常用的七大原则总结
- C#WinForm应用程序——简易摇号系统
- LC-3学习记录(一)
- Jmeter源码分析(二)
- VR开发-VRTK基本设置